根据 ps 和 operf 的 CPU 使用情况

根据 ps 和 operf 的 CPU 使用情况

我从两个人们认为可靠的来源获得了一些看似冲突的数据。很可能,我误读了其中一个来源。

服务器环境为:Ubuntu 14.04.2 LTS、3.13.0-53-generic

一方面,有一个 Python 脚本可以对 CPU 使用情况进行采样,并将其放入由 Grafana 渲染的 InfluxDB 中。使用的命令可以归结为:

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 使用率最高的线程在配置文件样本中所占的比例肯定会最大吗?

相关内容