web-dev-qa-db-ja.com

プロセスの個別のCPUコア使用量を測定するにはどうすればよいですか?

コアごとに特定のプロセスのCPU使用率を測定する方法はありますか?

top はコアによるシステム全体のCPU使用率を測定するのに役立ち、 taskset はプロセスが実行できるCPUコアに関する情報を提供できることを知っています。

しかし、特定のプロセスのCPU使用率をCPUコアごとに測定するにはどうすればよいですか?

103
elang

topでこれを行うことができます。 topの実行中にキーボードの「1」を押すと、コアごとのCPU使用率が表示されます。

特定のプロセスを特定のユーザーアカウントで実行することで表示されるプロセスを制限し、タイプ 'u'を使用してそのユーザーに制限する

122
abdollar

次を使用できます。

 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コア使用率を表示しません。

73
Kamran Bigdely

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コアに分離されていると報告されることがあります。同じコア..

36
mykhal

htopは、個々のコア使用の概要を提供します

9
WBM

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に基づいているため、カウンターをリセットするにはプロセスを再起動する必要があります。

4
Nathan Kidd
dstat -C 0,1,2,3 

また、最初の4コアのCPU使用率も提供します。もちろん、32個のコアがある場合、このコマンドは少し長くなりますが、少数のコアのみに関心がある場合に便利です。

たとえば、コア3および7のみに関心がある場合は、次のようにします。

dstat -C 3,7
2
Ask and Learn

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は、オプション。

1
elinx

私はちょうどこの問題を抱えていて、同様の答えを見つけました 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使用率)

0