분기된 프로세스 집합의 메모리 사용 공간을 어떻게 측정합니까?

분기된 프로세스 집합의 메모리 사용 공간을 어떻게 측정합니까?

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 스크립트가 있는 저장소를 가리킵니다.pagemapMatt Mackall이 작성했지만 사용하거나 조정할 수 있습니다.

뻔뻔한 플러그: 다음에서 몇 가지 게시물을 찾을 수 있습니다.유닉스 및 리눅스smaps관심이 있으시면 PSS와 파일에 대해 알아보세요 .

관련 정보