후속 질문입니다다중 CPU 시스템의 dentry/inode 캐시/메모리 할당자 구성, 그러나 여기서는 다른 방식으로 질문을 제기하려고 합니다.
내 문제는 듀얼 소켓 시스템이 있고 커널 캐시(dentry/inode/버퍼)용 메모리가bank0(cpu0의 메모리 뱅크)에서 할당되어 결국 소모된다는 것입니다. 그러나 Bank1은 캐싱에 사용되지 않으므로 시스템 전체에서 사용 가능한 메모리가 많이 있습니다. 따라서 이 상태에서 메모리 할당자는 내 프로세스가 실행되는 위치에 상관없이(메모리 선호도를 설정한 경우에도) Bank1에서 메모리를 가져옵니다. 다른 뱅크에서 메모리에 액세스할 때 메모리 대기 시간이 다르기 때문에 이는 내 프로세스(다소 메모리 액세스 제한이 있고 캐시 적중률이 더 낮음)가 CPU1에서 스케줄링 실행보다 CPU0의 코어에서 예약된다는 것을 의미합니다. (각 CPU마다 하나씩 두 개의 프로세스를 예약하고 하나의 프로세스는 CPU의 모든 코어를 사용해야 합니다. 코어의 절반을 낭비하고 싶지 않습니다.)
어떤 CPU에 예약되어 있든 내 프로세스가 로컬 은행에서 메모리를 얻을 수 있도록 하려면 어떻게 해야 합니까?
커널 vm 매개변수를 사용해 보았지만 실제로는 아무것도 수행하지 않습니다. 결국 메모리의 절반은 무료입니다! 커널의 이러한 캐시는 NUMA를 전혀 고려하지 않는 것 같습니다. 나는 cgroup을 조사해 보았지만 내가 아는 한 실제로 이런 방식으로 커널을 제어할 수는 없습니다. 나는 내 문제를 해결하는 어떤 것도 찾지 못했습니다 :-(.
물론 프로세스를 시작하기 전에 모든 캐시를 삭제할 수도 있지만 이는 다소 가혹한 방법입니다. 예를 들어, 더 깔끔한 솔루션은 총 캐시 크기(예: 8GB)를 제한하는 것입니다. cpu0이 여전히 cpu1보다 약간 적은 메모리를 가지고 있는 것은 사실이지만(두 뱅크 모두 64GB를 가지고 있습니다), 그래도 견딜 수 있습니다.
어떤 제안이라도 주시면 감사하겠습니다... 감사합니다!
답변1
"NUMA 아키텍처의 커널 캐시에 무슨 일이 일어났나요?" linux-3.10에서에 의해 지배되는zone_reclaim_mode
시스템 제어영역에 메모리가 부족할 때 취할 적절한 조치를 선택할 수 있습니다.
즉, 페이지 할당자가 노드 페이지를 할당하기 전에 쉽게 재사용할 수 있는 페이지를 회수할지 또는 그 반대인지를 결정합니다. (자세한 내용은 위에 링크된 공식문서를 참고하세요)
linux-4 시대에는 기본 설정에 대한 여러 패치가 있었고 linux-5 시대에는 전역(노드 전체) 설정이 노드별 설정이 되었습니다.노드 재활용 모드.