免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: windwhistle
打印 上一主题 下一主题

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

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

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

netstat或ss出来,是发现recv-q有些数据,如:
tcp   1434060      0 10.0.0.3:52469              183.60.217.64:http          ESTABLISHED 25838/proxy      
tcp   705180      0 10.0.0.3:27341              112.90.51.162:http          ESTABLISHED 25834/proxy

经统计执行:
ss | awk '{if ($2>10000) print $2;}' | awk '{sum+=$1} END {print "Sum = ", sum}'
结果为:
Sum =  641538657

说明recv-q缓存有641M的数据,但是也不至于把内存都耗尽了

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

recv-q里面数据也不少,是我处理收包时有问题吗?
程序里面tcp连接都是长连接,都设了keep_alive属性

论坛徽章:
0
14 [报告]
发表于 2014-03-10 15:06 |只看该作者
recv-q 是指 接受队列里当前没有处理的数据,不是 接受队列所占内存的总大小
实际内存肯定比 641M多

我是这样怀疑的:
1  你的 TCP 和 skbuff_head_cache 相对比较多
2  size-4096, size-2048, size-1024  相对比较多
所以 我猜测可能是 tcp链接比较多, 每个tcp所需要的接受和发送缓存区 所占用的内存就比较多了
因为 网络我不熟, 我只能猜测 tcp的接受和发送缓冲区 是从 size-4096, size-2048, size-1024  里分配的

同样 我也不知道怎么获取当前系统 socket相关所占内存的总大小(我是网络白痴)

但是 我觉得 这是个方向,建议你考虑下,最好统计下
1  你当前有多少个tcp连接,
2  每个tcp连接 你是不是设置接收发送缓冲区大小了?

论坛徽章:
0
15 [报告]
发表于 2014-03-10 15:18 |只看该作者
cat /proc/sys/net/ipv4/tcp_rmem
cat /proc/sys/net/ipv4/tcp_wmem
cat /proc/sys/net/ipv4/tcp_mem

论坛徽章:
0
16 [报告]
发表于 2014-03-10 15:18 |只看该作者
回复 15# lovegq


    看看各是多少?还有,你程序当前有多少个连接?

论坛徽章:
0
17 [报告]
发表于 2014-03-10 15:18 |只看该作者
1. 高峰期,established 的tcp连接可能达到1w个
2. 没有设 接受发送缓存区的大小

论坛徽章:
0
18 [报告]
发表于 2014-03-10 15:26 |只看该作者
cat /proc/sys/net/ipv4/tcp_rmem
4096        87380        4194304

cat /proc/sys/net/ipv4/tcp_wmem
4096        16384        4194304

cat /proc/sys/net/ipv4/tcp_mem
765792        1021056        1531584

当前机器有6000个established的连接,其中我的程序有2000个连接

论坛徽章:
0
19 [报告]
发表于 2014-03-10 15:29 |只看该作者
echo "4096 4096 4096" > /proc/sys/net/ipv4/tcp_rmem                      # 将 tcp的接收缓冲区 设置为最小4K,最大4K
echo "4096 4096 4096" > /proc/sys/net/ipv4/tcp_wmem                     # 将 tcp的发送缓冲区 设置为最小4K,最大4K

echo "262144 524288 1048576"  > /proc/sys/net/ipv4/tcp_mem          # 将 tcp的总内存 设置为最小1G,最大2G, 4G
看看 能不能把内存降下来, 但是记得记下旧数据,以便恢复
另外, 接收/发送缓冲区设小了,终归不是办法,这里只是看看 是不是网络方面内存占得太多了
理解精神  


论坛徽章:
0
20 [报告]
发表于 2014-03-10 16:43 |只看该作者
cat /proc/net/sockstat  # 这里面的mem字段 应该是sock所占的内存(单位字节)
watch 一下 看看是不是会比较高
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP