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

最近线上的全部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内存泄漏
--------------------- 
作者:自由de单车 
原文:https://blog.csdn.net/ljfrocky/article/details/52539776 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值