nginx reload内存碎片问题


相关资料

jemalloc、pmap、redis、systemtap、内存紧缩

问题现象

cache nginx 开启ip 库功能 占用700M 内存,reload 后内存翻倍,无法释放

root 9186 0.2 7.2 2150680 1786272 nginx master
reload 前 800M reload 后1.7G

根据描述有free,且多次reload 后内存不再增长;ip库使用系统malloc 和 free 没有使用内存池

问题原因

ip 库malloc 和free 大量紧邻操作可能导致glibc 内存管理合并机制没有归还给操作系统;解决方案使用malloc_trim() 函数归还内存给系统。

排查过程

首先验证是否存在内存泄漏

  1. 使用systemtap 脚本 排查没有存在内存泄漏,NGINX 确实有释放

  2. 使用pmap PID查看进程占用内存

    000000000017a0000 872628K rw---- [ anon ]
    xxxxxxxxxxxxxxxxx [ zero deleted ]

    reload 后, pmap 查看 从系统角度而言原先分配的内存确实还占用着,且又新分配了一段空间

结合ipku的频繁内存malloc 和 free 极有可能是内存碎片

000000000017a0000 872628K rw---- [ anon]
xxxxxxxxxxxxxxxxx xx      xx     [ zero deleted ]
00007fa033f930000 782890K rw---- [ anon]
xxxxxxxxxxxxxxxxx xx      xx     [ zero deleted ]
  1. 使用glibc 提供的malloc_trim 函数进行内存紧缩,内存得到释放。malloc_trim 是 GLIBC 4.0 以上提供的接口,紧缩为阻塞操作,可能影响服务时间,建议动态接口触发

扩展

C 等语言内存碎片如果不用内存池,会有碎片率问题:

  1. 如何计算内存碎片率
    redis 是如何计算内存碎片率没有深入研究过。但是像squid 类似的软件,对malloc 有做一层封装xmalloc,那么只需要统计(xmalloc-xfree)获得squid 内部的分配数 除以 jemalloc 的malloc static分配数 即可得到底层系统库内存碎片率,前提要求只有squid 才用到了jemalloc 采用静态库接口yes_jemalloc 而其他so 用的是glibc,算起来会比较准确
  2. 深入研究
    redis 有内存碎片查看接口,redis4 支持内存碎片清理、redis5 出了主动碎片整理V2 更好的内存统计报告、jemalloc5.1

nginx reload内存碎片问题-(一)相关推荐

  1. nginx reload热加载实现

    nginx reload热加载实现 1.向master进程发送HUP信号(reload 命令),master进程中的ngx_reconfigure设置1  2.master进程校验配置语法是否正确  ...

  2. NGINX reload过程

    大家好,相信大家对nginx reload过程已经很了解了,今天在对该过程做一个分析.带着如下的问题去看 1.全局数组 ngx_process_t    ngx_processes[NGX_MAX_P ...

  3. Nginx reload的时候出现的问题/usr/local/nginx/logs/nginx.pid

    [root@Frankie-4th nginx]# /usr/local/nginx/sbin/nginx -s reload nginx: [error] invalid PID number &q ...

  4. Nginx reload

    解释 /usr/local/nginx/sbin/nginx -s reload 用过多次这条命令,一直以为是重启Nginx,今天有幸看了下Nginx官方文档介绍这条命令 Nginx服务不会终止,主进 ...

  5. nginx reload和reopen

    nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找 ...

  6. Nginx reload和restart区别

    reload,重新加载的意思,reload会重新加载配置文件,nginx服务不会中断,而且reload时会测试conf语法等,如果出错会rollback用上一次正确配置文件保持正常运行. restar ...

  7. nginx reload命令_nginx:Failed to start nginx.service:unit not found

    错误的原因就是没有添加nginx服务,所以启动失败. 解决方法: 1. 在/root/etc/init.d/目录下新建文件,文件名为nginx 或者用命令在根目录下执行:# vim /etc/init ...

  8. nginx -s reload原理

    我们执行这条命令的原因是希望 nginx 不停止服务始终在处理新的请求的同时把 nginx 的配置文件平滑的把旧的 nginx.conf 配置更新为新的 nginx.conf 配置. 这样一个功能对于 ...

  9. Nginx使用service nginx sart/stop/restart/reload 命令的脚本方法

    前言: 使用文章中的脚本,前提是nginx已经安装,且安装目录为/usr/local/nginx/中 切换目录: cd /etc/init.d/ 使用vim nginx 编辑内容如下: #!/bin/ ...

最新文章

  1. 单据自动转换并审核的方法示例
  2. Base64编码的字符串与图片的互转
  3. MDL估计算法程序C语言,MDLS算法浅谈
  4. 验证网站地址是否有效
  5. LeetCode 813. 最大平均值和的分组(DP)
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的进销存管理系统
  7. Java 文件操作-RandomAccessFile
  8. Log4j CVE-2021-44228 漏洞及Spring Boot解决方案
  9. 在创投界有个公开的秘密
  10. 改变form里面input,textarea.select等的默认样式
  11. linux的abrt目录满了,linux:abrt-cli list
  12. dnf脚本是php,dnf脚本和辅助惩罚定制
  13. java编程器宣传费湖南岚鸿驱动_EasyPRO系列通用编程器驱动程序
  14. 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
  15. c /c++语法之extern关键字
  16. Django建网站教程
  17. 1. 认识kubernetes
  18. 建筑业数字化|数据推动建筑业变革与产业升级
  19. Linux——赋予普通用户root的权限
  20. 对redis的keys方法替换

热门文章

  1. 纪念:2006年我在51CTO的第一帖
  2. agc007B - Construct Sequences(构造)
  3. spring定时任务重复执行2次问题的解决
  4. php正则的练习(持续跟新)
  5. 动态生成能够局部刷新的验证码【AJAX技术】---看了不懂赔你钱
  6. 我来做百科(第九天)
  7. mac 安装 RabbitMQ
  8. 当我们谈论知识管理时,我们在谈论什么?
  9. [WCF编程]13.并发:服务并发模式
  10. 迷你MVVM框架 avalonjs 学习教程14、事件绑定