pidstat 报告的奇怪的 cpu 使用率值

pidstat 报告的奇怪的 cpu 使用率值

我有一个脚本,报告从 pidstat 读取值的特定程序的 cpu 使用情况。该脚本启动为:

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

以这种方式报告的值有时会超过 100% cpu 使用率,这是不可能的,因为进程是单头的。

在反复尝试找出可能导致此行为的原因后,我尝试简单地增加 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 周的生命周期)后才开始做这样奇怪的事情。与此同时,我们发现该进程处理的连接数量有所增加。

观察到的行为是获得几次 pidstat 运行,CPU 使用率始终为 0%,随后出现一个高峰,其平均十分之几的数量级保持在预期的 CPU 使用率值内。

我开始认为这可能是应用程序正在通过连接池执行一些系统调用循环,一段时间后连接池足够大,因此它不会写下其/proc/统计信息,从而使 pidstat 相信使用率为 0%因此,在 0 的几轮之后,使用率达到了>100%。

进程什么时候写入/proc/数据?据我了解,pidstat 使用该信息来计算 cpu 使用情况,还是我错了?

我希望有人能够阐明这个问题......

相关内容