nginx reload内存碎片问题-(一)
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() 函数归还内存给系统。
排查过程
首先验证是否存在内存泄漏
使用systemtap 脚本 排查没有存在内存泄漏,NGINX 确实有释放
使用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 ]
- 使用glibc 提供的malloc_trim 函数进行内存紧缩,内存得到释放。malloc_trim 是 GLIBC 4.0 以上提供的接口,紧缩为阻塞操作,可能影响服务时间,建议动态接口触发
扩展
C 等语言内存碎片如果不用内存池,会有碎片率问题:
- 如何计算内存碎片率
redis 是如何计算内存碎片率没有深入研究过。但是像squid 类似的软件,对malloc 有做一层封装xmalloc,那么只需要统计(xmalloc-xfree)获得squid 内部的分配数 除以 jemalloc 的malloc static分配数 即可得到底层系统库内存碎片率,前提要求只有squid 才用到了jemalloc 采用静态库接口yes_jemalloc 而其他so 用的是glibc,算起来会比较准确 - 深入研究
redis 有内存碎片查看接口,redis4 支持内存碎片清理、redis5 出了主动碎片整理V2 更好的内存统计报告、jemalloc5.1
nginx reload内存碎片问题-(一)相关推荐
- nginx reload热加载实现
nginx reload热加载实现 1.向master进程发送HUP信号(reload 命令),master进程中的ngx_reconfigure设置1 2.master进程校验配置语法是否正确 ...
- NGINX reload过程
大家好,相信大家对nginx reload过程已经很了解了,今天在对该过程做一个分析.带着如下的问题去看 1.全局数组 ngx_process_t ngx_processes[NGX_MAX_P ...
- 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 ...
- Nginx reload
解释 /usr/local/nginx/sbin/nginx -s reload 用过多次这条命令,一直以为是重启Nginx,今天有幸看了下Nginx官方文档介绍这条命令 Nginx服务不会终止,主进 ...
- nginx reload和reopen
nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找 ...
- Nginx reload和restart区别
reload,重新加载的意思,reload会重新加载配置文件,nginx服务不会中断,而且reload时会测试conf语法等,如果出错会rollback用上一次正确配置文件保持正常运行. restar ...
- nginx reload命令_nginx:Failed to start nginx.service:unit not found
错误的原因就是没有添加nginx服务,所以启动失败. 解决方法: 1. 在/root/etc/init.d/目录下新建文件,文件名为nginx 或者用命令在根目录下执行:# vim /etc/init ...
- nginx -s reload原理
我们执行这条命令的原因是希望 nginx 不停止服务始终在处理新的请求的同时把 nginx 的配置文件平滑的把旧的 nginx.conf 配置更新为新的 nginx.conf 配置. 这样一个功能对于 ...
- Nginx使用service nginx sart/stop/restart/reload 命令的脚本方法
前言: 使用文章中的脚本,前提是nginx已经安装,且安装目录为/usr/local/nginx/中 切换目录: cd /etc/init.d/ 使用vim nginx 编辑内容如下: #!/bin/ ...
最新文章
- 单据自动转换并审核的方法示例
- Base64编码的字符串与图片的互转
- MDL估计算法程序C语言,MDLS算法浅谈
- 验证网站地址是否有效
- LeetCode 813. 最大平均值和的分组(DP)
- 基于JAVA+SpringMVC+Mybatis+MYSQL的进销存管理系统
- Java 文件操作-RandomAccessFile
- Log4j CVE-2021-44228 漏洞及Spring Boot解决方案
- 在创投界有个公开的秘密
- 改变form里面input,textarea.select等的默认样式
- linux的abrt目录满了,linux:abrt-cli list
- dnf脚本是php,dnf脚本和辅助惩罚定制
- java编程器宣传费湖南岚鸿驱动_EasyPRO系列通用编程器驱动程序
- 《冰河世纪》特效指导罗皓做客【ftrack聊天室】
- c /c++语法之extern关键字
- Django建网站教程
- 1. 认识kubernetes
- 建筑业数字化|数据推动建筑业变革与产业升级
- Linux——赋予普通用户root的权限
- 对redis的keys方法替换