psとoperfによるCPU使用率

psとoperfによるCPU使用率

人々が信頼できると考えている2つのソースの見かけに矛盾するデータがあります。おそらく、ソースの1つを誤って読んだのでしょう。

サーバー環境はUbuntu 14.04.2 LTS、3.13.0-53-genericです。

一方では、CPU使用率をサンプリングしてGrafanaがレンダリングしたInfluxDBに入れるPythonスクリプトがあります。使用されるコマンドは次のとおりです。

ps -eLo pid,lwp,pcpu | grep 2924  | awk {'print $2,$3'}
...
2924  2924  0.1
2924  2926  2.4
2924  2927  2.4
2924  2930  2.4
2924  2933  2.4
2924  2935  0.0
2924  3096  0.0
2924  3099  9.0
2924  3100  5.7

CPU使用率は45秒ごとにサンプリングされますが、ほとんどの場合、グラフは期待どおりに報告されます。

このグラフによると、Foo()作成時に呼び出されたスレッドは、上記のすべてのスレッドの中でCPU使用率が最も高くなります。実際、上記の実際の出力のTID 3099は問題のスレッドです。これらの高い使用量は、データのロードなどによって一日中続くことがあります。

一方、OProfileファミリがあります。私はoperf -gl昨日このプログラムを数時間実行し、その代価として健康なデータの塊を受け取りました。レンダリングを使用すると、opreport -gc次の行が表示されます。

46423     0.2396  FooManager.cpp:625      foobinary.V0.28       Foo()

これはインデントされていない行ですFoo()。これに対する私の解釈は次のとおりです。Foo()常に他のスレッドよりもCPU使用率が高くなります。ただし、分析の結果、キャプチャされたサンプルの 0.2396% だけが呼び出しスタックの機能を示しました。

これは不可能に見えます。確かに、CPU使用率が最も高いスレッドは、同僚と比較してプロファイルサンプルで最大の割合を占めますか?

関連情報