コアごとに特定のプロセスのCPU使用率を測定する方法はありますか?
top はコアによるシステム全体のCPU使用率を測定するのに役立ち、 taskset はプロセスが実行できるCPUコアに関する情報を提供できることを知っています。
しかし、特定のプロセスのCPU使用率をCPUコアごとに測定するにはどうすればよいですか?
topでこれを行うことができます。 topの実行中にキーボードの「1」を押すと、コアごとのCPU使用率が表示されます。
特定のプロセスを特定のユーザーアカウントで実行することで表示されるプロセスを制限し、タイプ 'u'を使用してそのユーザーに制限する
次を使用できます。
mpstat -P ALL 1
各コアがどれだけビジーであるかを示し、毎秒自動的に更新されます。出力は次のようなものになります(クアッドコアプロセッサ上):
10:54:41 PM CPU %usr %Nice %sys %iowait %irq %soft %steal %guest %idle
10:54:42 PM all 8.20 0.12 0.75 0.00 0.00 0.00 0.00 0.00 90.93
10:54:42 PM 0 24.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 74.00
10:54:42 PM 1 22.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 76.00
10:54:42 PM 2 2.02 1.01 0.00 0.00 0.00 0.00 0.00 0.00 96.97
10:54:42 PM 3 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00
10:54:42 PM 4 14.15 0.00 1.89 0.00 0.00 0.00 0.00 0.00 83.96
10:54:42 PM 5 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00
10:54:42 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:54:42 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
このコマンドは元の質問には答えませんが、特定のプロセスのCPUコア使用率を表示しません。
ps
を使用できます。
例えば。デュアルコアCPUで2つのビジースレッドを持つpythonプロセスを使用する場合:
$ ps -p 29492 -L -o pid,tid,psr,pcpu
PID TID PSR %CPU
29492 29492 1 0.0
29492 29493 1 48.7
29492 29494 1 51.9
(PSRは、スレッドが現在割り当てられているCPU IDです)
スレッドが同じCPUコアで実行されていることがわかります(GILが原因)
jythonで同じpythonスクリプトを実行すると、スクリプトが両方のコアを使用していることがわかります(他の多くのサービスまたはほとんどアイドル状態のスレッドがあります)。
$ ps -p 28671 -L -o pid,tid,psr,pcpu
PID TID PSR %CPU
28671 28671 1 0.0
28671 28672 0 4.4
28671 28673 0 0.6
28671 28674 0 0.5
28671 28675 0 2.3
28671 28676 0 0.0
28671 28677 1 0.0
28671 28678 1 0.0
28671 28679 0 4.6
28671 28680 0 4.4
28671 28681 1 0.0
28671 28682 1 0.0
28671 28721 1 0.0
28671 28729 0 88.6
28671 28730 1 88.5
出力を処理し、各CPUコアの合計CPUを計算できます。
残念ながら、このアプローチは100%信頼できるとは思えません。最初のケースでは、2つの動作中のスレッドが各CPUコアに分離されていると報告されることがあります。同じコア..
htop
は、個々のコア使用の概要を提供します
ps
ソリューションは私が必要としていたもので、bashを投げると、元の質問がまさに求めていたものが実行されます。特定のプロセスのコアごとの使用状況を表示
これはmulti-threadedプロセスのコアごとの使用量も示しています。
次のように使用します:cpustat `pgrep processname`` pgrep otherprocessname` ...
#!/bin/bash
pids=()
while [ $# != 0 ]; do
pids=("${pids[@]}" "$1")
shift
done
if [ -z "${pids[0]}" ]; then
echo "Usage: $0 <pid1> [pid2] ..."
exit 1
fi
for pid in "${pids[@]}"; do
if [ ! -e /proc/$pid ]; then
echo "Error: pid $pid doesn't exist"
exit 1
fi
done
while [ true ]; do
echo -e "\033[H\033[J"
for pid in "${pids[@]}"; do
ps -p $pid -L -o pid,tid,psr,pcpu,comm=
done
sleep 1
done
注:これらの統計は、最後のX秒ではなく、プロセスlifetimeに基づいているため、カウンターをリセットするにはプロセスを再起動する必要があります。
dstat -C 0,1,2,3
また、最初の4コアのCPU使用率も提供します。もちろん、32個のコアがある場合、このコマンドは少し長くなりますが、少数のコアのみに関心がある場合に便利です。
たとえば、コア3および7のみに関心がある場合は、次のようにします。
dstat -C 3,7
perf stat
が必要だと思いました。
--cpu=list
オプションを指定すると、プロセスの特定の使用法が表示されます。 perf stat --cpu=0-7 --no-aggr -- make all -j
コマンドを使用してプロジェクトをビルドするCPU使用量を監視する例を次に示します。出力は次のとおりです。
CPU0 119254.719293 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU1 119254.724776 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU2 119254.724179 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU3 119254.720833 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU4 119254.714109 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU5 119254.727721 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU6 119254.723447 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU7 119254.722418 task-clock (msec) # 1.000 CPUs utilized (100.00%)
CPU0 8,108 context-switches # 0.068 K/sec (100.00%)
CPU1 26,494 context-switches (100.00%)
CPU2 10,193 context-switches (100.00%)
CPU3 12,298 context-switches (100.00%)
CPU4 16,179 context-switches (100.00%)
CPU5 57,389 context-switches (100.00%)
CPU6 8,485 context-switches (100.00%)
CPU7 10,845 context-switches (100.00%)
CPU0 167 cpu-migrations # 0.001 K/sec (100.00%)
CPU1 80 cpu-migrations (100.00%)
CPU2 165 cpu-migrations (100.00%)
CPU3 139 cpu-migrations (100.00%)
CPU4 136 cpu-migrations (100.00%)
CPU5 175 cpu-migrations (100.00%)
CPU6 256 cpu-migrations (100.00%)
CPU7 195 cpu-migrations (100.00%)
左の列は特定のCPUインデックスで、右の列はCPUの使用率です。 --no-aggr
オプションを指定しない場合、結果は一緒に集約されます。 --pid=pid
オプションは、実行中のプロセスを監視する場合に役立ちます。
-a --per-core
または-a perf-socket
も試してみてください。これらはより詳細な情報を表示します。
perf stat
の使用に関する詳細は、このチュートリアルで見ることができます: perf cpu statistic 、またperf help stat
は、オプション。
私はちょうどこの問題を抱えていて、同様の答えを見つけました here 。
方法は、top
を希望どおりに設定し、W
(大文字のW)を押します。これにより、top
の現在のレイアウトが$ HOME/.toprcの構成ファイルに保存されます
異なる構成で複数のtop
を実行する場合、これは機能しない可能性があります。
だから、私が回避策と考えるものを介して、次のいずれかを実行することにより、異なる構成ファイルに書き込む/異なる構成ファイルを使用することができます...
1)バイナリの名前を変更します
ln -s /usr/bin/top top2
./top2
これで、.top2rc
が$ HOMEに書き込まれます
2)構成ファイルを$ HOME/.binary-name.rcファイルに書き込むため、$ HOMEを代替パスに設定します
HOME=./
top
これで、.toprc
が現在のフォルダーに書き込まれます。
他の人々のコメントを使用して、さまざまな使用量アカウンティングを上に追加することで、その情報のバッチ出力を作成でき、後者はスクリプトを介して情報を結合します。スクリプトほど簡単ではないかもしれませんが、すべてのプロセスを提供するためにtopを見つけたので、後で見逃したかもしれない長い実行中の状態を要約してキャプチャすることができます(迷ったプロセスによる予期しないCPU使用率)