タイトルの通りなのですがtop -b -n 1とかのオプションをつけてtopコマンドを実行した場合にCPU統計情報%Cpu(s)は常に同じ値が返ってきます。

上図の部分ですね。ちなみに他の項目は都度、異なる値が返ってきます。

対応


初回だけ同じ値をかえすのであれば、2回打って後ろの値を取ればよいのでは??ということで試してみたコマンドが下記です。

1
$ top -d 0.1 -b -n 2 | grep Cpu | tail -n 1
  • 0.1秒間隔で2回実行
  • 結果のうちCpuが含まれる行に絞り込む
  • 後ろの行(すなわち2回目)の結果を取る

という風にしてます。私はCPU統計だけ欲しかったのでCpuでgrepかけてますが、いらない場合はgrepを取り除けばいいです。

これの実行結果は下記のようになります。

1
%Cpu(s):  1.1 us,  3.4 sy,  0.0 ni, 95.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

ちゃんととれてますね。後述のStackoverflowでもほぼ同様の対応を行っているので基本的にこの対応で問題ないんじゃないかと思います。

原因


StackOverflowの回答に書いてあるのですが、要するに特定の反復期間でどれだけ変化したかを基に計算するようです。初回だと比較前のサンプルがないのでインスタンス起動後の値を参考値としてしまうようですね。