メモリを消費するプログラムを実行し、そのメモリ使用量を経時的に追跡したいと考えています。プログラムは、呼び出されてから数秒で終了します。
この前の質問 提案 sysstat パッケージ。そのpidstat
ユーティリティは部分的に私が望むことを行いますが、私の2つのニーズを満たすことができません:
1s
ですが、より細かい単位で測定したいと考えています。 (0.1s
で結構です)呼び出しと測定のジョブをより適切に実行するための代替スクリプト/ユーティリティはありますか?
これはあなたが必要なことをするはずです。 /proc/$PID/statm
から情報を取得して出力します(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
スクリプト:
#!/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
次に、スクリプトを呼び出して、プロセス名を入力として与えます。例えば:
$ 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
ノート:
数年後、私はvalgrind(も)にこのためのツールがあることを発見しました:
# 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
注:valgrindは監視だけではありません。コードを挿入してメモリのスナップショットを取得する必要があります。これは統計の精度を損なう可能性があります。