이 기사는 Linux의 Numa 아키텍처에 대한 관련 지식을 제공하는 데 도움이 되기를 바랍니다.
다음 사례는 Ubuntu 16.04 기준이며, 다른 Linux 시스템에도 적용 가능합니다. 제가 사용한 케이스 환경은 다음과 같습니다.
머신 구성: 32 CPU, 64GB 메모리
1) 프로세서 레이어: 프로세서 레이어라고 불리는 단일 물리적 코어. 2) 로컬 노드 계층: 노드의 모든 프로세서에 대해 이 노드를 로컬 노드라고 합니다. 3) 홈 노드 계층: 로컬 노드에 인접한 노드를 홈 노드라 한다. 4) 원격 노드 계층: 로컬 노드나 이웃 노드가 아닌 노드를 원격 노드라고 합니다. 다양한 유형의 노드의 메모리에 액세스하는 CPU 속도는 다릅니다. 로컬 노드에 액세스하는 속도는 가장 빠르며, 원격 노드에 액세스하는 속도는 가장 느립니다. 즉, 액세스 속도는 노드의 거리와 관련됩니다. 거리가 멀수록 액세스 속도가 느려집니다. 이 거리를 For Node Distance라고 합니다. 애플리케이션은 서로 다른 CPU 모듈 간의 상호 작용을 최소화하도록 노력해야 합니다. 애플리케이션을 CPU 모듈에서 수정할 수 있으면 애플리케이션의 성능이 크게 향상됩니다.
** Kunpeng 920 프로세서를 사용하는 CPU 칩의 구성에 대해 이야기해 보겠습니다. ** Kunpeng 920 프로세서 시스템 온 칩의 각 슈퍼 코어 클러스터에는 6개의 코어 클러스터, 2개의 I/O 클러스터 및 4개의 DDR 컨트롤러가 포함되어 있습니다. 각 슈퍼 코어 클러스터는 CPU 칩에 패키지되어 있습니다. 각 칩은 최대 3200MT/s의 데이터 전송 속도를 갖춘 4개의 72비트(64비트 데이터 + 8비트 ECC) 고속 DDR4 채널을 통합합니다. 단일 칩은 최대 512GB×4 DDR 저장 공간을 지원할 수 있습니다. L3 캐시는 물리적으로 L3 캐시 TAG와 L3 캐시 데이터의 두 부분으로 나뉩니다. L3 캐시 TAG는 각 코어 클러스터에 통합되어 청취 대기 시간을 줄입니다. L3 Cache DATA는 온칩 버스에 직접 연결됩니다. Hydra Root Agent(Hydra Home Agent, HHA)는 멀티 칩 시스템의 캐시 일관성 프로토콜을 처리하는 모듈입니다. POE_ICL은 일반적으로 패킷 시퀀서, 메시지 큐, 메시지 배포로 사용되거나 프로세서 코어의 특정 작업을 구현하는 데 사용할 수 있는 시스템 구성 하드웨어 가속기입니다. 또한 각 슈퍼 코어 클러스터는 ARM의 GICv4 사양과 호환되는 GICD(Generic Interrupt Controller Distributor) 모듈로 물리적으로 구성됩니다. 단일 칩 또는 다중 칩 시스템에 여러 슈퍼 코어 클러스터가 있는 경우 시스템 소프트웨어에는 하나의 GICD만 표시됩니다.
Linux에서는 수동 조정 명령인 numactl을 제공합니다(기본적으로 설치되지 않음). Ubuntu에서의 설치 명령은 다음과 같습니다.
sudo apt install numactl -y
우선 man numactl 또는 numactl을 통해 알아볼 수 있습니다. --h 매개변수의 기능과 출력 내용입니다. 시스템의 Numa 상태를 확인하십시오:
numactl --hardware
다음을 실행하여 얻은 결과:
available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 16047 MB node 0 free: 3937 MB node 1 cpus: 8 9 10 11 12 13 14 15 node 1 size: 16126 MB node 1 free: 4554 MB node 2 cpus: 16 17 18 19 20 21 22 23 node 2 size: 16126 MB node 2 free: 8403 MB node 3 cpus: 24 25 26 27 28 29 30 31 node 3 size: 16126 MB node 3 free: 7774 MB node distances: node 0 1 2 3 0: 10 20 20 20 1: 20 10 20 20 2: 20 20 10 20 3: 20 20 20 10
이 그림과 명령에서 얻은 결과에 따르면 이 시스템에는 총 4개의 노드가 있음을 알 수 있습니다. , 각각 8개의 CPU와 16G 메모리를 수신합니다. 여기서 주목해야 할 점은 CPU가 공유하는 L3 캐시도 자체적으로 해당 공간을 받게 된다는 점입니다. numastat 명령을 통해 Numa 상태를 확인할 수 있습니다. 반환 값 내용:
numa_hit: 이 노드에 메모리를 할당하기 위한 것이며, 이 노드에서 할당된 횟수입니다. 이 노드에 메모리를 할당했지만 최종적으로 다른 노드에서 할당되었습니다. 할당 횟수
numa_foreign: 다른 노드에 할당하려고 할 때 이 노드에서 메모리가 할당된 횟수입니다. interleave_hit: 인터리브 전략을 사용하여 이 노드에서 메모리를 할당한 횟수
local_node: 이 노드의 프로세스가 이 노드에서 할당된 횟수 해당 노드에 할당된 횟수
other_node: 횟수입니다. 다른 노드 프로세스는 노드에 할당됩니다
참고: numa_miss 값이 상대적으로 높은 것으로 확인되면 할당 전략을 조정해야 함을 의미합니다. 예를 들어 지정된 프로세스 연결이 지정된 CPU에 바인딩되어 메모리 적중률이 향상됩니다.
root@ubuntu:~# numastat node0 node1 node2 node3 numa_hit 19480355292 11164752760 12401311900 12980472384 numa_miss 5122680 122652623 88449951 7058 numa_foreign 122652643 88449935 7055 5122679 interleave_hit 12619 13942 14010 13924 local_node 19480308881 11164721296 12401264089 12980411641 other_node 5169091 122684087 88497762 67801
NUMA 메모리 할당 전략
--localalloc 또는 -l: 프로세스가 로컬 노드에서 메모리 할당을 요청하도록 지정합니다. --membind=nodes 또는 -m 노드: 프로세스가 지정된 노드에서만 메모리 할당을 요청할 수 있도록 지정합니다. --preferred=node: 메모리 확보를 위해 권장 노드를 지정합니다. 획득에 실패하면 다른 노드를 시도하세요. --interleave=nodes 또는 -i 노드: 프로세스가 라운드 로빈 알고리즘을 사용하여 지정된 노드에서 메모리 할당을 인터리브 방식으로 요청하도록 지정합니다.
numactl --interleave=all mongod -f /etc/mongod.conf
因为NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会导致CPU节点之间内存分配不均衡,当开启了swap,某个CPU节点的内存不足时,会导致swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。或导致性能急剧下降。所以在运维层面,我们也需要关注NUMA架构下的内存使用情况(多个内存节点使用可能不均衡),并合理配置系统参数(内存回收策略/Swap使用倾向),尽量去避免使用到Swap。
Node->Socket->Core->Processor
随着多核技术的发展,将多个CPU封装在一起,这个封装被称为插槽Socket;Core是socket上独立的硬件单元;通过intel的超线程HT技术进一步提升CPU的处理能力,OS看到的逻辑上的核Processor数量。
Socket = Node
Socket是物理概念,指的是主板上CPU插槽;Node是逻辑概念,对应于Socket。
Core = 物理CPU
Core是物理概念,一个独立的硬件执行单元,对应于物理CPU;
Thread = 逻辑CPU = Processor
Thread是逻辑CPU,也就是Processo
lscpu的使用
显示格式:
Architecture:架构
CPU(s):逻辑cpu颗数
Thread(s) per core:每个核心线程,也就是指超线程
Core(s) per socket:每个cpu插槽核数/每颗物理cpu核数
CPU socket(s):cpu插槽数
L1d cache:级缓存(google了下,这具体表示表示cpu的L1数据缓存)
L1i cache:一级缓存(具体为L1指令缓存)
L2 cache:二级缓存
L3 cache:三级缓存
NUMA node0 CPU(s) :CPU上的逻辑核,也就是超线程
执行lscpu,结果部分如下:
root@ubuntu:~# lscpu Architecture: x86_64 CPU(s): 32 Thread(s) per core: 1 Core(s) per socket: 8 Socket(s): 4 L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0-7 NUMA node1 CPU(s): 8-15 NUMA node2 CPU(s): 16-23 NUMA node3 CPU(s): 24-31
相关推荐:《Linux视频教程》
위 내용은 Linux의 Numa 아키텍처에 대해 이야기해 보겠습니다. (그림과 텍스트로 자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!