strace分析apache php进程执行

看了外国人制作的排查apache网页很慢的视频顿时学习到了很多,应该多看国外的视频,链接http://www.youtube.com/watch?v=eF-p–AH37E

这个例子介绍了有一个网页打开比其他网页要慢,telnet去测试GET请求,我这里用nginx做测试

➜   telnet jpuyy.com 80
Trying 114.215.158.48...
Connected to jpuyy.com.
Escape character is '^]'.
GET / HTTP/1.1
Host: jpuyy.com

这时回车一次,这样与服务器keep-alive。
另打开一个窗口,,用pidof nginx找到此进程的pid,用lsof -p查看此pid都打开了哪些文件,同时也能看到tcp ESTABLISHED及打开的端口,这里就能确定是哪个nginx进程来处理用户请求。

for i in `pidof nginx`; do lsof -n -p $i|grep ESTABLISHED; done
nginx   28170 nginx   14u  IPv4            8920667      0t0     TCP 114.215.158.48:http->91.200.12.90:61110 (ESTABLISHED)

在服务器上结合top,按下shift+u,输入nginx过滤只有nginx用户的进程。

找到pid之后,用strace -p pid分析请求到底都做了什么。这里是要找网页变慢的因素,加上-r参数显示时间过程,用于查看是哪一步变慢的,-o 跟filename将输出重定向到文件中,以下是完整命令。

strace -o file -r -p 28170

接下来打开可以查看worker是如何工作的,打开文件,运行命令,调用系统文件,调用php。因为加了-r参数,可以看到每一步运行的时间。可以直接用awk或cut结合sort找出运行时间最长的一步,查看它是因为dns原因,还是php运行函数导致。

发表评论

电子邮件地址不会被公开。 必填项已用*标注