일련의 분기 프로세스의 메모리 풋 프린트를 어떻게 측정합니까?


8

200MB의 메모리를 사용하는 프로세스가 있고 fork () s라고 가정 해보십시오.

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

'top'과 같은 프로그램은 SHRd 메모리가 거의없는 200MB를 사용하는 각 프로세스를 보여 주므로 프로세스가 총 400MB를 사용하는 것처럼 보입니다. 그러나 fork ()는 프로세스의 메모리 페이지에 COW (Copy-On-Write)를 구현하므로 프로세스는 총 200MB 만 사용한다는 것이 현실입니다.

왜 메모리의 일부가 COW인지 보여주지 않습니까? 그렇게 할 수있는 방법이 있습니까? 아니면 대신 사용할 수있는 다른 명령이 있습니까?

참고 : OSX의 '상단'에는 내가 기대하는 것을 수행하는 RSHRD 열이있는 것 같습니다. 내 질문은 리눅스에 관한 것입니다.

답변:


5

항목 /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불행히도 그것을 보여주는 옵션 이 없다고 생각 합니다. 이 기사 pagemap는 Matt Mackall 이라는 파이썬 스크립트가있는 저장소를 가리키며 사용하거나 조정할 수 있습니다.

뻔뻔한 플러그 : 유닉스 및 리눅스에서 PSS에 대한 게시물 과 smaps관심이 있다면 파일을 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.