免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4280 | 回复: 8

网络发送数据时 进程所占内存缓慢增加,直到系统内存耗尽而killed掉,[请大家帮忙] [复制链接]

论坛徽章:
0
发表于 2010-05-29 14:32 |显示全部楼层
本帖最后由 it-rocket 于 2010-05-29 15:11 编辑

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

排除:
   1>每次基本上都是从开发板上发送4096*4=16384Byte大小的数据包。调试时,不启动板上的发送数据操作,该进程里其他线程所占的内存都基本是一个恒定值,但当激活该发送数据操作时,该进程所占内存几乎以每次200KB的速度递增,直到被系统杀掉。
   2>结合windows客户端所收到的数据所占空间大小,发觉开发板进程所增加的内存几乎就等于其传输到客户端的数据所占得内存?

我排除自己程序里有内存泄露的情况,不知道是不是板上内核缓冲区未将发送完的数据清除掉? 大家给点意见,感谢!

论坛徽章:
0
发表于 2010-05-29 18:05 |显示全部楼层
你是用的阻塞还是非阻塞

论坛徽章:
0
发表于 2010-05-29 18:52 |显示全部楼层
回复 2# notion001


    虽然用的是基于RPC机制的网络传输接口,但是和其他我用来测试内存情况的socket程序一样,都是阻塞似的。

论坛徽章:
0
发表于 2010-06-01 14:28 |显示全部楼层
光说情况有什么用?把代码贴上来,特别是你线程处理那一段.

论坛徽章:
0
发表于 2010-06-01 14:50 |显示全部楼层
光说情况有什么用?把代码贴上来,特别是你线程处理那一段.
samlumengjun 发表于 2010-06-01 14:28


这是smalloc对这个问题的分析。
    QUOTE:既然你的没问题,那就是"RPC机制"有问题.总之会是linux的问题.
除非你门自己改动过OS
smalloc 发表于 2010-05-31 14:33


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

    今天在公司调这个内存耗尽问题的时候,我将除了具备发送功能的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 15:10 |显示全部楼层
你的发送线程有没有设置成detach状态?要不然线程结束不会自行释放资源.

论坛徽章:
0
发表于 2010-06-01 22:49 |显示全部楼层
该问题已经解决,非常感谢楼上各位给的意见。

     内存问题还是得找一切可能内存泄露的地方(自己的程序和系统相关机制等)来进行解决。在另一个网友的启发下,我在另一个自动生成的机制文件中VXI11_xdr.c里,在xdr_Device_ReadResp(..., Device_ReadResp *objp)函数末尾,加入释放语句:
if(objp->data.data_val != NULL)
{
    free(objp->data.data_val);
   objp->data.data_val = NULL;
}

这个函数我也不是很清楚它会被RPC机制在何时进行调用(估计在发送函数返回时),但加入该语句之后,程序内存不再无限制地增长,达到一个稳定水平后,程序就稳定了。

虽然在发送数据的函数中,本该由xdr_free(xdrproc_t)xdr_Device_ReadResp,(char*)&result);  来完成释放该result分配的内存,但结果是该系统函数却未执行其功能,看来以后连这种系统机制的东西,有时也得怀疑。

论坛徽章:
0
发表于 2010-06-02 07:26 |显示全部楼层
兄弟这么说肯定是内存问题了.
一般如果系统里有LOG,我觉得很快就会找到的.
所以我建议你在系统里加些LOG机制吧.
在调试里非常有用.
而且在RELEASE里很容易去掉的.

论坛徽章:
0
发表于 2010-06-02 22:50 |显示全部楼层
回复 8# friendmine


呵呵 我很少用日志这功能,因为跑在开发板上,担忧它占太多资源。
friendmine在板子上也常用日志吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP