- 장단점 및 최적화 절충 및 최적화 설정의 게시 NUMA의 NUMA 세트

HTTPS : // www.cnblogs.com/tcicy/p/10191505.html

 

  OS 계층 NUMA 닫히면 오픈 NUMA의 BIOS 층 성능, QPS 이을 15-30 %에 영향을 미친다;

  폐쇄 바이오스 레벨 누마는, NUMA 수준에 관계없이 OS가 열려있을 때, 성능에 영향을주지 않습니다. 

      : 설치 numactl은  
      설치 numactl은의 -Y #yum
      고양이 / SYS / 장치 / 시스템 /에 해당 #numastat 노드 / node0 / numastat, 시스템 / SYS / 장치 / 시스템 / 노드의 모든 메모리 노드에 관한 세부 사항 기록 / 폴더를 정보.        --hardware #numactl의   시스템의 NUMA 노드 포함

      #numactl --show 바인딩 정보보기

 

 

 

      결정함으로써 층 레드햇 가상 코어 시스템 BIOS 여부 개방 명령의 NUMA
      # 누마 그렙 -i은 / var / / 메시지는 dmesg 로그
      출력 인 경우 : NO NUMA 구성 발견 
      상기 설명이 가능하다 NUMA하지 않으면 바와 NUMA는 예를 들어, 사용 불가능하게하는, 디스플레이 : NUMA : 해시 30 사용 . 이동
      당신은 lscpu 명령 NUMA 토폴로지에 의해 기계를 볼 수 있습니다.

그들이 찾아 낼 때 numa_miss 값은 할당 전략을 조정해야 할 필요성을 나타내는 상대적으로 높다. 예를 들어, 특정 프로세스가 CPU에 바인딩과 관련, 메모리는 적중률을 향상시킬 수 있습니다.


---------------------------------------------

     CPU 블록의 복수의 기기에 존재하는 복수의 메모리가있다. 우리는 메모리 블록 메모리 청크 모든과 같다하기 전에 공유 메모리 액세스 메시지에 모든 CPU는 동일합니다. 이 널리 사용 전에 SMP 모델입니다. 그러나 프로세서로, 공유 메모리는 더 심각한 메모리 액세스 위반이 발생할 수 있으며, 메모리 액세스 병목 현상에 도달 할 경우 성능이 증가 할 수없는 경우. NUMA는 (비 균일 메모리 액세스) 이러한 환경에 모델이다. 이러한 기계는 두 개의 프로세서이며, 네 개의 메모리 블록이있다. 시스템은 두 개의 NUMA 노드가되도록 우리는 하나 개의 프로세서 및 두 개의 메모리 블록 함께하는 NUMA 노드라고 함. 물리적으로 분산 된 물리적 거리 NUMA 노드 프로세서 및 상기 메모리 블록보다 작은, 따라서 더 빠르게 액세스한다. 예를 들어,이 시스템은 프로세서 (memory1.1, memory1.2, memory2.1, memory2.2)의 2 개 개의 메모리 블록들 각각의 양측에 배치 된 두 개의 좌우 프로세서 (CPU1, CPU2) 같은 NUMA의 노드 1로 분할 될 액세스 memory2.1 빠른 memory2.2보다는 CPU1 액세스 memory1.1 및 memory1.2. 우리는 NUMA 모드를 사용할 수 있습니다 경우에 따라서이 노드에서 CPU가 그러한 효율성이 가장 높은 것으로,이 노드에서 메모리 블록을 액세스 할 수 있도록하려고합니다.

numactl은의 -m을 사용하여 프로그램을 실행하는에있는 CPU와 메모리에서 실행이 프로그램을 개발할 수있을 때 -physcpubind. 재미 CPU 토폴로지  프로그램이 하나 개의 노드 자원 비교 테이블 노드를 사용하여 여러 자원 (거의 38에와 격차의 28S)를 사용하여 테이블에. NUMA 노드에 따라서 제한된 연속은 의미가있다.

그러나, 다시, 우리는 괜찮 누마을 개발해야? --numa 트랩. SWAP의 죄와 벌 문서 누마의 문제 트랩의 이야기. 서버뿐만 아니라 메모리가 스왑의 시작 부분에 있었고, 심지어 기계 현상의 침체을 주도 것을 발견했을 때 현상이다. 프로세스는 자신의 NUMA 노드를 제한하는 메모리를 사용할 수있는 경우에, 그 빛 자체 NUMA 노드의 메모리 사용량, 그들은 다른 NUMA 노드의 메모리를 사용하지 않으며, 사용하기 시작할 때, 인해 제한 누마 가능성 스왑은 기계가 스왑을 설정되지 않은 상황을 더 악화은 직접적인 충돌이있을 수 있습니다! 그래서 당신은 제한 NUMA 노드를 취소 numactl은 --interleave = 모두를 사용할 수 있습니다.

 

요약하면 그것은 결정이 특정 사업에 따라 NUMA를 사용하는 결론을 내렸다.

응용 프로그램이 대규모 메모리를 차지합니다 경우 (하드웨어 또는 폐쇄 NUMA)에서 가장 폐쇄 된 NUMA 노드 제한을 선택해야합니다. 이 프로그램이 유용하기 때문에 기회가 누마 트랩에 걸쳐 올 것이다 때.

또한, 프로그램은 대용량 메모리를 차지하지만, 빠른 실행 시간을 필요로하지 않는 경우. 당신의 대부분은 치료 만이 NUMA 노드 접근에 대한 액세스를 제한 할 수 있습니다.

-------------------------------------------------- -------------------

커널 매개 변수는 overcommit_memory에 :

그것은 메모리 할당 전략

옵션 값 : 0,1,2.

0 : 커널 프로세스를 사용하여 사용 가능한 메모리의 충분한 공급이 있는지 확인합니다, 충분한 여유 메모리가있는 경우, 메모리 할당 할 수 있습니다 그렇지 않으면, 메모리 할당이 실패하고 오류가 응용 프로그램 프로세스에 반환됩니다.

1 : 커널에 관계없이 현재의 메모리 상태의 모든 물리적 메모리의 분포를 표시 할 수있는 것을 나타냅니다.

2 : 코어는 메모리 할당은 모든 물리적 메모리와 스왑 공간의 합을 초과 할 수있게 나타내고

커널 매개 변수는 zone_reclaim_mode :

옵션 값 0,1

A, 경우 노드는 충분한 메모리가 :

1, 0 경우, 시스템은 다른 노드에서 메모리를 할당하는 경향이

이 1 인 경우 2, 시스템은 로컬 노드의 캐시 메모리에서 대부분의 시간을 회복하는 경향이

B, 캐시 성능이 매우 중요하므로 0이 더 나은 선택이다

-------------------------------------------------- --------------------

NUMA 문제의 MongoDB를

MongoDB의 로그는 다음과 같습니다 :

경고 : 당신은 NUMA 시스템에서 실행된다.

우리는 성능 문제를 방지하기 위해 다음과 같이 mongod 시작하는 것이 좋습니다 :

numactl은 -interleave = 모든 mongod [다른 옵션]

솔루션, 일시적으로 인터리브에 대한 NUMA 메모리 할당 전략을 수정 = 모든 (모든 노드 노드에 얽혀 할당 전략)

원래 시작 명령 플러스 numactl은 -interleave = 모든 앞 (1)

如 # numactl은 --interleave = 모든 $ {MONGODB_HOME} / 빈 / mongod --config conf의 / mongodb.conf

2. 커널 매개 변수를 수정

0>은 / proc / SYS / VM / zone_reclaim_mode 에코; 에코 "vm.zone_reclaim_mode = 0">> /etc/sysctl.conf에

-------------------------------------------------- --------------------

A, NUMA 및 SMP

NUMA와 SMP는 두 개의 CPU 관련 하드웨어 아키텍처입니다. SMP 아키텍처는있는 버스의 모든 CPU 경합는 모든 메모리, 공유 자원의 활용에 액세스 할 수 있지만, 단점은 강렬한 버스 경합이다. 하여 서버 PC 증가에 CPU의 수 (CPU 코어뿐만 아니라 수), 천천히 점점 더 분명 버스 경합 과실, 인텔 네 할렘 CPU는 NUMA 아키텍처를 출시에, 그래서 AMD는 또한 동일한 아키텍처를 기반으로 출시 옵테론 CPU.

가장 큰 특징은 NUMA 노드와의 거리의 개념을 소개합니다. 이 두 가지 가장 가치있는 하드웨어 자원의 CPU와 메모리의 경우, 거의 엄격 모드와 NUMA 자원 그룹 (노드)에 속하는 분할하고, 각 그룹 내에서 CPU와 메모리 자원은 거의 동일하다. 물리적 CPU 리소스 그룹 번호의 수에 의존한다 (대부분의 종래의 PC 서버는 두 개의 물리적 CPU를 가지고, 각각의 CPU는 4 개 개의 코어를 갖는) 거리 이러한 개념은 각 호 자원 노드 사이의 비용을 정의하는 데 사용되는, 자원 스케줄링 최적화 알고리즘에 대한 데이터 지원을 제공합니다.

두, NUMA 관련 정책

도 1은, 각 프로세스 (또는 실)는 부모 프로세스에서 NUMA 정책을 상속하고, 우선 순위의 노드가 할당된다. NUMA 정책에서 허용하는 경우 프로세스는 노드에서 다른 리소스를 호출 할 수 있습니다.

2, NUMA CPU 할당 전략, physcpubind을 cpunodebind. 특정 노드에서 실행중인 특정 프로세스를 cpunodebind, 더 정밀하게되는 코어에서 실행 physcpubind 정의 할 수 있습니다.

3 NUMA 메모리 할당 전략되는 LocalAlloc, 바람직 membind 인터리브.

되는 LocalAlloc 현재 노드에서 메모리를 할당하기위한 요청을 처리를 규정;

권장 노드의 메모리가 충분하지 않은 경우가 느슨하게, 메모리를 얻기 위해 권장되는 노드를 지정 상대적으로 더 좋아, 프로세스는 다른 노드를 시도 할 수 있습니다.

membind 노드의 수를 지정할 수 있습니다 프로세스는 지정된 노드에서 메모리 요청을 할당 할 수 있습니다.

알고리즘 인터리빙 RR 복수 지정된 노드 (라운드 로빈 스케줄링 폴링)로부터 소정의 인터리브 처리가 메모리 요청을 할당한다.

 

 

NUMA 기본 메모리 할당 전략은 CPU 노드 메모리의 부족, 스왑을 생성하도록 야기 할 때 CPU 할당의 로컬 메모리, 메모리 할당이 아닌 원격 노드로부터보다 CPU 노드 사이의 불균형을 초래할 수있는 프로세스의 우선 순위이기 때문에 메모리를 할당합니다. 이러한 현상은 스왑 광기라고합니다.

MySQL은 당신의 MySQL의 단일 인스턴스를 실행, 우리는 세 가지 방법으로 폐쇄 NUMA를 해제하도록 선택할 수있는 경우 NUMA 특성에 대한 지원이 좋지 않다, 스레딩 모델을 사용합니다 :

1. 하드웨어 층, 상기 BIOS는 종료 제공된다

2.OS 코어 NUMA 배치 = 오프 시작시;

3. numactl은 명령 (크로스) 인터리브 메모리 할당 전략을 수정하는데 사용될 수있다.

단일 실행 여러 MySQL의 경우 경우, 우리는 노드에서 메모리 바인딩, 필수 할당을 사용하여 서로 다른 CPU와 메모리 할당 전략에 MySQL의 노드를 결합 할 수있는, 모두 하드웨어 NUMA 특성을 활용하기 위해, 또한 피하기 위해 MySQL의 멀티 코어 CPU 사용률의 단일 인스턴스은 높지 않다

세, NUMA 및 스왑 관계

우리는 발견 NUMA 메모리 할당 정책은, 그것은 공평하지 프로세스 (또는 스레드) 사이에있을 수 있습니다. 기존 레드햇에서는  리눅스 에서,되는 LocalAlloc이 구성 옵션은 자원 독점 프로그램이 노드 메모리가 부족하기 매우 쉽습니다 원인, 기본 NUMA 메모리 할당 전략이다. 노드가 메모리가 부족하면, 리눅스는 또한, 노드가 메모리 프로세스 (또는 스레드)를 많이 소모 할 필요에 할당 할 제대로 생산에 의한 교환 발생합니다. 이 시간이 있지만 많은 페이지 캐시는 출시, 무료 메모리도 많이 할 수 있습니다.

넷째, 문제 스왑을 해결하기 위해

NUMA의 원리는 비교적 복잡하지만, 사실, 스왑은 매우 간단 해결 : 단지 MySQL의는 NUMA 정책이 될 수 수정을 시작하기 전에 numactl은의 -interleave를 사용합니다.

그것은이 명령 만 NUMA 정책을 조정 numactl은, 각 노드의 현재 리소스 사용을 볼 수 있습니다, 주목할만한 연구 명령의 매우 가치가있다.

 

 

A, CPU는
  먼저 CPU로 시작합니다.
  당신은 흥미로운 현상에 일부 서버가있을 것입니다, 더 신중하게 확인 : 때 고양이 / proc 디렉토리 / cpuinfo의, 찾을 수 CPU 주파수도 공칭 주파수가 동일하지 말 것을 :
  #cat / proc 디렉토리 / cpuinfo의의
  프로세서 : 5
  모델 이름 : 2.00 GHz의 @ 인텔 (R) 제온 (R) CPU E5-2620 0
  는 CPU의 MHz의 : 1200.000
  이 인텔 E5-2620 CPU, 그가있는 CPU의 2.00 * 24,하지만 우리는 발견 처음 다섯의 CPU의 주파수 1.2G.
  ? 이유는
  전력 절약 모드 :이 실제로 최신 기술의 CPU에서 파생됩니다. 운영 체제 및 하드웨어 CPU, 시스템은 에너지를 저장하고 온도는 것입니다 CPU 주파수를 줄이기 위해, 바쁜 없습니다. 이것은 환경과 지구 온난화 저항에 보탬이지만, MySQL을 위해, 그것은 재앙이 될 수 있습니다.
  MySQL은 CPU 자원을 최대한 활용할 수 있도록하기 위하여, 최대 CPU 성능 모드를 설정하는 것이 좋습니다. 이 설정은 물론, BIOS에 더 철저하게, 옵션 더 나은 설정의 BIOS 및 운영 체제에서 설정할 수 있습니다. 때문에 BIOS의 여러 유형의 차이로, 최대 CPU 성능 모드가 여기에 우리가 구체적으로 설정하는 방법을 표시하지 않습니다 달라질 설정합니다.
  그리고 우리가 메모리에서 보면, 우리는 최적화 할 수 있습니다 무엇을 가지고있다.
  나는) 우리는 NUMA를 살펴 걸릴
  비 균일 메모리 액세스 : 비 균일 메모리 액세스 아키텍처 (NUMA를 ) 최신 메모리 관리 기술입니다. 그것은 대칭 멀티 프로세서 아키텍처 (SMP : 대칭 멀티 프로세서)가 해당됩니다. 이 팀은 단순히 다음을 수행합니다 :
  도시 된 바와 같이, NUMA 자세한 정보는 여기에 제시되지 않습니다. 그러나 우리는 시각적으로 볼 수 있습니다 SMP 액세스 메모리는 가격이 동일하다,하지만 NUMA 아키텍처에 로컬 및 메모리 액세스 메모리 액세스 비용은 동일하지 않습니다. 운영 체제에 대응하는 기능에있어서, 우리는 메모리 할당 프로세스를 설정할 수있다. 현재 지원되는 방법은 다음과 같습니다
  --interleave = 노드
  --membind = 노드
  --cpunodebind = 노드
  --physcpubind = CPU를
  --localalloc
  = 노드를 --preferred
  즉, 즉, 로컬 메모리 할당을 지정할 수 있습니다, 몇 CPU 할당 폴링 할당 또는 노드한다. 그것은, 즉, 폴링 분배 --interleave = 노드로 설정되어 있지 않으면, 메모리 이외는 NUMA 노드에 이러한 방식으로 할당 될 수있다. 다른 NUMA 노드의 메모리, 리눅스 남아도 메모리의 나머지 대신 메모리를 얻기 위해 SWAP 방법을 사용하는 프로세스에 할당 된 것이있는 경우에도 다른 방법입니다. 숙련 된 시스템 관리자 나 DBA는 어떻게 구덩이 아버지에 의해 발생 SWAP 데이터베이스 성능 저하를 알고있다.
  그래서 가장 쉬운 방법은, 또는이 기능을 차단합니다.
  폐쇄 속성의 방법은 각각 : BIOS, 운영 체제에서 프로세스를 시작할 때 일시적으로이 기능을 해제 할 수 있습니다.
  A) NUMA를 해제하는 방법 BIOS의 다양한 유형의 차이는 우리는 여기에 특별히하지 않는 설정하는 방법을 보여, 매우 다양합니다.
  b) 상기 운영체제에 폐쇄 바로 지난 경우 /etc/grub.conf NUMA를 첨가 할 수있다 = 오프 커널 행에서 다음과 같이
  커널 /vmlinuz-2.6.32-220.el6.x86_64 RO 루트 =는 / dev / 매퍼 / VolGroup 루트 rd_NO_LUKS LANG =은 en_US.UTF-8 rd_LVM_LV = VolGroup / 루트 rd_NO_MD 조용한 SYSFONT = latarcyrheb-sun16 rhgb의 crashkernel = 자동 rd_LVM_LV = volGroup / 스왑 rhgb의 crashkernel = 자동 조용한 KEYBOARDTYPE = PC의 테이블 변환 = 우리 rd_NO_DM 누마 = 오프
  추가로 배치 vm.zone_reclaim_mode = 0 시도가 메모리를 회수하기 위해 수 있습니다.
  NUMA 특성을 닫을 때 C)의 MySQL을 시작합니다
  numactl은이 --interleave = 모든 mysqld를
  물론, 가장 좋은 방법은 BIOS에서 꺼져 있습니다.
  II) 우리는 vm.swappiness 봐.
  vm.swappiness 운영 시스템 제어 전략은 물리적 메모리가 교환된다. 그것은 기본 값은 60이며, 0은 최소, 최대 실행 100, 값이 백분율 값입니다 수 있습니다. 0 vm.swappiness에 설정 (100)는 가능한 비활성 메모리 페이지를 스왑 아웃 표시, 스왑을 최소화 할 수 있습니다.
  특히 : 전체와 기본 메모리, 시스템이이 매개 변수에 따라 심판을 받게되면 거의 비활성 메모리, 또는 캐시 데이터 릴리스에서 스왑 메모리에서 사용되지 않습니다. 지역의 원리에 따라 프로그램에서 읽어 캐시 데이터를 디스크 캐시, 이러한 데이터는 다음에 읽을 수있을 수 있습니다, 이름에서 알 수 비활성 메모리로 매핑되는 응용 프로그램,하지만 메모리가없는 긴 시간이다.
  우리는 비활성 메모리의 수를 볼 vmstat를 사용할 수 있습니다 :
  -an 1 #vmstat의
  발동 메모리 ---------- --- ----------- ----- swap-- IO ---- --system-- - CPU ----- ----
  RB는 CS SY ID WA US ST 무연 활성 실리콘 INACT SO BI BO를 swpd
  . 1 0 0 326,928 1,704,644 27,522,384 10 0 11 0 0 153 0 0 100 0 0
  0 0 0 0 326,936 1,704,164 27,523,300 0 0 74 784 590 0 0 100 0 0
  0 0 0 27523656 326936 1,704,692,008,843,916,860 0 100 0 0
  0 0 0 27524300 (326) (916) 1703412 0 0 4,521,982,620,010,000
  을 통해 / proc 디렉토리 / 당신을 meminfo 파일 좀 더 자세한 정보를 볼 수 있습니다
  #cat / proc 디렉토리 / meminfo 파일 | 그렙 -i INACT
  비활성 : (326) 972 kB의
  비활성 (익명) : 248 킬로바이트
  비활성 (파일) : (326) 724 킬로바이트
  여기에 우리 비활성 비활성 메모리의 더 깊이있는 토론. 무료 활성 및 비활성 : 리눅스, 메모리는 세 가지 상태에있을 수있다. 우리 모두가 알다시피, 리눅스 커널 내부 등 LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE, LRU_ACTIVE_FILE으로, 메모리를 관리하기위한 LRU리스트의 많은 유지 LRU_UNEVICTABLE합니다. LRU_INACTIVE_ANON, LRU_ACTIVE_ANON 페이지를 관리하는 페이지 캐시를 캐시에 대한 익명 페이지, LRU_INACTIVE_FILE, LRU_ACTIVE_FILE을 관리하는 데 사용한다. 사용 가능한 메모리 페이지에 시간에서 활성 메모리에서 활성화됩니다 시간에 기반 시스템 커널이 비활성 목록으로 이동되고, 이러한 비활성 메모리는 갈 스왑 교환 할 수 있습니다.
  리눅스 스왑 아웃, CPU 및 IO 자원을 많이 낭비하는 경우 일반적으로, MySQL은, 이노 특히 메모리 캐시 관리에서는, 메모리가 많이 자주 사용됩니다,이 메모리 오류 메모리를 많이 사용합니다. InnoDB는 캐시 파일 데이터는 InnoDB에 거의 이익을 위해 메모리를 차지, 캐시를 관리 할 수 있습니다.
  그래서, 우리는 MySQL 서버에 더 나은 설정 vm.swappiness을 거라고 = 1 또는 0

  OS 계층 NUMA 닫히면 오픈 NUMA의 BIOS 층 성능, QPS 이을 15-30 %에 영향을 미친다;

  폐쇄 바이오스 레벨 누마는, NUMA 수준에 관계없이 OS가 열려있을 때, 성능에 영향을주지 않습니다. 

      : 설치 numactl은  
      설치 numactl은의 -Y #yum
      고양이 / SYS / 장치 / 시스템 /에 해당 #numastat 노드 / node0 / numastat, 시스템 / SYS / 장치 / 시스템 / 노드의 모든 메모리 노드에 관한 세부 사항 기록 / 폴더를 정보.        --hardware #numactl의   시스템의 NUMA 노드 포함

      #numactl --show 바인딩 정보보기

 

 

 

      결정함으로써 층 레드햇 가상 코어 시스템 BIOS 여부 개방 명령의 NUMA
      # 누마 그렙 -i은 / var / / 메시지는 dmesg 로그
      출력 인 경우 : NO NUMA 구성 발견 
      상기 설명이 가능하다 NUMA하지 않으면 바와 NUMA는 예를 들어, 사용 불가능하게하는, 디스플레이 : NUMA : 해시 30 사용 . 이동
      당신은 lscpu 명령 NUMA 토폴로지에 의해 기계를 볼 수 있습니다.

