免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 5999 | 回复: 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
32 [报告]
发表于 2014-03-14 08:06 |只看该作者
用 redhat系统信息收集工具 sosreport  收集信息

论坛徽章:
0
31 [报告]
发表于 2014-03-14 07:58 |只看该作者
好复现就好办。

建议先把内存size-4096,size-2048  这种,耗的是什么内存类型找到,再进一步分析。

如果信得过的话,发邮件给我, 我帮你搞定。

论坛徽章:
0
30 [报告]
发表于 2014-03-12 09:29 |只看该作者
回复 29# humjb_1983


    你的理解差不多,看了下代码, 我的网卡驱动是e1000e,  skb本身是从slab分配的,slabinfo有显示,但是不多
skb中的数据,是网卡驱动用alloc_pages直接从buddy中分配的,难怪 meminfo中 只看到 memfree 往下掉,并不见其他网上涨

论坛徽章:
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
29 [报告]
发表于 2014-03-12 08:42 |只看该作者
lovegq 发表于 2014-03-11 16:43
回复 25# humjb_1983

个人理解,skb中的数据page肯定是伙伴系统分配的,skb数据结构应该是slab中分配的,skb数据结构自身占的空间应该很小的,你的slabinfo中没有skb?

论坛徽章:
0
28 [报告]
发表于 2014-03-11 16:43 |只看该作者
回复 25# humjb_1983


    我倒是发现了更奇怪的现象,我在自己的机器上模拟楼主的这种行为:
=================================================
1    本机服务端listen1万个socket, 客户端connet 这1万个socket,这样一共2万个socket
2    客户端每个connect上去的socket 发送128K数据,但是 服务端从来不调用read
3    此时观察 meminfo , slabinfo,  sockstats ,  free -m 等
=================================================

发现  这 128K * 10000 = 1.3G 左右的内存 确实在 meminfo , free -m, sockstats 中有体现,但是slabinfo却没有

也就是说 这1.3个G 确实耗掉了(应该大部分都是skb),但是却不是在slabinfo中耗掉的,
看 meminfo 只看到 memfree 减少了1个多G ,  
buffer, cached, mmaped, 匿名页,甚至连active 和 inactive都没变化
这 内存谁用掉了???

论坛徽章:
0
27 [报告]
发表于 2014-03-11 16:36 |只看该作者
懒省事的话 不要用netstat监视socket的内存使用了, 链接多的时候比较慢
用 cat /proc/net/sockstat  吧,
我看了下内核代码,感觉还是比较靠谱的

论坛徽章:
0
26 [报告]
发表于 2014-03-11 16:34 |只看该作者
netstat看到recv-q的数据是比较多,之前忽略了这个问题,
程序采用ET模式,recv时也小心处理了数据没从buffer读完的情况,
但不知道怎么recv-q里还那么多数据,我再检查下

论坛徽章:
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
25 [报告]
发表于 2014-03-11 15:05 |只看该作者
大概看了下代码,这个应该就是tcp skb占用的总的内存,可能是你的rmem和wmem设置得有点大,缓冲区占用比较多。

论坛徽章:
0
24 [报告]
发表于 2014-03-11 14:22 |只看该作者
所以我个人觉得是你套接字缓冲区中挤压的数据太多了
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP