プロセスが実際にシステムにどれだけのメモリ圧力を加えているかを確認しようとしています。しかし、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
물론 실제 분석을 위해 실행하는 것은 가장 지루한 일입니다.