그들이 찾아 낼 때 numa_miss 값은 할당 전략을 조정해야 할 필요성을 나타내는 상대적으로 높다. 예를 들어, 특정 프로세스가 CPU에 바인딩과 관련, 메모리는 적중률을 향상시킬 수 있습니다.


---------------------------------------------

     现在的机器上都是有多个CPU和多个内存块的。以前我们都是将内存块看成是一大块内存,所有CPU到这个共享内存的访问消息是一样的。这就是之前普遍使用的SMP模型。但是随着处理器的增加,共享内存可能会导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加。NUMA(Non-Uniform Memory Access)就是这样的环境下引入的一个模型。比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用NUMA的模式如果能尽量保证本node内的CPU只访问本node内的内存块,那这样的效率就是最高的。

在运行程序的时候使用numactl -m和-physcpubind就能制定将这个程序运行在哪个cpu和哪个memory中。玩转cpu-topology 给了一个表格,当程序只使用一个node资源和使用多个node资源的比较表(差不多是38s与28s的差距)。所以限定程序在numa node中运行是有实际意义的。

但是呢,话又说回来了,制定numa就一定好吗?--numa的陷阱。SWAP的罪与罚文章就说到了一个numa的陷阱的问题。现象是当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经导致机器出现停滞的现象。这个就有可能是由于numa的限制,如果一个进程限制它只能使用自己的numa节点的内存,那么当自身numa node内存使用光之后,就不会去使用其他numa node的内存了,会开始使用swap,甚至更糟的情况,机器没有设置swap的时候,可能会直接死机!所以你可以使用numactl --interleave=all来取消numa node的限制。

 

