我有一个脚本,报告从 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 使用情况,还是我错了?
我希望有人能够阐明这个问题......