Linux 시스템에서 NUMA 노드 메모리를 비활성화하는 방법

Linux 시스템에서 NUMA 노드 메모리를 비활성화하는 방법

특정 NUMA 노드/소켓과 연결된 메모리에 대한 액세스를 비활성화하는 방법이 있습니까?누마기계?

우리는 HP DL560 시스템과 관련하여 데이터베이스 공급업체와 일부 분쟁을 겪고 있습니다. DB 영업형 기술 지원 담당자는 우리가 DL560을 사용할 수 없고 슬롯이 적기 때문에 새 DL360을 구입해야 한다는 사실에 기뻐했습니다. 나는 그들이 소켓 사이의 메모리 액세스 속도에 관심이 있다고 생각합니다. 그들은 제가 DL560을 계속 유지하려면 슬롯 두 개를 비워 두어야 한다고 제안했습니다. 나는 그들이 틀렸다고 생각하지만(일명 미친) 내 입장이 확고하다는 것을 증명하려면 테스트가 필요합니다.

내 구성:
머신에는 4개의 소켓이 있고, 각 소켓에는 22개의 하이퍼 스레드 물리적 코어, 총 176개의 겉보기 코어, 총 1.5T의 메모리가 있습니다. 운영 체제는 Red Hat Enterprise Linux Server 버전 7.4입니다.

lscpu는 다음 내용(부분)을 표시합니다.

$ lscpu | egrep 'NUMA|ore'
Thread(s) per core:    2
Core(s) per socket:    22
NUMA node(s):          4
NUMA node0 CPU(s):     0-21,88-109
NUMA node1 CPU(s):     22-43,110-131
NUMA node2 CPU(s):     44-65,132-153
NUMA node3 CPU(s):     66-87,154-175

물리적 하드웨어에 액세스할 수 있다면 요점을 증명하기 위해 두 소켓 모두에서 프로세서를 꺼내는 것을 고려할 수 있지만 하드웨어에 액세스할 수 있는 권한이나 권한이 없습니다.

차선책은 운영 체제를 사용하여 소켓을 가상으로 비활성화하는 것입니다. 나는 이것을 읽었다협회이를 사용하여 프로세서 서비스를 중지할 수 있습니다.

echo 0 > /sys/devices/system/cpu/cpu3/online

프로세서가 작동을 멈췄다는 사실은 메모리에 대해 아무 의미도 없습니다.

방금 소켓 #3의 모든 프로세서를 닫았습니다. lscpu를 사용하여 소켓 #3의 프로세서를 찾으세요.

for num in {66..87} {154..175}
do
    echo 0 > /sys/devices/system/cpu/cpu${num}/online
    cat /sys/devices/system/cpu/cpu${num}/online
done

그리고 얻다:

$ grep N3 /proc/$$/numa_maps
7fe5daa79000 default file=/usr/lib64/libm-2.17.so mapped=16 mapmax=19 N3=16 kernelpagesize_kB=4

이 기사를 올바르게 읽고 있다면 현재 프로세스가 소켓 #3의 메모리를 사용하고 있음을 나타냅니다. 프로세서를 종료할 때를 제외하면 쉘은 이미 실행 중입니다.

새로운 프로세스를 시작하면 메모리를 잡아먹으려고 최선을 다합니다.

$cat/proc/18824/numa_maps 쿼리 N3 |

처음에는 레코드가 반환되지 않지만 오랫동안 메모리를 소비한 후 노드 3에서 메모리를 사용하기 시작합니다.

노드 0,1,2를 사용하여 프로그램을 실행하고 노드 0,1,2에 바인딩하려고 시도했는데 numactl예상대로 작동했습니다. 공급업체의 소프트웨어를 제어할 수 없고 Linux에서 0을 사용하는 규정이 없다는 점만 제외하면, 1,2는 다른 프로세스 set_mempolicy에서 사용되는 서비스를 설정하기 위해 이를 수행합니다 numactl.

프로세서를 물리적으로 제거하는 것 외에 이 문제를 강제로 발생시킬 수 있는 방법이 있습니까?

답변1

나는 그들이 소켓 사이의 메모리 액세스 속도에 관심이 있다고 생각합니다. 그들은 제가 DL560을 계속 유지하려면 슬롯 두 개를 비워 두어야 한다고 제안했습니다.

이는 QPI 또는 UPI 링크 수 및 Intel 확장성과 관련이 있습니다(Xeon을 언급하셨기 때문에).NCPU가 4S, S4S, S8S인지 여부. 그러나 슬롯이 4개 있다는 사실은 합리적인 속도(S4S가 4S보다 빠르다)로 어디에서나 RAM에 액세스할 수 있다는 것을 의미하지만, 이 수준에서 최악의 경우에는 디스크 또는 디스크 크기 순서에 액세스하는 것보다 몇 배 더 빠릅니다. 다른 유형의 PCIe 스토리지.

4소켓 시스템의 CPU 0, 1, 2 또는 3의 특정 코어에서 실행되는 특정 프로세스의 경우, 가장 빠른 RAM 액세스는 해당 CPU의 메모리 컨트롤러에 있는 RAM 칩 풀에 대한 것입니다. 해당 RAM에 액세스하기 전에 다른 CPU에 대한 QPI/UPI 링크를 건너뛰어야 한다면 다음과 같습니다.느리게설마최고. 하지만 먼저 공유 RAM이 충분하지 않다는 점을 고려하여 이 모든 것을 평가해야 합니다.

예, 이 문제를 강제로 해결할 수 있는 방법이 있습니다.

중앙 처리 유닛- 프로세스를 프로세서 및 메모리 노드의 하위 집합으로 제한합니다.

cpuset 파일 시스템은 프로세스의 프로세서 배치와 메모리 배치를 제어하는 ​​데 사용되는 커널 cpuset 메커니즘에 대한 의사 파일 시스템 인터페이스입니다. 일반적으로 /dev/cpuset에 설치됩니다.

답변2

cgroups를 사용해 보고 CPU 소켓을 그룹으로 정의하고 cgrules(cgred, cgoups 규칙 엔진 데몬)를 사용하여 프로세스를 그룹에 할당해 보세요. 하지만 먼저 Linux에서는 Numa 정책을 사용하여 프로세스와 메모리가 할당됩니다. 기본 전략은 프로세스가 실행 중인 CPU 소켓에 프로세스의 메모리를 배치하는 것입니다. 더 많은 메모리가 필요할 때마다 디스크 스왑 공간을 사용하지 않고 다른 Numa 노드의 메모리를 사용하는 것이 더 낫다는 점에 유의하세요.

답변3

이 프로그램은 프로세스가 이미 실행된 후에 사용됩니다.

taskset- 프로세스의 CPU 선호도 설정 또는 검색

tasket 명령은 지정된 pid에 대해 실행 중인 프로세스의 CPU 선호도를 설정 또는 검색하거나, 지정된 CPU 선호도로 새 명령을 시작하는 데 사용됩니다. CPU 선호도는 프로세스를 시스템의 특정 CPU 집합에 "바인딩"하는 스케줄러 속성입니다. Linux 스케줄러는 지정된 CPU 선호도를 존중하며 프로세스는 다른 CPU에서 실행되지 않습니다.

...다른 사용자에게 속한 프로세스를 변경하려면 사용자에게 CAP_SYS_NICECPU 선호도가 있어야 합니다. 사용자는 모든 프로세스에 대한 상관 마스크를 검색할 수 있습니다.

http://manpages.ubuntu.com/manpages/jammy/man1/taskset.1.html

관련 정보