Apache线程停止在状态..reading ..直到达到TimeOut的http.conf值

时间:2016-01-08 14:31:53

标签: apache amazon-web-services amazon-ec2 timeout strace

当我检查网络服务器mod_status / server-status时,我发现有一堆线程处于状态..阅读..

在一个线程上做一个strace这是当线程在...读取时实际发生的事情。

...
...
semop(327681, {{0, 1, SEM_UNDO}}, 1)    = 0    
gettimeofday({1452260985, 867058}, NULL) = 0
getsockname(156, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("172.31.9.248")}, [16]) = 0
fcntl(156, F_GETFL)                     = 0x2 (flags O_RDWR)
fcntl(156, F_SETFL, O_RDWR|O_NONBLOCK)  = 0
gettimeofday({1452260985, 867479}, NULL) = 0
read(156, 0x558f4c26e9d8, 8000)         = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=156, events=POLLIN}], 1, 300000) = 1 ([{fd=156, revents=POLLIN}])
read(156, "", 8000)                     = 0
gettimeofday({1452261254, 669634}, NULL) = 0
gettimeofday({1452261254, 669691}, NULL) = 0
shutdown(156, SHUT_WR)                  = 0
poll([{fd=156, events=POLLIN}], 1, 2000) = 1 ([{fd=156, revents=POLLIN|POLLHUP}])
read(156, "", 512)                      = 0
close(156)                              = 0
read(6, 0x7fff901f67e7, 1)              = -1 EAGAIN (Resource temporarily unavailable)
gettimeofday({1452261254, 670341}, NULL) = 0    
semop(327681, {{0, -1, SEM_UNDO}}, 1)   = 0
...
...

当线程处于等待状态时... strace在以下行停止:

poll([{fd=156, events=POLLIN}], 1, 300000) = 1 ([{fd=156, revents=POLLIN}])

在这种情况下,“Timout”的apache配置值设置为30,反映了值“300000”。 这是它等待的超时值,降低配置值将改变上面显示的值,它将使超时更快。

根据我对使用strace的新知识,它看起来它试图让套接字查找内部IP地址。但那并不成功。 “HostnameLookups”设置已关闭。

检查我们的生产环境显示,当Apache停止...读取时它具有相同的模式..但它显示了IPV6地址模式。

示例:

getsockname(154, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:172.31.3.239", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0

然后停在“轮询”,然后得到“(超时)”,如上例所示。

但是有什么输入为什么它会停止...等待..?

“资源暂时不可用”消息是否留下任何线索?

如果重要,Apache将在亚马逊云中ELB背后的EC2实例上运行。

更新 下面是生产服务器现在如何通过线程状态查看的图像。很多..读.. Image of Apache thread states

我们还在服务器上运行了大量的VirtualHosts,如果这可以解释为什么会发生这种情况。

万维网上我最基本的问题就是这个问题:http://apache-http-server.18135.x6.nabble.com/Apache-Hangs-Server-Status-shows-all-Reading-td4751342.html

2 个答案:

答案 0 :(得分:1)

线程卡在..read ..是由于ELB中连接设置的“空闲超时”与http.conf中的Keepalivetimout设置不匹配造成的

ELB中设置的连接超时比Apache配置中设置的Keepalivetimout长很多。这导致Elastic Load Balancer将尝试保持打开连接,而Apache希望关闭它。 见http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html

更改ELB设置以匹配Apache配置(当前60秒)中的设置后,得出的结果是我没有很长的线程列表保持在R(读取)状态。他们现在设置在州K(保持活着)。 这看起来更像线程的预期行为。

答案 1 :(得分:0)

轮询其套接字,等待其中一个或多个变为可读,或者读取超时到期。

  

但是有什么输入为什么它会停止...等待..?

没有任何输入。这就是它阻止的原因。