/proc/$pid/status의 vmRSS 값이 정확하지 않은 것 같습니까? 왜?

/proc/$pid/status의 vmRSS 값이 정확하지 않은 것 같습니까? 왜?

나는 free, ps, top, /proc/$pid/status, /proc/$pid/smaps, /proc/$pid/statm 등과 같은 다양한 메모리 유틸리티의 출력 필드를 이해하는 데 도움이 되는 테스트 프로그램을 작성했습니다. . 마침내 문제가 발생했는데 이해할 수 없습니다.

문제: /proc/$pid/status의 vmRss 필드는 다음과 같습니다.아니 똑같다/proc/$pid/smaps에서 계산된 값입니다(모든 Rss 필드를 추가하여).

전자의 값은 "ps" 명령의 RSS 출력 소스여야 하고, 후자의 값은 "pmap -x" 명령의 RSS 출력 소스여야 합니다.

내가 작성한 테스트 프로그램은 동일한 프로세스로 20개의 스레드를 생성했습니다. 여기서 각 스레드는 malloc(4*1024) 를 256번 호출하여 각 스레드가 1MB의 메모리를 차지하므로 1MB/스레드 * 20 스레드 = 총 20MB입니다.

이 프로그램을 기반으로 /proc/$pid/status의 VmRSS 출력은 다음과 같습니다.

VmRSS:     16468 kB

ps의 출력과 정렬

8941  0.0  0.1 4102600 16468 pts/22  Sl+  10:07   0:00 ./a.out

/proc/8941/smaps 및 pmap -x 8941 출력의 합계는 다음과 같습니다.

$ cat /proc/8941/smaps | grep Rss | awk '{print $2}' | awk '{s+=$1} END {printf "%.0f\n", s}' /dev/stdin
22536
$ pmap -x 8941 | tail -n 1
total kB         4102604   22536   20992

free 명령의 출력을 통해 내 프로그램이 실제로 20MB 이상의 메모리를 소비하고 있다는 사실을 확신하게 되었기 때문에 "ps" 및 "/proc/$pid/status"에 대한 RSS 값은 나에게 의미가 없었습니다.

무슨 일인지 설명해 줄 수 있는 사람 있나요? 미리 감사드립니다.

답변1

Linux 매뉴얼 페이지 프로젝트를 참조하십시오.https://www.kernel.org/doc/man-pages/. 그들은 당신이 보고 있는 것을 설명할 수 있습니다.

이 글을 쓰는 시점(버전 5.13)에서는공정(5)/proc/[pid]/status의 VmRSS가 정확하지 않다고 나옵니다.

VmRSS 상주 세트 크기. 여기의 값은 RssAnon, RssFile 및 RssShmem의 합계입니다. 이 값은 정확하지 않습니다. 위의 /proc/[pid]/statm을 참조하세요.

proc(5)에서는 RssAnon과 RssFile이 부정확하므로 VmRSS도 부정확해야 한다고 말합니다.

정확한 값을 얻으려면 /proc/[pid]/smaps를 참조해야 합니다(맨 페이지의 /proc/[pid]/statm 아래에 그렇게 나와 있습니다).

그리고,참고(1)설명하다

SIZE 및 RSS 필드는 페이지 테이블, 커널 스택, struct thread_info 및 struct task_struct를 포함하여 프로세스의 특정 부분을 계산하지 않습니다. 일반적으로 최소 20KiB의 메모리가 항상 상주합니다. SIZE는 프로세스(코드 + 데이터 + 스택)의 가상 크기입니다.

답변2

단순히 메모리를 할당하는 것만으로는 충분하지 않습니다. 해당 메모리를 사용하고 애플리케이션에서 일부 값을 채우려고 하면 VmRSS가 커집니다.

관련 정보