解决 Sy CPU 使用率过高的问题

解决 Sy CPU 使用率过高的问题

我正在运行 Supermicro 服务器,使用的是 Ubuntu 14.04.4 LTS。我们有一个应用程序,它占用了系统 CPU 时间的最大值,而几乎不占用用户空间。我在较旧的硬件上运行相同的应用程序,使用的是 Ubuntu 12.04.4 LTS,用户和系统之间的 CPU 更加平衡。我使用 strace 获取了有关该进程的一些性能信息,我发现 epoll_wait 占用了 98% 的系统 CPU 时间。我找不到太多关于此调用的信息,而我找到的信息我并不理解。有人可以解释一下吗?

答案1

你可以使用“perf”来更详细地查看 CPU 的消耗情况:

安装 perf:

sudo apt-get install linux-tools-$(uname -r)

接下来启动消耗所有 CPU 资源的程序

接下来,运行 perf 并捕获 60 秒内的所有调度事件:

sudo perf record -a sleep 60

一旦完成后,您可以使用以下方式获取所有性能事件的日志:

sudo perf script > perf.log

你可以看看这个,或者更好的是,你可以使用以下命令以交互方式查看 CPU 热点:

sudo perf report

答案2

如果您可以使用 -e epoll_wait 选项捕获跟踪程序的输出以捕获 epoll 系统调用,然后将其添加到这个问题中,我们就可以弄清楚发生了什么。

epoll_wait 系统调用基本上是在等待一些 epoll 事件,epoll_wait 系统调用的 CPU 消耗高可能意味着提供的超时太小,这会导致循环中出现数万次 epoll_wait 调用,或者确实有很多事件发生,epoll_wait 正在等待这些事件,代码正在处理这些事件。或者,这可能是程序中的一个错误,它正在处理某种错误。典型的错误条件是 EINVAL,其中将无效参数传递给系统调用,或 EBADF,其中使用了无效的文件描述符(可能是由于打开失败)

因此,再次 strace 该程序:

strace -f -e epoll_wait program-name >& strace.log

并查看发生了哪种 epoll_wait 失败(返回 -1)。如果没有发生失败,则检查是否发生超时(0)或文件描述符是否已准备好进行 I/O(返回 > 0)。

相关内容