Apache线程停止在状态..正在读取。。直到达到http.conf超时值

Apache线程停止在状态..正在读取。。直到达到http.conf超时值,apache,amazon-web-services,amazon-ec2,timeout,strace,Apache,Amazon Web Services,Amazon Ec2,Timeout,Strace,当我检查webserver mod_status/server status时,我注意到有一堆线程处于状态..reading ... ... 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.

当我检查webserver mod_status/server status时,我注意到有一堆线程处于状态..reading

...
...
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这是线程处于..读取..时实际发生的情况

...
...
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
...
...
当线程处于..等待。。该策略在以下行停止:

poll([{fd=156, events=POLLIN}], 1, 300000) = 1 ([{fd=156, revents=POLLIN}])
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配置值“Timout”设置为30,这反映了值“300000”。 这是它等待的超时值,降低配置值将更改上面显示的值,并使超时更快

从我使用strace的新知识来看,它试图获得一个套接字来查找内部IP地址。但这并不成功。 “主机名查找”设置已关闭

检查我们的生产环境表明,当Apache停止在..reading..时,它具有相同的模式。。但随后它显示了IPV6地址模式

示例:

poll([{fd=156, events=POLLIN}], 1, 300000) = 1 ([{fd=156, revents=POLLIN}])
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
然后在“poll”处停止,然后获取“(Timeout)”,如上面的示例所示

但是有没有什么输入,为什么它会停在..等待

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

如果重要的话,Apache正在Amazon云中ELB后面的EC2实例上运行

更新: 下面是生产服务器当前线程状态的图像。大量的阅读。。

我们还在服务器上运行大量虚拟主机,如果这能提供发生这种情况的任何线索的话


万维网I基金上最近的线程也有同样的问题:

它正在轮询其套接字,等待其中一个或多个变得可读,或者等待读取超时过期

但是有没有什么输入,为什么它会停在..等待


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

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

ELB中设置的连接超时比Apache配置中设置的Keepalivetimout长很多。这导致弹性负载平衡器将尝试保持打开的连接,而Apache希望其关闭连接。 看这里

在更改ELB设置以匹配Apache配置中的设置(当前为60秒)之后,结果是我没有得到一长串线程处于R(读取)状态。它们现在设置为状态K(保持活动)。
这看起来更像是线程的预期行为。

太棒了,但是需要修复的根本原因是什么呢。我知道它试图查找某个IP地址,但什么没有应答。谁在问,有没有可能关掉。那是真的有必要做的事。如上所述,主机名查找已关闭。那么还有什么在做同样的事情呢?啊,看上面引用的句子问题。这句话应该更像是“谁能帮我解释一下为什么它停在……等待……”:根本原因是什么?这是读取超时的实现。这里没有需要解决的问题。