我正在使用NGINX版本1.2.5。在负载服务请求下,我遇到了内存丢失。我发现了三个内存泄漏,我修复了我继承的代码。泄漏发生在响应处理代码中,其中内存未正确释放,尤其是在由于SSL背压而遇到NGX_AGAIN时。
然而,当内存泄漏发生时,它引发了这种奇怪的情况。我通常会定期重新加载NGINX以获取我每小时发布的新配置。我有一个主人和四个工人。当内存泄漏发生时,我的linux机箱内存耗尽,重新加载将在两天结束时失败,因为没有足够的内存来启动新工作并删除旧工作。我理解,但令我困惑的是,为什么每次重新加载,因为旧的工作程序被删除,内存泄漏不会被屏蔽,因为一个进程被删除,其内存应该已经返回到Linux。当我执行NGINX重启时,这将返回所有泄漏的内存。我收集的不同之处在于,重新启动时,主工作者也会被关闭。但是并不是每个工作者都有自己的内存范围吗?
有人可以向我解释在重新加载和可以解释此行为的重新启动时内存的处理方式有何不同?
谢谢。
这里有一些我得到的更多信息,也许有点光明。
我执行服务nginx start
sh-4.1#service nginx status nginx(pid 19610 19609 19608 19607 19593)正在运行...... sh-4.1#ps -ef | grep nginx 根19593 1 7 16:24? 00:00:04 nginx:master进程/ usr / local / bin / nginx -c /etc/nginx/nginx.conf 没有人19607 19593 0 16:24? 00:00:00 nginx:工作进程 没人19608 19593 0 16:24? 00:00:00 nginx:工作进程 没有人19609 19593 0 16:24? 00:00:00 nginx:工作进程 没人19610 19593 0 16:24? 00:00:00 nginx:工作进程 root 19653 19083 0 16:25 pts / 1 00:00:00 grep nginx SH-4.1#
在日志中,我打印出初始化内存分配器的PID:
sh-4.1#grep 19571 * error.log:2014-06-04 16:24:36.535 +0000 [error] ngx_http_url_filtering_init(cloud_addons / ngx_http_url_filtering_module.c:603):分配分配器:此过程的PID:19571
我抬头看了19571,它不再存在了。所以我重新对此进行了监控并监控了这些流程,并发现19571是nginx最初出现在主人之前:
root 19571 19570 88 16:41 pts / 1 00:00:01 / usr / local / bin / nginx -c /etc/nginx/nginx.conf
如果我发出重新加载:
服务nginx重新加载
error.log:2014-06-04 16:27:36.103 +0000 [错误] ngx_http_url_filtering_init(cloud_addons / ngx_http_url_filtering_module.c:603):分配分配器:此过程的PID:19593
现在这是分配新分配器的主人。
当我发出服务nginx停止时,类似于重启:
error.log:2014-06-04 16:31:59.682 +0000 [错误] ngx_http_url_filtering_exit(cloud_addons / ngx_http_url_filtering_module.c:680): Dellocating allocator:此过程的PID:19593