免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5510 | 回复: 11

网络发送大量数据,进程占有内存逐渐增大,内存耗尽,被系统killed调 [复制链接]

论坛徽章:
0
发表于 2010-05-30 09:18 |显示全部楼层
出了个很棘手的问题,请大家帮我看看哪里出了问题。
问题:
     这几天在调arm-linux开发板上的网络通信程序,当在不断发送数据到Windows上的客户端时,该进程所占内存不断缓慢增加,由刚开始的9401kB,缓慢增加到40784KB,几乎将开发板上的可用内存全部耗尽,最后被系统的oom-killer给kill掉该进程。查找了所有可能出现内存溢出的地方,但仍然苦思得不到原因。也调用了以前的一些TCP/IP socket程序来看,仍然存在其进程所占内存不断增加的情况,只不过其增加没有现在这么快,而当时未注意到这种情况而已。

排除:
   1>每次基本上都是从开发板上发送16kB左右大小的数据包。调试时,不该启动板上的发送数据操作,进程里其他线程所占的内存都基本是一个恒定值,但当激活该发送数据操作时,该进程所占内存几乎以每次约200KB的速度递增,直到被系统杀掉。
   2>结合windows客户端所收到的数据所占空间大小,发觉开发板进程所增加的内存几乎就等于其传输到客户端的数据所占得内存?
   3> 程序用的是基于RPC机制的网络传输机制,但是和其他我用来测试内存情况的tcp/ip socket程序一样,都是阻塞似的。

  我排除自己程序里有内存泄露的情况(因为我都是共用同一个发送缓冲区来重复发送数据,没有重复开辟过),我怀疑是不是板上内核缓冲区未将发送完的数据清除掉? 请大家给点意见,感谢!

论坛徽章:
0
发表于 2010-05-30 10:36 |显示全部楼层
借助代码分析工具试试,

论坛徽章:
0
发表于 2010-05-30 10:41 |显示全部楼层
回复 2# soso2008


    ls能推荐一款吗? 谢谢。

论坛徽章:
0
发表于 2010-05-30 12:48 |显示全部楼层
本帖最后由 superfight 于 2010-05-30 12:58 编辑

建议先使用一些内存工具来看看你的malloc申请了多少次内存~
简单方便一点的像这个http://www.hexco.de/rmdebug/
不过该工具目前是不可重入的~ 如在重入环境下使用需用添加锁进行互斥~

论坛徽章:
0
发表于 2010-05-30 13:27 |显示全部楼层
回复 4# superfight


    恩,这是一个好思路,非常感谢!

论坛徽章:
0
发表于 2010-05-30 16:58 |显示全部楼层
回复 4# superfight


    我查了一下,发现在我写的程序中,malloc只被在程序启动时调用过一次,而且对于该malloc分配的内存空间,也即是我用来发送数据的buffer,每次往这buffer中填充数据时,该buffer的地址都是一样的,数据长度都为16386Byte,真不知道哪里出了问题!

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
发表于 2010-05-31 14:33 |显示全部楼层
既然你的没问题,那就是"RPC机制"有问题.总之会是linux的问题.
除非你门自己改动过OS

论坛徽章:
0
发表于 2010-05-31 19:09 |显示全部楼层
内核开销的内存应该不算在应用头上~
我记得输出KILL的情况大多都是应用自己的问题~
你可以做一下COREDUMP来看看是不是每次运行到固定地方就会被KILL掉~ 还有KILL掉的原因是什么~

论坛徽章:
0
发表于 2010-05-31 19:33 |显示全部楼层
本帖最后由 it-rocket 于 2010-06-01 11:28 编辑
既然你的没问题,那就是"RPC机制"有问题.总之会是linux的问题.
除非你门自己改动过OS
smalloc 发表于 2010-05-31 14:33


smalloc的分析真的是一针见血!

代码没有办法从公司考出来,请谅解。

    今天在公司调这个内存耗尽问题的时候,我将除了具备发送功能的main线程以外的所有线程操作全部屏蔽掉,只用RPC下发送数据的函数来连续发送模拟数据,结果发觉随着数据的不断网络发送,该RPC服务器进程所占内存仍然不断地增加,所以我断定问题就出在这里。

    由于这个RPC发送函数是从VTI给的小demo例子来的,所以我也没有怀疑过它会出问题,只不过在上面修改成我的数据而已。在该发送函数内中,有如下定义:
{
static Device_ReadResp result;
....

xdr_free(xdrproc_t)xdr_Device_ReadResp,(char*)&result);   //据说是释放上一次分配的内存等资源,该发送函数中无free样的函数
....
result.data.data_val = (char *)malloc(sizeof(char*)num_bytes);   // num_bytes为我从windows客户端指定的字节数,为16386Byte。
...
//将我要发送的数据填入result.data.data_val中
....
return &result;
}
当上面的函数体执行完毕后,就将数据发送出去了。

在该发送函数中查看前后两次的地址时,该指针的地址值都是不断地上升,前后两次显示的地址值差为16392Byte。

我尝试着将其xdr_free注释掉,换成我的free(result.data.data_val),但是该程序一启动开始传数,就报段错误。而且对那个result的static变量,我不知道该如何处理才好。

请各位多指点。非常感谢。

论坛徽章:
0
发表于 2010-06-01 11:30 |显示全部楼层
回复 8# superfight


    目前,错误就应该在调用RPC机制来发送数据的那个函数体那里。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP