프로세스의 실제 메모리 사용량을 얻는 방법(스왑 영역의 데이터 포함)

프로세스의 실제 메모리 사용량을 얻는 방법(스왑 영역의 데이터 포함)

프로세스가 실제로 시스템에 얼마나 많은 메모리 압력을 가하는지 확인하려고 합니다. 그러나 ps친구들 top은 3개의 통계만 보고하므로 이는 거의 쓸모가 없습니다.

  • RES- 상주 메모리 세트에는 물리적 메모리의 데이터 페이지(스왑 아웃된 페이지 제외)만 포함되지만 로드된 공유 라이브러리도 포함됩니다.
  • VIRT- 교체된 페이지, 메모리 매핑된 파일, 공유 라이브러리 등을 포함하여 커널에 의해 메모리에 매핑된 모든 페이지를 포함합니다.
  • SHR- 아마도 가장 쓸모가 없을 것입니다. 공유할 수 있는 라이브러리에서 사용하는 메모리만 포함하지만 제가 이해한 바로는 실제로 프로세스에서 사용하는 메모리를 고려하지 않고 오히려 라이브러리의 전체 크기를 계산합니다. 그 중 일부는 실제로 거주하고 있습니다.

다중 프로세스 컴퓨팅 소프트웨어에서 기존 프로세스와 유사하거나 동일한 공유 메모리/라이브러리를 사용하여 다른 프로세스를 실행하거나 종료함으로써 얼마나 많은 메모리가 사용/해제되는지 알고 싶습니다. 즉, 데이터 세트의 크기를 알아야 합니다. 프로세스에서 사용됨 - 스왑 아웃된 모든 데이터 페이지를 포함하지만 공유 라이브러리, 공유 메모리 페이지, 메모리 매핑 파일 등과 같은 모든 비데이터 페이지는 포함하지 않습니다.

top특정 인코딩은 두렵지 않지만, 해당 정보를 보여주는 내가 몰랐던 대안이 이미 있었다면 좋을 것입니다.

답변1

이 스크립트를 살펴보세요https://github.com/pixelb/scripts/commits/master/scripts/ps_mem.py우리는 애플리케이션을 디버깅하기 위해 자주 사용합니다. 이는 간단한 작업이 아니며 때로는 방법이 커널마다 다릅니다.

스크립트 설명에서 다음을 읽을 수 있습니다.

# Try to determine how much RAM is currently being used per program.
# Note per _program_, not per process. So for example this script
# will report RAM used by all httpd process together. In detail it reports:
# sum(private RAM for program processes) + sum(Shared RAM for program processes)
# The shared RAM is problematic to calculate, and this script automatically
# selects the most accurate method available for your kernel.

답변2

각 관련 프로세스의 /proc/ID/maps 파일을 분석할 수 있을 것 같습니다. 매핑된 페이지가 모두 나열되어 있으면 실행 가능한 페이지, 공유 페이지 및 inode에 매핑되지 않은 페이지를 모두 삭제하세요. 크기(시작 및 끝 주소에서 계산할 수 있음)를 추가하면 결과는 프로세스의 실제 메모리 부족이 됩니다.

이를 위해 다음과 같은 PoC 루비 코드가 있습니다.

sudo ruby -le '
  puts $<.read.split("\n").collect{|l|l.split(/\s+/)}. # create data records
    select{|r|r[4].to_i==0&&r[1]!~/x|s/}. # remove mapped, exec and shared pages
    collect{|r|b,e=r[0].split(/-/,2).collect{|a|a.to_i(16)};r[0]=e-b;r}. # size
    inject(0){|s,r|s+=r[0]} # sum
  ' /proc/17099/maps

물론 실제 분석을 위해 실행하는 것은 가장 지루한 일입니다.

관련 정보