免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 5973 | 回复: 31
打印 上一主题 下一主题

[内存管理] 特别奇怪的内存泄露问题求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-07 19:33 |只看该作者 |倒序浏览
本帖最后由 windwhistle 于 2014-03-10 14:47 编辑

求助各位大神,我遇到一个很奇怪的内存泄露问题:

我的程序类似代理服务器,是多进程模型的,进程间通过共享内存通信;
随着该程序的运行,内存(8G)逐渐被耗尽,然后出现内存与swap交换,导致wait_io很高,系统性能下降,流量瞬间掉下来;
但是通过top来看,该程序对应的所有进程 占用的内存也就500M+,

然后运行以下脚本:
#/bin/bash
for PROC in `ls /proc/|grep "^[0-9]"`
do
  if [ -f /proc/$PROC/statm ]; then
      TEP=`cat /proc/$PROC/statm | awk '{print ($2)}'`
      RSS=`expr $RSS + $TEP`
  fi
done
RSS=`expr $RSS \* 4`
PageTable=`grep PageTables /proc/meminfo | awk '{print $2}'`
SlabInfo=`cat /proc/slabinfo |awk 'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'`

echo $RSS"KB", $PageTable"KB", $SlabInfo"MB"
printf "rss+pagetable+slabinfo=%sMB\n" `echo $RSS/1024 + $PageTable/1024 + $SlabInfo|bc`
free -m

输出的结果为:
831064KB, 55436KB, 5696.44MB
rss+pagetable+slabinfo=6561.44MB
             total       used       free     shared    buffers     cached
Mem:          7983       7722        260          0          7        109
-/+ buffers/cache:       7605        378
Swap:        19999      13791       6208

可以看出 5696.44MB 的内存被slabinfo占用,接着查看slabinfo的详细信息:

awk '{print $1, $3*$4/1024/1024"MB"}' /proc/slabinfo | sort -nr -k 2 -t' ' | head -n 10

输出结果为:
size-4096 2186.61MB
size-2048 1290.12MB
skbuff_head_cache 472.178MB
TCP 465.582MB
size-1024 348.879MB
sock_inode_cache 211.52MB
ip_dst_cache 199.31MB
size-512 180.883MB
dentry 67.3865MB
size-64 62.0177MB

可以看出,size-4096 和 size-2048 占用比较多的空间

我的问题是:
1. 为何随着该程序运行,该进程占用的内存并不大(500M),但内存被耗尽,并且slabinfo占用的内存很大,
该程序重启,slabinfo占用内存又恢复正常?
2. slabinfo 里面的 size-4096 和 size-2048 两项表示什么?
3. 如何解决这种问题,是程序问题还是内核版本问题(内核为2.6.32-358.el6.x86_64)?


以下是辅助信息:
slabinfo结果:


meminfo结果:


top结果:



ipcs -a 结果如下:
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          root       600        256        0                       
0x00000000 98305      root       600        256        0                       
0x00000000 131074     root       600        256        0                       

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1         

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages  

共享内存占用的很少啊

论坛徽章:
0
2 [报告]
发表于 2014-03-07 23:41 |只看该作者

1  用 ipcs 看看进程间的共享资源
   是不是共享内存太大,或者共享信号量太多
   既然你说“是多进程模型的,进程间通过共享内存通信”
   那就有ipcs看看这部分共享内存有多大,是不是没释放?
  

2  slab按类型分配内存的,但有时候又不需要类型,就是想分配4096或者2048大小,这时候又不想用buddy就是想用slab
于是就有了size-4096,size-2048,...

3  这谁知道?拼人品?积累经验?

论坛徽章:
0
3 [报告]
发表于 2014-03-08 01:00 |只看该作者
如果你用 semget(IPC_PRIVATE, 4096, ...) 之类获取共享内存的话
从代码上看  sys_semget -> newary -> ipc_rcu_alloc -> kmalloc -> size-4096
所以我怀疑是你的共享内存用的太多了

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
4 [报告]
发表于 2014-03-10 09:00 |只看该作者
不一定是memory leak; linux 为了提高系统性能,会把例如文件之类的map到内存里,并不马上释放。这样你会看到这个程序占的内存越来越大。你可以用下面的命令强迫释放这些内存:
echo 3 > /proc/sys/vm/drop_caches
然后你再看是否内存使用量是否正常。 如果drop以后还是占用很多memory, 就有leak

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-03-10 09:57 |只看该作者
能否吧meminfo、slabinfo和top按内存排序的结果贴出来看看~

论坛徽章:
0
6 [报告]
发表于 2014-03-10 14:08 |只看该作者
ipcs -m 结果如下:

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          root       600        256        0                       
0x00000000 98305      root       600        256        0                       
0x00000000 131074     root       600        256        0

共享内存占用的很少啊

论坛徽章:
0
7 [报告]
发表于 2014-03-10 14:17 |只看该作者
本帖最后由 windwhistle 于 2014-03-10 14:50 编辑

meminfo结果 和top结果
已在上面编辑了

论坛徽章:
0
8 [报告]
发表于 2014-03-10 14:35 |只看该作者
回复 6# windwhistle


    ipcs -a  # 把共享信号量,共享队列啥的 都看看
另外 把slabinfo 也贴一下吧

论坛徽章:
0
9 [报告]
发表于 2014-03-10 14:48 |只看该作者
本帖最后由 windwhistle 于 2014-03-10 14:49 编辑

多谢各位关注
所需要的信息都在原帖子里面编辑了

论坛徽章:
0
10 [报告]
发表于 2014-03-10 14:49 |只看该作者

======================
size-4096                2186.61MB
size-2048                1290.12MB
skbuff_head_cache   472.178MB
TCP                         465.582MB
======================
上看, 我猜或许跟网络有关,可能是socket的缓存太多
贴贴 netstat -apt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP