nginx解决进程内存占用翻倍

天翼云开发者社区
• 阅读 0

本文分享自天翼云开发者社区《nginx解决进程内存占用翻倍》.作者:z****n

1.问题

某天,线上生成环境发现一个问题: 某一台机器线上的nginx进程占用的内存是其他机器的2倍 ,尝试对nginx进行reload后,并没有恢复

内存占用翻倍机器: nginx解决进程内存占用翻倍

正常机器: nginx解决进程内存占用翻倍

2.分析

1.每次reload或者启动时worker进程从master进程fork出来,所以reload后worker进程的内存和master进程内存大小应该保持一致。

2.由于master进程reload时,是先用一个全新的结构体解析配置后,再free释放到原有配置的结构体。所以master进程再reload过程,会短暂的保持2个结构体(内存2倍),再变为1个全新配置结构体(内存正常)。所以猜测2倍的原因和这个原理有关,很可能是内存泄漏,没有释放原有结构体。

3.内存占用2倍的机器上对nginx进行不断的reload,发现内存保持不变,依然保持2倍。所以推翻第2步的猜测,若是nginx内存泄漏,那每次reload都会造成内存不断增长,而不是一直保持2倍状态

4.由于nginx中使用的是glibc的malloc/free, 即在程序中调用malloc 函数开辟一段空间后,再次调用free函数,程序会把开启的空间还给glibc,但是glibc不一定会把内存还给操作系统。除非调用malloc_trim(0)。所以怀疑大概率要加上一个malloc_trim(0)

3.复现

1.准备

在本地机器上准备一个简单的nginx,nginx中包含众多的server{} 配置(server数量多时候比较好复现) nginx.conf 配置如下

worker_processes  1;
error_log  logs/error.log  debug;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_names_hash_max_size 8192;
    server_names_hash_bucket_size 256;
    server {
        listen 80;
        location / {
            root html;
        }
    }
    include server/*.conf;
}

server 目录如下中是一堆server{}块,如下

server {
        listen 80;
        server_name www.a.com1;
        location / {
                return 200 okokokokok;
        }
 }
server {
        listen 80;
        server_name www.a.com2;
        location / {
                return 200 okokokokok;
        }
 }
####大量不同server_name 的server{}

2.测试

启动nginx,观察当前内存

nginx解决进程内存占用翻倍

进行reload 操作,观察当前内存,发现内存翻了一倍

nginx解决进程内存占用翻倍

4.解决

在 src/os/unix/ngx_process_cycle.c 中 解析完新配置释放旧的配置的结构体后,增加一行 malloc_trim(0)后,重新编译。再次启动nginx, reload后,观察内存不会翻倍

nginx解决进程内存占用翻倍

有的nginx中使用了jemalloc中替换了glibc也可能遇到这个问题,需要把malloc_trim函数 替换为mallctl函数,同时加上3个jemalloc的头文件,差别如下

12,15d11
< #include <jemalloc/jemalloc.h>
< #include <jemalloc/internal/jemalloc_internal_defs.h>
< #include <jemalloc/internal/util.h>
< 
235c231
<         mallctl("arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".purge", NULL, NULL, NULL, 0);
---
>         malloc_trim(0);
点赞
收藏
评论区
推荐文章
3A网络 3A网络
3年前
理解 virt、res、shr 之间的关系(linux 系统篇)
理解virt、res、shr之间的关系(linux系统篇)前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过t
消失的死锁:从 JSF 线程池满到 JVM 初始化原理剖析 | 京东云技术团队
在一次上线时,按照正常流程上线后,观察了线上报文、接口可用率十分钟以上,未出现异常情况,结果在上线一小时后突然收到jsf线程池耗尽的报警,并且该应用一共有30台机器,只有一台机器出现该问题,迅速下线该机器的jsf接口,恢复线上。然后开始排查问题。
京东云开发者 京东云开发者
9个月前
线上机器CPU占用高分析实践
作者:京东零售王江波1.线程运行状态1.1total1.2timed\waiting通过上图我们可以发现timed\waiting的topN线程都是查询国补资质的。1.3waiting通过上图我们可以发现waiting的topN线程都是查询国补活动的。1.
启动Tomcat时报错,提示80端口被占用怎么办?
本文分享自天翼云开发者社区《》,作者:wn本节操作以WindowsServer2019Datacenter操作系统的弹性云主机为例介绍排查80端口占用的操作步骤。可能原因提示80端口被占用,由提示可知,该端口可能是被其他程序占用,包括被木马病毒占用,可以按
什么是DDoS攻击?
本文分享自天翼云开发者社区《》,作者:罗文攻击原理分布式拒绝服务(DistributedDenialofService,简称DDoS)是指攻击者通过控制数百台甚至数万台机器,利用恶意程序同时对一个或多个目标发起攻击,使目标的网络出口链路堵塞或机器负载变高,
HBase Sync功能导致HBase入库性能下降
本文分享自天翼云开发者社区《》,作者:5m问题背景与现象HBase入库慢,regionserver日志中大量打印slowsync。原因分析1.对比正常写入时间段监控,检查HBase服务整体CPU、内存以及NameNodeRPC在异常时间段是否增加;2.检查
京东云开发者 京东云开发者
4个月前
线上机器CPU占用高分析实践
1.线程运行状态1.1total1.2timed\waiting通过上图我们可以发现timed\waiting的topN线程都是查询国补资质的。1.3waiting通过上图我们可以发现waiting的topN线程都是查询国补活动的。1.4线程分析下面我们分
Nginx 缓存的工作原理
本文分享自天翼云开发者社区《》.作者:云海Nginx缓存的工作原理Nginx缓存分为多种类型,最常见的是代理缓存(ProxyCache)。1.代理缓存(ProxyCache)代理缓存的核心原理是:当客户端请求到达Nginx时,Nginx会检查缓存中是否存在
nginx中同一端口不同tls版本与加密套件
本文分享自天翼云开发者社区《》.作者:zn1.问题描述需要在nginx中使用2个域名同时监听443端口,域名a只允许使用tls1.2,域名b允许tls1.2,tls1.3。实际运行发现原生nginx无法实现nginx.conf配置如下workerproce
一种高并发下的自旋锁优化方案
本文分享自天翼云开发者社区《》.作者:星空赶路者1.问题背景CDN线上有一些节点机器cpu存在突刺,都是在晚上业务高峰期才出现。该节点存在大量的小文件访问,使用了固态硬盘。经过线下压测模拟复现了线上的问题现象。2.问题原因通过工具发现cpu突刺时的堆栈信息
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
987
粉丝
16
获赞
40