
200MB의 메모리를 사용하는 프로세스가 있고 포크()가 있다고 가정해 보겠습니다.
python -c "import os; data='x'*200000000; os.fork(); raw_input()"
'top'과 같은 프로그램은 SHRd 메모리가 거의 없는 200MB를 사용하는 각 프로세스를 표시하므로 프로세스가 총 400MB를 사용하는 것처럼 보입니다. 그러나 fork()는 프로세스의 메모리 페이지에 대해 COW(기록 중 복사)를 구현하기 때문에 실제로 프로세스는 총 200MB만 사용하고 있습니다.
Top에 COW 메모리 비율이 표시되지 않는 이유는 무엇입니까? 그렇게 할 수 있는 방법이 있나요? 아니면 대신 사용할 수 있는 다른 명령이 있나요?
참고: OSX의 'top'에는 내가 기대했던 대로 작동하는 RSHRD 열이 있는 것 같습니다. 내 질문은 Linux에 관한 것입니다.
답변1
/proc/<pid>/smaps
항목 형식 Pss
("비례 공유 크기"의 약어) 으로 각 프로세스에 대한 파일 에서 이러한 종류의 정보를 얻을 수 있습니다 .
두 프로세스 간에 200MB가 "공유"되는 위의 예에서 각 프로세스는 해당 매핑에 대한 PSS 항목에 100MB를 표시합니다. 즉, 메모리는 메모리를 공유하는 프로세스 간에 균등하게 분배됩니다(어느 프로세스에서든 복사되거나 공유가 취소될 때까지).
다음은 귀하가 게시한 것과 같은 실행에서 발췌한 내용입니다.
$ top
...
30986 me 20 0 790m 769m 2200 S 0 4.8 0:00.48 python3.2
30987 me 20 0 790m 767m 224 S 0 4.8 0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0 [heap]
Size: 4212 kB
Rss: 3924 kB
Pss: 1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0
Size: 781252 kB
Rss: 781252 kB
Pss: 390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0 [stack]
Size: 192 kB
Rss: 160 kB
Pss: 82 kB
...
(거기에많은많은 프로세스 간에 잠재적으로 공유되는 공유 라이브러리에 대한 매핑을 포함하여 해당 파일에 있는 내용의 일부이므로 각 프로세스는 해당 PSS 항목에서 작은 부분만 차지합니다.)
이에 대한 좋은 기사는 다음과 같습니다. ELC:애플리케이션이 실제로 얼마나 많은 메모리를 사용하고 있나요?
나는 이 정보를 표시하는 일반적인 최상위 도구를 모르고 ps
불행히도 이를 표시할 수 있는 옵션도 없다고 생각합니다. 이 기사는 Python 스크립트가 있는 저장소를 가리킵니다.pagemap
Matt Mackall이 작성했지만 사용하거나 조정할 수 있습니다.
뻔뻔한 플러그: 다음에서 몇 가지 게시물을 찾을 수 있습니다.유닉스 및 리눅스smaps
관심이 있으시면 PSS와 파일에 대해 알아보세요 .