[問題] Out of memory (已爬文)

看板Linux作者 (kuangs)時間11年前 (2014/12/27 11:33), 編輯推噓1(1037)
留言38則, 7人參與, 最新討論串1/1
想請問各位前輩 我在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://www.ptt.cc/bbs/Linux/M.1419651201.A.D27.html

12/27 13:14, , 1F
你寫的東西是driver?
12/27 13:14, 1F

12/27 14:01, , 2F
不是driver 純粹收uart(從/dev/ttyUSB) 存到sd卡
12/27 14:01, 2F

12/27 16:30, , 3F
感覺還是你的程式本身佔用太多記憶體所以 crash
12/27 16:30, 3F

12/27 16:31, , 4F
你可以簡單寫個 script 放在 crontab 內定期執行
12/27 16:31, 4F

12/27 16:32, , 5F
程式碼就是跑 ps aux | grep your_program > result.txt
12/27 16:32, 5F

12/27 16:33, , 6F
然後檢視一下記憶體佔用狀態,可以初步確認是否該問題
12/27 16:33, 6F

12/27 16:40, , 7F
感覺是kernel mmc/sd driver 的問題。
12/27 16:40, 7F

12/27 16:51, , 8F
readonly 大大 請問會這樣認為 是因為inode_cache 的原因
12/27 16:51, 8F

12/27 16:51, , 9F
嗎?
12/27 16:51, 9F

12/27 17:07, , 10F
系統 cache 本身有管理機制,不大可能因為用太多而當掉
12/27 17:07, 10F

12/27 23:58, , 11F
inode_cache不管怎長都無所謂 有需要系統會自己清....
12/27 23:58, 11F

12/28 17:15, , 12F
會不會是跟driver要了什麼東西後沒有放掉? 軟體本身memery
12/28 17:15, 12F

12/28 17:15, , 13F
leak頂多就被oom killer砍了,系統一般不會掛點
12/28 17:15, 13F

12/28 19:01, , 14F
樓上指出重點,通常只有kernel和driver會搞死系統,user程
12/28 19:01, 14F

12/28 19:02, , 15F
式除非是用來專攻os漏洞的,不然幾乎只會死自己不死系統
12/28 19:02, 15F

12/29 13:48, , 16F
感覺你是檔案打開後沒有做相對應的關閉動作,導致開
12/29 13:48, 16F

12/29 13:48, , 17F
啟的檔案數量太多,超過了系統上限,並不是記憶體洩
12/29 13:48, 17F

12/29 13:48, , 18F
漏的問題。
12/29 13:48, 18F

12/29 14:28, , 19F
to fourdollar: 寫檔案我採用 開檔>寫入>關閉
12/29 14:28, 19F

12/29 14:29, , 20F
每1hr 換一個檔案
12/29 14:29, 20F

12/29 14:30, , 21F
有考慮用 開檔 > 寫檔 (到達換檔案條件1hr)>關檔
12/29 14:30, 21F

12/29 14:30, , 22F
這兩種方法會有差別嗎??
12/29 14:30, 22F

12/29 14:32, , 23F
to kdjf : 是發生out of memory 然後開始砍程式 砍完
12/29 14:32, 23F

12/29 14:32, , 24F
memory 也沒釋放 最後沒東西砍 就死機了!!
12/29 14:32, 24F

12/29 17:57, , 25F
還是你要用 bash 的 ulimit 限制一下當下的資源環境
12/29 17:57, 25F

12/29 17:57, , 26F
限制一下 file handle 與 memory 使用最大限制
12/29 17:57, 26F

12/29 17:57, , 27F
超過使用量就可以限制住,資源也不會過度被耗費使用
12/29 17:57, 27F

12/29 17:58, , 28F
只是你程式可能最後會 crash,但是系統至少不會 crash
12/29 17:58, 28F

12/29 18:22, , 29F
你怎麼讀uart的? 把code放上來吧
12/29 18:22, 29F

12/30 08:55, , 30F
也許可以定期去檢查 /proc/<pid>/ 底下有多少個數字
12/30 08:55, 30F

12/30 08:55, , 31F
檔案來驗證是不是我所說的檔案數量過多的問題。
12/30 08:55, 31F

12/30 11:11, , 32F

12/30 11:14, , 33F
to fourdollars : 是看/proc/<pid>/limit 這檔案嗎??
12/30 11:14, 33F

12/30 11:15, , 34F
裡面 只有 max stack size = 2088960 Max open file=1024
12/30 11:15, 34F

12/30 11:15, , 35F
Max locked memory=65536 Max msgqueue size = 819200
12/30 11:15, 35F

12/30 11:16, , 36F
這四個有值 其他都是unlimited
12/30 11:16, 36F

12/30 11:17, , 37F
to kenduest : 這是個辦法!但是我比較想正解.. 找出問題
12/30 11:17, 37F

12/30 11:17, , 38F
所在!
12/30 11:17, 38F
文章代碼(AID): #1KdYY1qd (Linux)