我没有 strace 技能和知识,但我正在尝试解决客户应用程序运行非常慢的问题。我正在尝试找出瓶颈/问题可能出在哪里。
所以我跑了
/etc/init.d/apache2 stop && strace -Tf -o /tmp/trace.txt /etc/init.d/apache2 start
通过 /tmp/trace.txt,我看到了很多以下内容。
2540 poll([{fd=21, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) <0.000052>
有人能告诉我我看到了什么吗?我该如何将其与问题联系起来?该站点确实使用 MySQL,这是否意味着无法建立与 MySQL 的连接?轮询是否与 DB 有关。
答案1
首先退一步——在找出问题所在之前,你的水平非常低。一个简单的方法是看看来自 Apache 的静态 HTTP 页面是否很慢——如果不是,那么可能是数据库很慢。我要采取的下一步是查看数据库查询需要多长时间。
top
此外,如果所有这些都在同一个系统上,您可以使用、iotop
和等工具查看系统资源iostat
。
关于poll
系统调用:
我会尝试将-c
开关添加到 Apache 的 strace 中,以查看每个系统调用的耗时如果你将范围缩小到 Apache在关注系统调用之前。例如,来自健康 HAProxy 的输出顶部是:
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
38.79 0.001152 0 6089 epoll_wait
系统poll
调用用于等待文件描述符上的可用事件。我的第一个猜测是,由于超时时间很短,所以这是 Apache 的正常运行。如果这真的是个问题,那么可能是 Apache 用完了文件描述符,因为每个网络套接字都需要一个文件描述符。你可以看看Apache 手册中有关文件描述符的部分如果你到了这个地步。但是根据 DerkK 的说法,“它将在 open() 或 socket() 处失败”,这更有意义。
因此,这实际上只是一些细节,很可能不是您的实际问题——再次退后几步。