Strace 轮询,尝试诊断瓶颈

Bre*_*ent 5 strace

我没有 strace 技能和知识,但我试图解决我的客户端应用程序非常慢的问题。我试图找出瓶颈/问题可能在哪里。

所以我跑了

/etc/init.d/apache2 stop && strace -Tf -o /tmp/trace.txt /etc/init.d/apache2 start
Run Code Online (Sandbox Code Playgroud)

通过/tmp/trace.txt,我看到了很多以下内容。

2540  poll([{fd=21, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) <0.000052>
Run Code Online (Sandbox Code Playgroud)

有人会取悦我所看到的,以及我将如何将其与问题所在的位置联系起来。该站点确实使用了 MySQL,这是否意味着无法建立与 MySQL 的连接?民意调查甚至与数据库相关。

Kyl*_*ndt 5

首先退后一步——在找出问题所在之前,你的水平已经非常低了。一个简单的方法是查看 Apache 的静态 HTTP 页面是否很慢——如果不是,那么数据库可能很慢。我下一步要做的是查看数据库查询花费了多长时间。

top此外,如果这一切都在同一系统上,您可以使用、iotop和 等工具查看系统资源iostat


关于poll系统调用:

如果您在关注系统调用之前将其范围缩小到 apache,我会尝试将开关添加到-cApache 的 strace 中,以查看每个系统调用的时间安排。例如,健康 HAProxy 的输出顶部是:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 38.79    0.001152           0      6089           epoll_wait
Run Code Online (Sandbox Code Playgroud)

poll系统调用用于等待文件描述符上的可用事件。我的第一个猜测是,由于超时时间太短,这是 Apache 的正常功能。如果这实际上是一个问题,则可能是 Apache 耗尽了文件描述符,因为每个网络套接字都需要一个文件描述符。如果您看到了这一点,您可以查看Apache 手册中有关文件描述符的部分。但根据 DerkK 的说法,“它会在 open() 或 socket() 处失败”,这更有意义。

所以实际上,这只是一些很可能不是您实际问题的细节——再次退后几步。

  • 不完全是,“poll()”等待现有文件描述符上的事件(具体来说,根据上面的事件标志,要读取的数据或要读取的优先数据)。如果您想查看 apache 正在等待什么,您需要备份并查看哪个系统调用返回了 fd 21(可能是 open() 或 socket())。如果它没有描述符,那么在到达这里之前很久,它就会在 open() 或 socket() 处失败。我认为你其余的想法都是合理的。问题不太可能是 apache,可以通过从服务器加载一些 jpeg 或静态 html 来轻松测试。 (2认同)