当前位置: > Linux服务器 > nginx >

nginx子请求数量过多导致的内存泄漏

时间:2016-12-27 13:53来源:linux.it.net.cn 作者:IT

最近线上的全部lua接口响应时间突然增长了好几倍,甚至达到不可用的状态,看了一下监控,发现全部openresty服务器的内存占用率都在快速的往上涨: 
 
我们试着重启nginx,虽然内存占用率恢复到正常水平,但马上又会继续快速往上涨,重启了好几次都是同样的情况,所以基本上可以确定是发生了内存泄漏。

接着查看接口日志,发现了下面两个报错: 
failed to issue subrequest: -1 
subrequests cycle while processing "xxxxx" 
网上google一下,发现报这个错是因为nginx的子请求数量太多了。我们使用的nginx版本是1.9.3,每个主请求下面最多只能同时跑200个的子请求,超过就会报上面的错误。

而从1.9.5版本开始,nginx取消了子请求的数量限制,只有一个对子请求递归深度(子请求里再发出子请求)的限制,最多只能递归 50 层。这个递归深度在真实场景中不太可能突破,除非故意玩递归子请求。

知道报错的原因之后,直接找到发出子请求的那段代码(ngx.location.capture_multi),稍作修改限制子请求的数量之后,内存占用率就再也没有继续飙升了,所有接口服务也恢复正常。

至此,问题已经解决,下面总结一下: 
1)nginx 1.9.5之前的版本,有对子请求的数量做限制,每个主请求下面最多只能同时跑200个子请求;1.9.5之后的版本,取消了这个数量限制,改成了对子请求递归深度的限制,最多递归50层 
2)如果子请求数量超过200的限制,会报 failed to issue subrequest: -1 的错误,并且会引起nginx内存泄漏




(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容