대규모 메모리 세그먼트를 공유하는 여러 프로세스의 실제 메모리 사용량 확인

대규모 메모리 세그먼트를 공유하는 여러 프로세스의 실제 메모리 사용량 확인

방금 top의 출력을 살펴보았는데 다음과 같은 결과가 나에게 표시되었습니다(및 기타 프로세스).

위에서 출력

보시다시피 10개의 프로세스가 있고 각 프로세스는 약 10GB를 소비하므로 총 100GB가 됩니다. 그러나 맨 위 두 번째 행에서 볼 수 있듯이 컴퓨터에는 64GB RAM만 있습니다. 현재 약 22GB가 사용되고 있습니다.

이제 문제는 test_mpi.out 프로세스가 서로 많은 공유 메모리를 사용한다는 것입니다. 소스코드가 있어서 실제 메모리 사용량은 10GB 정도 되는 것으로 알고 있습니다.

컴퓨터는 유휴 상태에서 약 12GB의 메모리를 소비하므로 보고된 총 메모리는 22GB입니다.

내가 이해하지 못하는 것은 실제로 22GB의 메모리만 사용된다는 것을 top이 어떻게 아는지입니다. 이는 표시된 모든 열(VIRT, RES 및 SHR)을 기반으로 맨 위에서 명확하지 않아야 합니다. 누군가가 이것에 대해 밝힐 수 있다면 좋을 것입니다.

편집: Redhat Linux에서 실행 중

편집: Michael Homer 덕분에 이제 top이 /proc/meminfo에서 이 정보를 얻는다는 것을 알게 되었습니다. 그러나 나는 모든 test_mpi.out 프로세스가 총 10GB만 소비한다는 것을 어떻게 결정했는지 설명하는 답변을 갖고 싶습니다(순진하게 top의 출력을 추가하여 제안된 100GB 대신). /proc/PID/status를 살펴보았지만 큰 메모리 세그먼트를 공유하는 여러 프로세스의 실제 메모리 사용량을 확인하는 방법에 대한 단서를 찾지 못했습니다(소스 코드가 없는 경우).

답변1

SHR이 열에 표시된 메모리 양이 와 동일하다는 것을 알 수 있습니다 RES. 이는 이 특정 작업에 대한 상주 메모리가 실제로 100% 공유 메모리 세그먼트로 구성되어 있음을 의미합니다. 하지만 그럼에도 불구하고 RES페이지 아웃되지 않는 메모리 양이 얼마나 되는지 잘 알 수 없습니다 .

프로세스의 실제 메모리 소비량을 파악하려면 선택 필드 사용과 같은 보다 현명한 접근 방식을 사용해 보십시오 ( 옵션 및 매뉴얼 섹션 ps(1)확인 ).-oSTANDARD FORMAT SPECIFIERS

필드(매우 대략적인 추정) 를 제외하면 size메모리 측면에서 프로세스의 전체 크기를 액면 그대로 정확하게 평가하기가 어렵습니다. 메모리 중 일부가 다른 프로세스와 공유될 수 있고 우리가 이를 알 수 없기 때문입니다. 얼마나 많은 페이지가 더티인지 직접적으로 알 수 있습니다( NOTES맨 페이지의 단락과 해당 섹션의 맨 페이지 참조).SIZERSS

실제로 어떤 프로세스를 사용하고 있는지 알 수 있습니다.동일한ipcs(1)공유 메모리 세그먼트의 경우 명령의 출력을 살펴보고 nattch어떤 공유 메모리 세그먼트에 의심스러운 수의 프로세스가 있는지 확인해야 합니다.

그런 다음 해당 세그먼트의 세부 정보를 확인해야 하며 ipcs -m -i <id>여기에 연결된 실제 프로세스가 표시됩니다.

이것이 너무 복잡해 보인다면 도전 과제로 생각하십시오. 프로세스 ID가 주어지면 해당 프로세스에 연결된 SHM ID 목록과 해당 SHM ID를 공유하는 PID 목록을 인쇄하는 스크립트를 작성하십시오. ;)

관련 정보