近期,web服务器上经常apache的线程数会跑到maxclients(500),从而影响了正常服务。正常情况下,apache线程数不会超过100,而却跑到了500,所以肯定是由于某些请求执行脚本的时间太长了。于是设置apache的LogFormat (参考http://www.lishiming.net/thread-936-1-1.html), 从而追踪到某些请求的时间是多少。有个别请求时间长达60s甚至更长。这些访问肯定是有问题的,不能一直让他们占用apache的资源,所以想到设定超时时间,如果指定时间内请求没有完成,则断开该次请求。虽然这样做不太人性化,但是为了顾全大局只好牺牲某些用户了。
起初,因为对Timeout 参数认识不够深刻,觉得把apache httpd.conf中的 timeout 参数设置小点就会限制了时间长的请求。但是实践证明,那是错的。查了资料,后来发现在官方文档中,对apache的timeout的解释是这样的:
The TimeOut directive currently defines the amount of time Apache will wait for three things:
•The total amount of time it takes to receive a GET request.
•The amount of time between receipt of TCP packets on a POST or PUT request.
•The amount of time between ACKs on transmissions of TCP packets in responses
大概意思是:
1. 接收GET请求的所花费的时间总和
2. POST或者PUT请求时发送TCP包给服务器的间隔(不是间隔时间之和)
3. 发送响应时发送TCP包的间隔(不是间隔之和)
这里我们更关心第3点.
也就是说, 就算timeout设置了1s, 服务器处理请求的时间完全可以超过1s, 只要服务器每隔不超过1s的时间就发送一点数据到客户端即可.
现在想想也是,服务器跟客户端的交互并不是一气呵成的,需要
连接通信--间隔若干时间--继续通信--间隔若干时间... 这样反反复复
所以咱们timeout参数限制的是这个间隔时间,而不是整个通信的时间总和,故而,即使有的请求超过了TimeOut的值,也依旧没有断开连接。
而我的问题依然如故,如何解决呢?因为web服务器上跑的php程序,所以想到通过在php的配置上去限制。这就涉及到了php.ini 中的 max_execution_time .
起初,因为对Timeout 参数认识不够深刻,觉得把apache httpd.conf中的 timeout 参数设置小点就会限制了时间长的请求。但是实践证明,那是错的。查了资料,后来发现在官方文档中,对apache的timeout的解释是这样的:
The TimeOut directive currently defines the amount of time Apache will wait for three things:
•The total amount of time it takes to receive a GET request.
•The amount of time between receipt of TCP packets on a POST or PUT request.
•The amount of time between ACKs on transmissions of TCP packets in responses
大概意思是:
1. 接收GET请求的所花费的时间总和
2. POST或者PUT请求时发送TCP包给服务器的间隔(不是间隔时间之和)
3. 发送响应时发送TCP包的间隔(不是间隔之和)
这里我们更关心第3点.
也就是说, 就算timeout设置了1s, 服务器处理请求的时间完全可以超过1s, 只要服务器每隔不超过1s的时间就发送一点数据到客户端即可.
现在想想也是,服务器跟客户端的交互并不是一气呵成的,需要
连接通信--间隔若干时间--继续通信--间隔若干时间... 这样反反复复
所以咱们timeout参数限制的是这个间隔时间,而不是整个通信的时间总和,故而,即使有的请求超过了TimeOut的值,也依旧没有断开连接。
而我的问题依然如故,如何解决呢?因为web服务器上跑的php程序,所以想到通过在php的配置上去限制。这就涉及到了php.ini 中的 max_execution_time .
编辑回复