作者kuangs (kuangs)
站内Linux
标题[问题] Out of memory (已爬文)
时间Sat Dec 27 11:33:18 2014
想请问各位前辈
我在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 会是造成这个问题的原因吗??
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.226.204.222
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Linux/M.1419651201.A.D27.html
1F:→ kdjf: 你写的东西是driver? 12/27 13:14
2F:→ kuangs: 不是driver 纯粹收uart(从/dev/ttyUSB) 存到sd卡 12/27 14:01
3F:→ kenduest: 感觉还是你的程式本身占用太多记忆体所以 crash 12/27 16:30
4F:→ kenduest: 你可以简单写个 script 放在 crontab 内定期执行 12/27 16:31
5F:→ kenduest: 程式码就是跑 ps aux | grep your_program > result.txt 12/27 16:32
6F:→ kenduest: 然後检视一下记忆体占用状态,可以初步确认是否该问题 12/27 16:33
7F:推 readonly: 感觉是kernel mmc/sd driver 的问题。 12/27 16:40
8F:→ kuangs: readonly 大大 请问会这样认为 是因为inode_cache 的原因 12/27 16:51
9F:→ kuangs: 吗? 12/27 16:51
10F:→ kenduest: 系统 cache 本身有管理机制,不大可能因为用太多而当掉 12/27 17:07
11F:→ danny8376: inode_cache不管怎长都无所谓 有需要系统会自己清.... 12/27 23:58
12F:→ kdjf: 会不会是跟driver要了什麽东西後没有放掉? 软体本身memery 12/28 17:15
13F:→ kdjf: leak顶多就被oom killer砍了,系统一般不会挂点 12/28 17:15
14F:→ bitlife: 楼上指出重点,通常只有kernel和driver会搞死系统,user程 12/28 19:01
15F:→ bitlife: 式除非是用来专攻os漏洞的,不然几乎只会死自己不死系统 12/28 19:02
16F:→ fourdollars: 感觉你是档案打开後没有做相对应的关闭动作,导致开 12/29 13:48
17F:→ fourdollars: 启的档案数量太多,超过了系统上限,并不是记忆体泄 12/29 13:48
18F:→ fourdollars: 漏的问题。 12/29 13:48
19F:→ kuangs: to fourdollar: 写档案我采用 开档>写入>关闭 12/29 14:28
20F:→ kuangs: 每1hr 换一个档案 12/29 14:29
21F:→ kuangs: 有考虑用 开档 > 写档 (到达换档案条件1hr)>关档 12/29 14:30
22F:→ kuangs: 这两种方法会有差别吗?? 12/29 14:30
23F:→ kuangs: to kdjf : 是发生out of memory 然後开始砍程式 砍完 12/29 14:32
24F:→ kuangs: memory 也没释放 最後没东西砍 就死机了!! 12/29 14:32
25F:→ kenduest: 还是你要用 bash 的 ulimit 限制一下当下的资源环境 12/29 17:57
26F:→ kenduest: 限制一下 file handle 与 memory 使用最大限制 12/29 17:57
27F:→ kenduest: 超过使用量就可以限制住,资源也不会过度被耗费使用 12/29 17:57
28F:→ kenduest: 只是你程式可能最後会 crash,但是系统至少不会 crash 12/29 17:58
29F:→ kdjf: 你怎麽读uart的? 把code放上来吧 12/29 18:22
30F:→ fourdollars: 也许可以定期去检查 /proc/<pid>/ 底下有多少个数字 12/30 08:55
31F:→ fourdollars: 档案来验证是不是我所说的档案数量过多的问题。 12/30 08:55
33F:→ kuangs: to fourdollars : 是看/proc/<pid>/limit 这档案吗?? 12/30 11:14
34F:→ kuangs: 里面 只有 max stack size = 2088960 Max open file=1024 12/30 11:15
35F:→ kuangs: Max locked memory=65536 Max msgqueue size = 819200 12/30 11:15
36F:→ kuangs: 这四个有值 其他都是unlimited 12/30 11:16
37F:→ kuangs: to kenduest : 这是个办法!但是我比较想正解.. 找出问题 12/30 11:17
38F:→ kuangs: 所在! 12/30 11:17