pidstatによって報告された奇妙なCPU使用率値

pidstatによって報告された奇妙なCPU使用率値

pidstatから値を読み取る特定のプログラムのCPU使用量を報告するスクリプトがあります。スクリプトは次のように始まります。

pidstat -C ^frontend$ -h -l -p ALL 1 1

このように報告された値は、CPU使用率が100%を超える可能性があります。これはプロセスがシングルヘッドであるため不可能です。

この動作の原因が何であるかを調べるために繰り返し試した後、pidstatが情報を収集するのにかかる時間を増やし、驚くべきことに値がより合理的な傾向にあることがわかりました。

pidstat -C ^frontend$ -h -l -p ALL 1 10
Linux 3.13.0-32-generic (eu-123)    09/22/2014  _x86_64_    (8 CPU)

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396853     15884   28.43   29.41    0.00   57.84     1  /srv/propulsor/frontend-01/frontend 
 1411396853     15911   33.33   32.35    0.00   65.69     2  /srv/propulsor/frontend-02/frontend 
 1411396853     15968   58.82    0.00    0.00   58.82     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396854     15884  141.00    4.00    0.00  145.00     1  /srv/propulsor/frontend-01/frontend 
 1411396854     15911  143.00    5.00    0.00  148.00     2  /srv/propulsor/frontend-02/frontend 
 1411396854     15968   32.00   13.00    0.00   45.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396855     15884    0.00    0.00    0.00    0.00     1  /srv/propulsor/frontend-01/frontend 
 1411396855     15911    0.00    0.00    0.00    0.00     2  /srv/propulsor/frontend-02/frontend 
 1411396855     15968   32.00   32.00    0.00   64.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396856     15884   61.00    0.00    0.00   61.00     1  /srv/propulsor/frontend-01/frontend 
 1411396856     15911   69.00    0.00    0.00   69.00     2  /srv/propulsor/frontend-02/frontend 
 1411396856     15968   33.00   31.00    0.00   64.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396857     15884   30.00    7.00    0.00   37.00     1  /srv/propulsor/frontend-01/frontend 
 1411396857     15911   34.00   20.00    0.00   54.00     2  /srv/propulsor/frontend-02/frontend 
 1411396857     15968   32.00   32.00    0.00   64.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411396858     15884   31.00   32.00    0.00   63.00     1  /srv/propulsor/frontend-01/frontend 
 1411396858     15911   34.00   33.00    0.00   67.00     2  /srv/propulsor/frontend-02/frontend 
 1411396858     15968  141.00    7.00    0.00  148.00     3  /srv/propulsor/frontend-03/frontend 

[snip]

比較:

root@eu-123 ~ # pidstat -C ^frontend$ -h -l -p ALL 3 10
Linux 3.13.0-32-generic (eu-123)    09/22/2014  _x86_64_    (8 CPU)

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397159     15884   37.09   10.60    0.00   47.68     1  /srv/propulsor/frontend-01/frontend 
 1411397159     15911   30.46   29.80    0.00   60.26     2  /srv/propulsor/frontend-02/frontend 
 1411397159     15968   60.60   13.25    0.00   73.84     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397162     15884   29.33   29.33    0.00   58.67     1  /srv/propulsor/frontend-01/frontend 
 1411397162     15911   66.00    2.00    0.00   68.00     2  /srv/propulsor/frontend-02/frontend 
 1411397162     15968   41.00   15.00    0.00   56.00     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397165     15884   66.33    0.00    0.00   66.33     1  /srv/propulsor/frontend-01/frontend 
 1411397165     15911   30.00   19.67    0.00   49.67     2  /srv/propulsor/frontend-02/frontend 
 1411397165     15968   61.00   13.33    0.00   74.33     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397168     15884   30.00   23.33    0.00   53.33     1  /srv/propulsor/frontend-01/frontend 
 1411397168     15911   66.00   21.33    0.00   87.33     2  /srv/propulsor/frontend-02/frontend 
 1411397168     15968   42.00   15.67    0.00   57.67     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397171     15884   59.00   12.33    0.00   71.33     1  /srv/propulsor/frontend-01/frontend 
 1411397171     15911   30.00    0.67    0.00   30.67     2  /srv/propulsor/frontend-02/frontend 
 1411397171     15968   70.00   24.67    0.00   94.67     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397174     15884   37.67   11.00    0.00   48.67     1  /srv/propulsor/frontend-01/frontend 
 1411397174     15911   30.00   29.67    0.00   59.67     2  /srv/propulsor/frontend-02/frontend 
 1411397174     15968   33.00    4.67    0.00   37.67     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397177     15884   65.33   21.67    0.00   87.00     1  /srv/propulsor/frontend-01/frontend 
 1411397177     15911   65.67    2.33    0.00   68.00     2  /srv/propulsor/frontend-02/frontend 
 1411397177     15968   32.33   32.00    0.00   64.33     3  /srv/propulsor/frontend-03/frontend 

#      Time       PID    %usr %system  %guest    %CPU   CPU  Command
 1411397180     15884   29.00    0.00    0.00   29.00     1  /srv/propulsor/frontend-01/frontend 
 1411397180     15911   30.00   19.33    0.00   49.33     2  /srv/propulsor/frontend-02/frontend 
 1411397180     15968   70.00    2.33    0.00   72.33     3  /srv/propulsor/frontend-03/frontend 

[snip]

さて、今はより合理的に見えますが、私の質問は残ります。何がそのような違いを生むのですか? pidstat 1 1戻り値が100%を超える方法は?

ボーナスの質問:プロセスのCPU使用率を追跡するために他のツールを使用する必要がありますか?

事前にありがとう

編集:私はこの問題を調査してきました。しばらくして(つまり約2週間)、プロセスはこのような奇妙なことを始めるようです。同時に、プロセスが処理する接続数が増加することを確認しました。

観察された動作は、CPU使用率が一貫して0%の状態で複数のpidstat実行を取得し、予想されるCPU使用率値内に維持するために平均10分の1程度のスパイクが発生することです。

私はアプリケーションが接続プールを介していくつかのシステムコールを繰り返していると考え始めました。そしてしばらくすると、接続プールが十分に大きくなり、統計を書くことができず、/proc/pidstatが使用量が0%と信じることになります。したがって、0から数ラウンド後、使用量は> 100%に達しました。

プロセスはいつ/proc/データを書きますか?私が理解したように、pidstatはその情報を使用してCPU使用率を計算します。それとも私が間違っていますか?

誰かがこの問題について明らかにできることを願っています。

関連情報