命令ごとの累積CPU時間統計

命令ごとの累積CPU時間統計

バッテリーでシステムを実行するため、累積CPU時間使用量が非常に心配です。

長い間実行されているプロセスは、頻繁に実行され、終了するプロセスに比べてtopに多くのCPU時間を蓄積するので、topのTIME +列は私にとってあまり役に立ちません。

長い間、命令のすべてのプロセスのCPU時間を記録し、それらをすべて合計して継続的に表示したいと思います。私は私のシステムで実際に実行されているすべてのコマンドに対してこれを行います。たとえば、

bash            5:00:00
dbus-daemon     4:30:00
firefox          3:00:00
NetworkManager  1:20:00

でまとめられています。注文する一行に - 一つではないプロセス各ライン。右側の列は、コマンドのすべてのプロセスのCPU時間を合計して生成されます。

単一プロセスのCPU時間だけを計算すると、bashは私が設定したのと同じくらい高くはありませんが、すべてのプロセスをまとめるとそれほど高くなります。 Bashは何度も実行され、毎回#!/bin/bashshebangを含むシェルスクリプトがありました。

答え1

これについての良い見解は、次のように簡単に入手できます。atop-pコマンドごと(つまり、すべての呼び出しで)累積CPU(またはリソース)を表示するオプションを持つコマンドssh

これはNormalと似ていますtopが、より高い間隔(デフォルトでは10秒)で情報を表示するため、問題に適しています。たとえば、ランニングは完全な分のatop -p 60要約を提供し、ほとんどの場合は問題ありません。

答え2

powertop私の直感は、プロセス時間を実際に計算するよりも、これからもっと学ぶことができるということです。しかし、とにかく:

インストールbpftrace;例が付属していますexecsnoop.bt(/usr/share/bpftrace/toolsにインストールできます)。各PIDの開始時間を保存し、次のように終了時に差分を印刷する別のプローブを追加しますtracepoint:syscalls:sys_enter_exit*(これはテストされておらず、現在私のお気に入りのシステムにはありません。説明に取り組んでいます)。

#!/usr/bin/bpftrace
tracepoint:syscalls:sys_enter_exec*
{
    @start[pid] = nsecs;
    printf("START;%-6d;", pid);
    join(args->argv);
}
tracepoint:syscalls:sys_enter_exit*
{
    $from = @start[pid];
    $until = nsecs;
    printf("STOP;%-5d;%-16d\n", pid, $until-$from);
}

実行可能ファイルを作成してrootとして実行し、出力をファイルに保存します。

bpftrace(私が知っている限り)プログラム名の印刷や引数に改行などを防ぐのに良い機能がないので、出力を解析するのは少し面倒です。しかし、本質的にSTART;or行を最初に解析し、次にSTOP;PIDを解析します。改行は含めることができ、含まれるので、START;次の行は実際にはorで始まるところで終わります。STOP;join(argv)

これにより、各実行ファイルの実行時間を累積できます。

バッテリーでシステムを実行するため、累積CPU時間使用量が非常に心配です。

これは思ったより少ないかもしれません。 800MHzのCPU時間は、1600MHzの同じCPU時間よりもバッテリーを消費しません。所与の問題に対して800MHzの時間が半分を必要とするのか、それより多いのか、それとも少ないのかは問題によって異なる。

さらに悪いことに、CPU時間をほとんど使用しないように最適化されたプログラムは、しばしば歩留まりなどの操作を実行しますが、オペレーティングシステムに依存して急速に目覚めた後にのみ可能です。負荷が低いときは優れており、CPUコアがその間に眠ることを許可しますが、負荷が高いときは突然不要なコンテキストスイッチをたくさん処理することになるのでひどいです。そしてCPUがより少ないエネルギーを使用して同じクロック周波数で同じタスクを実行できるようにする機能は廃棄されます。

特に、組み込みユースケースで割り込みを処理し、他のコアタスクを実行するのにかかる時間は、単に観察できない消費電力と比較的相関します。

しかし、私はあなたの例が好きです。たくさん

単一プロセスのCPU時間だけを計算すると、bashは私が設定したのと同じくらい高くはありませんが、すべてのプロセスをまとめるとそれほど高くなります。 Bashは、毎回#!/bin/bash shebangを含むシェルスクリプトを使用して複数回実行されました。

はい、しかしbashもCPU時間をほとんど占めません。少し構文解析し、別のプロセスを呼び出して完了するまで待ちます。非常に非効率的なシェルスクリプトを作成しない限り、丸めエラーが発生するまで入力を待つか、コマンドが完了するのを待ちます。したがって、実際のシェルスクリプトの実行に必要なすべての時間はから消費されますbash


⁰タイマー設定、poll/ selectfd頻繁に変更、小規模ネットワーク転送を開始...

1 ほとんどのサブキャッシュはホット状態です。つまり、実際にメモリのインポートが発生せず、分岐予測がほとんど正確であるため、推測実行が最も可能性が高い場合に縮小することができます。

²たとえば、bashの長いループを使用して大規模な数学の問題を解決します。

³ 例えば、chmod script.bt; sudo ./script.bt > lifetimes.log

関連情報