之前遇到了再https+nginx+ngx_lua+其他一些ngx_lua的模块+第三方的ngx_http_dyups_module-master环境下的程序出现了内存泄露的问题。就开始解决。
处理过程如下:
1.由于之前线上有个这样的环境跑的半年多都正常。仅仅的不同就是这次是基于https的。故开始怀疑是不是ngx_lua与https直接的兼容问题。
在邮件中文了春哥之后,确认有这样的案例,所以放弃了这个想法。
2.然后有群里的很多朋友让我做个内存火焰图来定位问题,经过很多尝试,最后发现手机内存火焰图所需数据的脚步需要dtrace的支持,但是centos6.5下实在找不到。
基于时间问题,没办法。。就只好暂时放弃了。
3.查代码,经过不停的注释,与修改。最后定位在 ngx_http_dyups_module-master模块上,发现只要使用了这个模块添加的upstream就会出现内存泄露。
于是我做了如下测试:
location /aabbcc {
dyups_interface;
access_by_lua_file /usr/local/openresty/nginx/conf/test.lua;
}
location / {
set $upstream "testupstream";
proxy_pass https://$upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 180s;
}
test.lua 内容
local status, rv = dyups.update("testupstream",[[ip_hash;server ip1;server ip2;]])
我就是先访问一下:/aabbcc,来添加upstream。然后/下面就可以正常访问。
这时候我用ab直接压力测试。就会出现nginx内存泄露。。
如果不通过/aabbcc来添加。而是直接在nginx.conf中使用upstream配置指令就不会有问题。
4.综合以上过程,我这边确定的结果是使用ngx_http_dyups_module-master模块生成的upstream会导致这个问题。
我临时的解决办法就是去掉这个模块。。
最后,提出我的疑问及想法。。
疑问是我之前的一套线上环境为什么跑了半年这么久都没任何问题。。环境也都一样。。
最后希望春哥早点将balancer_by_lua加入到openresty