综上所述得出的结论就是,根据具体业务决定NUMA的使用。

如果你的程序是会占用大规模内存的,你大多应该选择关闭numa node的限制(或从硬件关闭numa)。因为这个时候你的程序很有几率会碰到numa陷阱。

另外,如果你的程序并不占用大内存,而是要求更快的程序运行时间。你大多应该选择限制只访问本numa node的方法来进行处理。

---------------------------------------------------------------------

内核参数overcommit_memory :

它是 内存分配策略

可选值:0、1、2。

0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2:表示内核允许分配超过所有物理内存和交换空间总和的内存

内核参数zone_reclaim_mode:

可选值0、1

a、当某个节点可用内存不足时:

1、如果为0的话,那么系统会倾向于从其他节点分配内存

2、如果为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候

b、Cache对性能很重要,所以0是一个更好的选择

----------------------------------------------------------------------

mongodb的NUMA问题

mongodb日志显示如下:

WARNING: You are running on a NUMA machine.

We suggest launching mongod like this to avoid performance problems:

numactl –interleave=all mongod [other options]

解决方案,临时修改numa内存分配策略为 interleave=all (在所有node节点进行交织分配的策略):

1.在原启动命令前面加numactl –interleave=all

如# numactl --interleave=all ${MONGODB_HOME}/bin/mongod --config conf/mongodb.conf

