用stracedebugging慢速WordPress站点

我试图find一个非常缓慢的WordPress网站的底部:请求一个页面,它挂起大约20秒,才开始加载页面。

我试过平常的事情:WPdebugging模式,检查慢MySQL查询,禁用插件,检查Apache不排队请求等,没有喜悦。 我现在用strace来看Apache的过程(我正在运行PHP作为mod_php),试图看看发生了什么。 不幸的是我的核心function很弱,我需要一些帮助来解释strace输出。

我正在用-r运行strace,如果我正确理解man页面,这将显示前一个sys调用的时间。

看看输出,我看到几个电话5秒,例如:

0.000114 accept4(4, {sa_family=AF_INET6, sin6_port=htons(46242), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28], SOCK_CLOEXEC) = 13 0.000116 getsockname(13, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 0.000109 fcntl(13, F_GETFL) = 0x2 (flags O_RDWR) 0.000061 fcntl(13, F_SETFL, O_RDWR|O_NONBLOCK) = 0 0.000078 read(13, "GET /wp-content/uploads/fake-ici"..., 8000) = 593 0.000144 stat("/var/www/wp-content/uploads/fake-icicles-500x500.jpg", {st_mode=S_IFREG|0777, st_size=34241, ...}) = 0 0.000197 open("/var/www/wp-content/uploads/fake-icicles-500x500.jpg", O_RDONLY|O_CLOEXEC) = 14 0.000100 close(14) = 0 0.000097 read(13, 0x7f66f397b048, 8000) = -1 EAGAIN (Resource temporarily unavailable) 0.000079 writev(13, [{"HTTP/1.1 304 Not Modified\r\nDate:"..., 182}], 1) = 182 0.000161 write(8, "127.0.0.1 - - [26/Oct/2016:14:17"..., 235) = 235 0.000112 times({tms_utime=3107, tms_stime=70, tms_cutime=0, tms_cstime=0}) = 1802798719 0.000090 poll([{fd=13, events=POLLIN}], 1, 5000) = 0 (Timeout) 5.005144 shutdown(13, SHUT_WR) = 0 0.000130 poll([{fd=13, events=POLLIN}], 1, 2000) = 1 ([{fd=13, revents=POLLIN|POLLHUP}]) 1.000750 read(13, "", 512) = 0 

我的解释是轮询文件描述符ID为13花了5秒钟,并超时(从第四行)。 13看起来像已经打开的套接字的ID,用于将HTTP响应写回客户端。 它是否正确? 还有什么我可以从上面学习? 在我的输出中途是否应该关注read()中的“资源暂时不可用”?

是的,你的解释是对的。

其实据我了解,你看到一个HTTP KeepAlive。

怎么了:

你收到一个连接并接受它,文件描述符= 13:

  0.000114 accept4(4, {sa_family=AF_INET6, sin6_port=htons(46242), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28], SOCK_CLOEXEC) = 13 

您收到一个HTTP GET请求:

  0.000078 read(13, "GET /wp-content/uploads/fake-ici"..., 8000) = 593 

你写回应,在这种情况下,一个304“没有修改”,而不是整个文件,因为请求是一个条件的GET,可能是由于如果修改,因为我不读一个打开的文件,不知道虽然):

  0.000079 writev(13, [{"HTTP/1.1 304 Not Modified\r\nDate:"..., 182}], 1) = 182 

您写入日志文件的条目:

  0.000161 write(8, "127.0.0.1 - - [26/Oct/2016:14:17"..., 235) = 235 

然后你等待另一个请求到同一个套接字由于KeepAlive,默认在Apache是​​5秒:

  0.000090 poll([{fd=13, events=POLLIN}], 1, 5000) = 0 (Timeout) 

在keepalive时间间隔内没有其他的请求到达,所以你开始closuresTCP连接:

  5.005144 shutdown(13, SHUT_WR) = 0 

至于阅读返回-EAGAIN(资源暂时不可用)这是正常的,在这里检查比我的更好的描述: https ://stackoverflow.com/questions/10318191/reading-socket-eagain-resource-temporarily-unavailable#10318268