[问题] Out of memory (已爬文)

楼主: kuangs (kuangs)   2014-12-27 11:33:18
想请问各位前辈
我在Linux(2.6.36) 上写了一个"收UART资料 存到SD"的程式
在测试的时候发现摆了约1天后 就发生out of memory 死机
(确认没有我的程式 不会out of mmemory死机)
使用过 mtrace 来抓程式码memory leak
但结果并无 memory leak
只有一个link list 没有free 是我来存设定档的
我在 开机后一分钟 和 摆了半天后 各抓了一份 /proc/slabinfo
发现有两个值相差过大 而且都持续增加不会减少
开机
inode_cache 552 658 272 14 1 : tunables 54 27 0 : slabdata 47 47 0
size-32 7200 7260 128 30 1 : tunables 120 60 0 : slabdata 242 242 0
半天
inode_cache 36246 36246 272 14 1 : tunables 54 27 0 : slabdata 2589 2589 0
size-32 41010 41010 128 30 1 : tunables 120 60 0 : slabdata 1367 1367 0
这两个项目代表 inode_cache(filesystem) size-32(malloc 使用这个)
网络上查了一下 可下 sync;echo 3 > /proc/sys/vm/drop_caches
手动清除 pagecache、dentry、inode
但用过之后情况并没有改善
我也有检查过我的程式 所以malloc 都有 free
想请问
1.inode_cache 除了 用 /proc/sys/vm/drop_caches 手动清除
还有什么方法可以清除?
5B
2.size-32 我已确定我的程式有malloc 的地方都有做free
有fopen 的地方 都有fclose
为什么 size-32 的 使用数 还是一直往上加??
3.使用thread 会是造成这个问题的原因吗??
作者: kdjf (我抓得到什么呢?)   2014-12-27 13:14:00
你写的东西是driver?
楼主: kuangs (kuangs)   2014-12-27 14:01:00
不是driver 纯粹收uart(从/dev/ttyUSB) 存到sd卡
作者: kenduest (小州)   2014-12-27 16:30:00
感觉还是你的程式本身占用太多内存所以 crash你可以简单写个 script 放在 crontab 内定期执行程式码就是跑 ps aux | grep your_program > result.txt然后检视一下内存占用状态,可以初步确认是否该问题
作者: readonly (唯读)   2014-12-27 16:40:00
感觉是kernel mmc/sd driver 的问题。
楼主: kuangs (kuangs)   2014-12-27 16:51:00
readonly 大大 请问会这样认为 是因为inode_cache 的原因吗?
作者: kenduest (小州)   2014-12-27 17:07:00
系统 cache 本身有管理机制,不大可能因为用太多而当掉
作者: danny8376 (钓到一只猴子@_@)   2014-12-27 23:58:00
inode_cache不管怎长都无所谓 有需要系统会自己清....
作者: kdjf (我抓得到什么呢?)   2014-12-28 17:15:00
会不会是跟driver要了什么东西后没有放掉? 软件本身memeryleak顶多就被oom killer砍了,系统一般不会挂点
作者: bitlife (BIT一生)   2014-12-28 19:01:00
楼上指出重点,通常只有kernel和driver会搞死系统,user程式除非是用来专攻os漏洞的,不然几乎只会死自己不死系统
作者: fourdollars (四元)   2014-12-29 13:48:00
感觉你是档案打开后没有做相对应的关闭动作,导致开启的档案数量太多,超过了系统上限,并不是内存泄漏的问题。
楼主: kuangs (kuangs)   2014-12-29 14:28:00
to fourdollar: 写档案我采用 开档>写入>关闭每1hr 换一个档案有考虑用 开档 > 写档 (到达换档案条件1hr)>关档这两种方法会有差别吗??to kdjf : 是发生out of memory 然后开始砍程式 砍完memory 也没释放 最后没东西砍 就死机了!!
作者: kenduest (小州)   2014-12-29 17:57:00
还是你要用 bash 的 ulimit 限制一下当下的资源环境限制一下 file handle 与 memory 使用最大限制超过使用量就可以限制住,资源也不会过度被耗费使用只是你程式可能最后会 crash,但是系统至少不会 crash
作者: kdjf (我抓得到什么呢?)   2014-12-29 18:22:00
你怎么读uart的? 把code放上来吧
作者: fourdollars (四元)   2014-12-30 08:55:00
也许可以定期去检查 /proc/<pid>/ 底下有多少个数字档案来验证是不是我所说的档案数量过多的问题。
楼主: kuangs (kuangs)   2014-12-30 11:11:00
https://github.com/choushane/serial.git GITHUBto fourdollars : 是看/proc/<pid>/limit 这档案吗??里面 只有 max stack size = 2088960 Max open file=1024Max locked memory=65536 Max msgqueue size = 819200这四个有值 其他都是unlimitedto kenduest : 这是个办法!但是我比较想正解.. 找出问题所在!

Links booklink

Contact Us: admin [ a t ] ucptt.com