2.修改内核参数

echo 0 > /proc/sys/vm/zone_reclaim_mode ; echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf

----------------------------------------------------------------------

一、NUMA和SMP

NUMA和SMP是两种CPU相关的硬件架构。在SMP架构里面,所有的CPU争用一个总线来访问所有内存,优点是资源共享,而缺点是总线争用激烈。随着PC服务器上的CPU数量变多(不仅仅是CPU核数),总线争用的弊端慢慢越来越明显,于是Intel在Nehalem CPU上推出了NUMA架构,而AMD也推出了基于相同架构的Opteron CPU。

NUMA最大的特点是引入了node和distance的概念。对于CPU和内存这两种最宝贵的硬件资源,NUMA用近乎严格的方式划分了所属的资源组(node),而每个资源组内的CPU和内存是几乎相等。资源组的数量取决于物理CPU的个数(现有的PC server大多数有两个物理CPU,每个CPU有4个核);distance这个概念是用来定义各个node之间调用资源的开销,为资源调度优化算法提供数据支持。

二、NUMA相关的策略

1、每个进程(或线程)都会从父进程继承NUMA策略,并分配有一个优先node。如果NUMA策略允许的话,进程可以调用其他node上的资源。

2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在某几个node之上,而physcpubind可以更加精细地规定运行在哪些核上。

3、NUMA的内存分配策略有localalloc、preferred、membind、interleave。

localalloc规定进程从当前node上请求分配内存;

而preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的node。

membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。

interleave规定进程从指定的若干个node上以RR(Round Robin 轮询调度)算法交织地请求分配内存。

 

 

因为NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会导致CPU节点之间内存分配不均衡,当某个CPU节点的内存不足时,会导致swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。

MySQL采用了线程模式,对于NUMA特性的支持并不好,如果单机只运行一个MySQL实例,我们可以选择关闭NUMA,关闭的方法有三种:

1.硬件层,在BIOS中设置关闭

2.OS内核,启动时设置numa=off;

3.可以用numactl命令将内存分配策略修改为interleave(交叉)。

如果单机运行多个MySQL实例,我们可以将MySQL绑定在不同的CPU节点上,并且采用绑定的内存分配策略,强制在本节点内分配内存,这样既可以充分利用硬件的NUMA特性,又避免了单实例MySQL对多核CPU利用率不高的问题

三、NUMA和swap的关系

可能大家已经发现了,NUMA的内存分配策略对于进程(或线程)之间来说,并不是公平的。在现有的Redhat Linux中,localalloc是默认的NUMA内存分配策略,这个配置选项导致资源独占程序很容易将某个node的内存用尽。而当某个node的内存耗尽时,Linux又刚好将这个node分配给了某个需要消耗大量内存的进程(或线程),swap就妥妥地产生了。尽管此时还有很多page cache可以释放,甚至还有很多的free内存。

四、解决swap问题

虽然NUMA的原理相对复杂,实际上解决swap却很简单:只要在启动MySQL之前使用numactl –interleave来修改NUMA策略即可。

值得注意的是,numactl这个命令不仅仅可以调整NUMA策略,也可以用来查看当前各个node的资源使用情况,是一个很值得研究的命令。

 

 

一、CPU
  首先从CPU说起。
  你仔细检查的话,有些服务器上会有的一个有趣的现象:你cat /proc/cpuinfo时,会发现CPU的频率竟然跟它标称的频率不一样:
  #cat /proc/cpuinfo
  processor : 5
  model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
  cpu MHz : 1200.000
  这个是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我们发现第5颗CPU的频率为1.2G。
  这是什么原因呢?
  这些其实都源于CPU最新的技术:节能模式。操作系统和CPU硬件配合,系统不繁忙的时候,为了节约电能和降低温度,它会将CPU降频。这对环保人士和抵制地球变暖来说是一个福音,但是对MySQL来说,可能是一个灾难。
  为了保证MySQL能够充分利用CPU的资源,建议设置CPU为最大性能模式。这个设置可以在BIOS和操作系统中设置,当然,在BIOS中设置该选项更好,更彻底。由于各种BIOS类型的区别,设置为CPU为最大性能模式千差万别,我们这里就不具体展示怎么设置了。
  然后我们看看内存方面,我们有哪些可以优化的。
  i) 我们先看看numa
  非一致存储访问结构 (NUMA : Non-Uniform Memory Access) 也是最新的内存管理技术。它和对称多处理器结构 (SMP : Symmetric Multi-Processor) 是对应的。简单的队别如下:
  如图所示,详细的NUMA信息我们这里不介绍了。但是我们可以直观的看到:SMP访问内存的都是代价都是一样的;但是在NUMA架构下,本地内存的访问和非 本地内存的访问代价是不一样的。对应的根据这个特性,操作系统上,我们可以设置进程的内存分配方式。目前支持的方式包括:
  --interleave=nodes
  --membind=nodes
  --cpunodebind=nodes
  --physcpubind=cpus
  --localalloc
  --preferred=node
  简而言之,就是说,你可以指定内存在本地分配,在某几个CPU节点分配或者轮询分配。除非 是设置为--interleave=nodes轮询分配方式,即内存可以在任意NUMA节点上分配这种方式以外。其他的方式就算其他NUMA节点上还有内 存剩余,Linux也不会把剩余的内存分配给这个进程,而是采用SWAP的方式来获得内存。有经验的系统管理员或者DBA都知道SWAP导致的数据库性能 下降有多么坑爹。
  所以最简单的方法,还是关闭掉这个特性。
  关闭特性的方法,分别有:可以从BIOS,操作系统,启动进程时临时关闭这个特性。
  a) 由于各种BIOS类型的区别,如何关闭NUMA千差万别,我们这里就不具体展示怎么设置了。
  b) 在操作系统中关闭,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:
  kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM  numa=off
  另外可以设置 vm.zone_reclaim_mode=0尽量回收内存。
  c) 启动MySQL的时候,关闭NUMA特性:
  numactl --interleave=all mysqld
  当然,最好的方式是在BIOS中关闭。
  ii) 我们再看看vm.swappiness。
  vm.swappiness是操作系统控制物理内存交换出去的策略。它允许的值是一个百分比的值,最小为0,最大运行100,该值默认为60。vm.swappiness设置为0表示尽量少swap,100表示尽量将inactive的内存页交换出去。
  具体的说:当内存基本用满的时候,系统会根据这个参数来判断是把内存中很少用到的inactive 内存交换出去,还是释放数据的cache。cache中缓存着从磁盘读出来的数据,根据程序的局部性原理,这些数据有可能在接下来又要被读 取;inactive 内存顾名思义,就是那些被应用程序映射着,但是 长时间 不用的内存。
  我们可以利用vmstat看到inactive的内存的数量:
  #vmstat -an 1
  procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
  r b swpd free inact active si so bi bo in cs us sy id wa st
  1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0
  0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0
  0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0
  0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0
  通过/proc/meminfo 你可以看到更详细的信息:
  #cat /proc/meminfo | grep -i inact
  Inactive: 326972 kB
  Inactive(anon): 248 kB
  Inactive(file): 326724 kB
  여기에 우리 비활성 비활성 메모리의 더 깊이있는 토론. 무료 활성 및 비활성 : 리눅스, 메모리는 세 가지 상태에있을 수있다. 우리 모두가 알다시피, 리눅스 커널 내부 등 LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE, LRU_ACTIVE_FILE으로, 메모리를 관리하기위한 LRU리스트의 많은 유지 LRU_UNEVICTABLE합니다. LRU_INACTIVE_ANON, LRU_ACTIVE_ANON 페이지를 관리하는 페이지 캐시를 캐시에 대한 익명 페이지, LRU_INACTIVE_FILE, LRU_ACTIVE_FILE을 관리하는 데 사용한다. 사용 가능한 메모리 페이지에 시간에서 활성 메모리에서 활성화됩니다 시간에 기반 시스템 커널이 비활성 목록으로 이동되고, 이러한 비활성 메모리는 갈 스왑 교환 할 수 있습니다.
  리눅스 스왑 아웃, CPU 및 IO 자원을 많이 낭비하는 경우 일반적으로, MySQL은, 이노 특히 메모리 캐시 관리에서는, 메모리가 많이 자주 사용됩니다,이 메모리 오류 메모리를 많이 사용합니다. InnoDB는 캐시 파일 데이터는 InnoDB에 거의 이익을 위해 메모리를 차지, 캐시를 관리 할 수 있습니다.
  그래서, 우리는 MySQL 서버에 더 나은 설정 vm.swappiness을 거라고 = 1 또는 0

추천

출처www.cnblogs.com/jinanxiaolaohu/p/11420751.html