우리는 Linux 기반 벤치마킹 클러스터를 설정하고 있습니다. 각 노드는 tftp를 통해 부팅되고, 운영 체제가 로컬 RAM 드라이브에 복사되며, 벤치마크 애플리케이션에서 로컬 드라이브로 사용되는 것과 동일한 RAM 드라이브인 헤드리스, 디스크 없는 머신이 됩니다. 내 질문은 다음과 같습니다.
이 기계에는 2개의 CPU가 있고 각 CPU에는 자체 메모리 스틱이 있으며 해당 메모리 스틱으로 연결되는 4개의 메모리 채널이 있습니다(그래서 메모리 스틱은 최대 메모리 처리량을 위해 4개의 메모리 칩의 배수로 채워집니다). 램디스크가 사용하는 메모리 영역을 제어할 수 없다면 단일 채널의 한 영역에 생성되어 해당 칩의 모든 메모리를 사용할 수 있습니다. 이는 내 응용 프로그램이 실행 중일 때 메모리 뱅크에서 램디스크를 가져오는 CPU에서 실행 중인 스레드의 "로컬" 메모리의 메모리 대역폭이 다른 CPU의 스레드보다 25% 적다는 것을 의미합니다. 그럴 것이다나쁜. 따라서 램디스크가 사용하는 메모리 영역을 제어해야 합니다.
아니면 이것이 문제가 아니며 메모리 컨트롤러가 4채널 칩 사이에 연속적인 메모리 주소를 배치하는 것을 신뢰할 수 있습니까? 이는 많은 양의 메모리를 캐시로 가져올 때 메모리 대역폭을 최대화하기 때문에 의미가 있습니다.
나는 이것이 어떻게 작동하는지 모르고 약간의 깨달음을 바랐습니다 ...
답변1
램디스크 지원을 사용하고 있나요 tmpfs
?
그렇다면 이 매개변수를 사용하여 mpol
특정 NUMA 노드에 할당할 수 있습니다(커널에서는 CONFIG_NUMA를 활성화해야 합니다).
mount -t tmpfs -o size=32g,mpol=prefer:0 tmpfs /mnt/ramdisk
/mnt/ramdisk에 설치된 NUMA 노드 0에 기본 32GB 램디스크가 생성됩니다.
tmpfs에 대한 문서는 매우 훌륭합니다.https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt