방금 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)
확인 ).-o
STANDARD FORMAT SPECIFIERS
필드(매우 대략적인 추정) 를 제외하면 size
메모리 측면에서 프로세스의 전체 크기를 액면 그대로 정확하게 평가하기가 어렵습니다. 메모리 중 일부가 다른 프로세스와 공유될 수 있고 우리가 이를 알 수 없기 때문입니다. 얼마나 많은 페이지가 더티인지 직접적으로 알 수 있습니다( NOTES
맨 페이지의 단락과 해당 섹션의 맨 페이지 참조).SIZE
RSS
실제로 어떤 프로세스를 사용하고 있는지 알 수 있습니다.동일한ipcs(1)
공유 메모리 세그먼트의 경우 명령의 출력을 살펴보고 nattch
어떤 공유 메모리 세그먼트에 의심스러운 수의 프로세스가 있는지 확인해야 합니다.
그런 다음 해당 세그먼트의 세부 정보를 확인해야 하며 ipcs -m -i <id>
여기에 연결된 실제 프로세스가 표시됩니다.
이것이 너무 복잡해 보인다면 도전 과제로 생각하십시오. 프로세스 ID가 주어지면 해당 프로세스에 연결된 SHM ID 목록과 해당 SHM ID를 공유하는 PID 목록을 인쇄하는 스크립트를 작성하십시오. ;)