Meminta dan melacak penggunaan memori dari satu proses

14

Saya ingin menjalankan program yang menghabiskan memori dan melacak penggunaan memorinya dari waktu ke waktu. Program berakhir dalam beberapa detik setelah dipanggil.

Pertanyaan sebelumnya ini menyarankan paket sysstat . Sementara pidstatsebagian utilitasnya melakukan apa yang saya inginkan, ia gagal memenuhi 2 kebutuhan saya:

  • Ini menerima interval minimal 1s, tetapi saya ingin mengukur pada granularity lebih pendek. ( 0.1sharus baik-baik saja)
  • Ini hanya melacak proses yang ada, sementara saya tidak selalu bisa hadir untuk menyalin & menempelkan pid.

Apakah ada beberapa skrip / utilitas alternatif untuk melakukan pekerjaan memanggil dan mengukur dengan lebih baik?

Banyol
sumber
1
Kedengarannya seperti Anda harus menulis sendiri sedikit Python atau Bash script sederhana untuk membuang penggunaan memori proses (Anda hanya dapat melihat integer pertama dalam /proc/$PID/statm), dan kemudian tidur selama 100 ms dan ulangi. Mengapa kau tidak bisa hanya terus melemparkan PID terkait statmmelalui cat, mungkin menggunakan beberapa regex untuk menyaring off ekstra / nilai-nilai yang tidak dibutuhkan, dan hanya melakukan sleep 0.01? Beberapa sistem operasi tidak akan mengizinkan nilai sub-detik sleep, jadi dalam hal ini, Anda harus mengambil rute Python (dan menggunakan timepustaka bawaan Python untuk tidur).
Terobosan
ada banyak cara
munish

Jawaban:

11

Ini harus melakukan apa yang Anda butuhkan. Ia mendapat informasi dari /proc/$PID/statmdan mencetak (dari man procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

Naskah:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Anda kemudian dapat memanggil skrip, memberinya nama proses sebagai input. Sebagai contoh:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

CATATAN:

  • Ini mengasumsikan bahwa hanya ada satu proses berjalan dengan nama yang ditentukan.
terdon
sumber
@ björnen terima kasih atas hasil edit. Anda benar, saya salah di mansana, saya tidak tahu mengapa hasil edit Anda ditolak.
terdon
1

Setelah bertahun-tahun saya menemukan bahwa valgrind (juga) memiliki alat untuk ini:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

Catatan: valgrind melakukan lebih dari sekedar mengamati: ia perlu menyuntikkan beberapa kode dan mengambil snapshot dari memori. Ini dapat membahayakan ketepatan statistik.

Banyol
sumber