/proc/pid/smaps에서 프로세스 메모리 사용량에 대한 정보 얻기

/proc/pid/smaps에서 프로세스 메모리 사용량에 대한 정보 얻기

의 지정된 프로세스에 대해 /proc/<pid>/smaps지정된 맵 항목에 대해 다음을 수행합니다.

  1. 공유_클린
  2. 공유_더러운
  3. 개인 청소
  4. 개인_더러운

Shared_Clean+ Shared_Dirty다른 프로세스와 메모리 양을 공유합니까? 그럼 RSS를 공유하는 것과 같나요?

동일 Private_Clean+ Private_Dirty메모리 양하나의 프로세스에서만 작동합니다.? 그렇다면 비공개 RSS와 같은 것인가요?

PSS 값=PrivateRSS+(SharedRSS/공유하는 프로세스 수)?

이 링크를 읽은 후에도 여전히 몇 가지 질문이 있습니다.저수온망

이제 전체 프로세스에 대해 이야기해 보겠습니다. smaps 항목을 살펴보겠습니다.

프로세스에 대한 각 smaps 항목 에 대해 Shared_Clean+++를 Shared_Dirty수행 하면 보고된 프로세스의 RSS를 얻을 수 있다는 것을 알았습니다 . 이는 매우 멋진 일입니다. 예를 들어Private_CleanPrivate_Dirtyps

ps -p $$ -o pid,rss

/proc/$$/smaps에 있는 각 Shared_Clean항목 의 합계와 (대략) 동일한 RSS 값을 제공합니다 .Shared_DirtyPrivate_CleanPrivate_Dirty

하지만 PSS는 어떻습니까?전체 과정에 대해? 그렇다면 위의 예에서 $$에 대한 PSS를 어떻게 얻을 수 있습니까? 각 smaps 맵에 PSS 항목을 추가하고 $$에 PSS에 액세스할 수 있습니까?

미 해군은 어떻습니까?전체 과정에 대해? 위의 예를 다시 사용하면 각 smaps 항목에 Private_* 항목을 추가하기만 하면 $$로 USS에 접근할 수 있을 것 같습니다. 맞나요?

참고:
PSS= 비례 세트 크기.
USS= 고유한 슈트 사이즈.

답변1

클린 페이지는 매핑 이후 수정되지 않은 페이지입니다. 일반적으로 공유 라이브러리의 텍스트 부분은 디스크에서만 읽고(필요한 경우) 수정되지 않으므로 공유 클린 페이지에 있게 됩니다.
더티 페이지는 깨끗하지 않은(즉, 수정된) 페이지입니다.

비공개 페이지는 해당 프로세스에서만 사용할 수 있으며 공유 페이지는 다른 프로세스에 의해 매핑됩니다 * .

RSS는 현재 프로세스에 매핑된 총 페이지 수입니다(공유 여부에 관계없음). 따라서 Shared_Clean+는 Shared_DirtyRSS의 공유 부분(즉, 다른 프로세스의 RSS 부분에도 매핑됨)이고 Private_Clean+는 Private_DirtyRSS의 비공개 부분(즉, 이 프로세스에만 매핑됨)입니다.

PSS(Proportional Share Size)는 귀하가 설명하는 것과 정확히 같습니다. 개인 페이지는 각 공유 맵의 크기를 이를 공유하는 프로세스 수로 나누어 있는 그대로 집계됩니다.
따라서 한 프로세스에 100,000개의 개인 페이지가 있고, 500,000개의 페이지가 다른 프로세스와 공유되고, 500,000개의 페이지가 다른 프로세스 4개와 공유되는 경우 PSS는 다음과 같습니다.

100k + (500k / 2) + (500k / 5) = 450k

추가 자료:

전체 과정에 대해:

  • RSS(대략 + ) 의 항목을 합산하여 얻을 수 있습니다 (공유/개인 공유/더티 항목을 합산할 필요는 없음).Rss:smaps

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Pss:process-global 을 얻으려면 같은 방법으로 값을 집계할 수 있습니다 PSS.
  • USS에는 보고되지 않았지만 smaps실제로는 비공개 지도의 합이므로 같은 방법으로 얻을 수도 있습니다.

* "공유 가능" 페이지는 공유될 때까지 비공개 지도로 간주됩니다.실제로공유. 즉, 현재 하나의 프로세스만 사용 중인 경우 libfoo라이브러리의 텍스트 부분이 해당 프로세스의사적인매핑. 라이브러리를 사용하여 다른 프로세스가 시작될 때만 공유 맵에서 계산되고 개인 맵에서 제거됩니다.
+ 모든 프로세스의 값이 정확하게 합산되는 것은 아닙니다. 왜인지는 모르겠지만...죄송합니다.

답변2

최근 커널에는 /proc/$PID/smaps_rollup프로세스 전체의 모든 매핑 요약이 포함되어 있습니다(참조:https://docs.kernel.org/filesystems/proc.html). 예를 들어:

Rss:              640096 kB
Pss:              463041 kB
Pss_Dirty:        400291 kB
Pss_Anon:         378836 kB
Pss_File:          62264 kB
Pss_Shmem:         21941 kB
Shared_Clean:     195048 kB
Shared_Dirty:       9560 kB
Private_Clean:     38748 kB
Private_Dirty:    396740 kB
Referenced:       640024 kB
Anonymous:        378836 kB
...

관련 정보