linux 终端报错 Out of memory: Kill process[PID] [process name] score问题分析
轉自:http://www.111cn.net/sys/CentOS/84755.htm
?
從Out of memory來看是內存超出了,后面的 Kill process[PID] [process name] score好像和進程有關了,下面我們就一起來看看linux 終端報錯 Out of memory: Kill process[PID] [process name] score問題分析看到屏幕上都是 Out of memory: Kill process[PID] [process name] score,雖然知道這是linux自我保護進行內存清理動作,但是為了知道更多的細節進行了學習。
【原因分析】
Out of memory 問題,這通常是因為某時刻應用程序大量請求內存導致系統內存不足造成的,這通常會觸發 Linux 內核里的 Out of Memory (OOM) killer,OOM killer 會殺掉某個進程以騰出內存留給系統用,不致于讓系統立刻崩潰。
Linux 內核根據應用程序的要求分配內存,通常來說應用程序分配了內存但是并沒有實際全部使用,為了提高性能,這部分沒用的內存可以留作它用,這部分內存是屬于每個進程的,內核直接回收利用的話比較麻煩,所以內核采用一種過度分配內存(over-commit memory)的辦法來間接利用這部分 “空閑” 的內存,提高整體內存的使用效率。一般來說這樣做沒有問題,但當大多數應用程序都消耗完自己的內存的時候麻煩就來了,因為這些應用程序的內存需求加起來超出了物理內存(包括 swap)的容量,內核(OOM killer)必須殺掉一些進程才能騰出空間保障系統正常運行。
可能有些同學發現內存還剩下很多啊?怎么還是在報錯內存不夠呢?那是因為32位的系統,如果Low-memory耗盡,就會導致這個問題的出現。那low-memory又是怎么回事呢?
內核使用low memory來跟蹤所有的內存分配,這樣的話一個16GB內存的系統比一個4GB內存的系統,需要消耗更多的low memory,可能有4倍之多。這種額外的壓力從你剛啟動系統那一刻就開始存在了,因為內核結構必須為潛在的跟蹤四倍多的內存分配而調整大小
OOM Killer 就是一層保護機制,用于避免 Linux 在內存不足的時候不至于出太嚴重的問題,把無關緊要的進程殺掉,有些壯士斷腕的意思。
在 32 位CPU 架構下尋址是有限制的。Linux 內核定義了三個區域:
# DMA: 0x00000000 -? 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>
LowMem 區 (也叫 NORMAL ZONE ) 一共 880 MB,而且不能改變(除非用 hugemem 內核)。對于高負載的系統,就可能因為 LowMem 利用不好而引發 OOM Killer 。一個可能原因是 LowFree 太少了,另外一個原因是 LowMem 里都是碎片,請求不到連續的內存區域。
另外,在64位系統下low-memory是所有的內存空間。
查看low memory 和 high memory 的狀態:
[root@localhost ~]# free -lm
???????????? total?????? used?????? free???? shared??? buffers???? cached
Mem:???????? 32105????? 11305????? 20800????????? 0??????? 176?????? 5402
Low:???????? 32105????? 11305????? 20800
High:??????????? 0????????? 0????????? 0
-/+ buffers/cache:?????? 5726????? 26379
Swap:??????? 32767????????? 0????? 32767
【OOM killer原理】
從oom_killer給每個進程打分,根據 points 的高低來決定殺哪個進程,這個points可以調節,root 權限的進程通常被認為很重要,不應該被輕易殺掉,所以打分的時候可以得到 3% 的優惠( -= 30; 分數越低越不容易被殺掉)。我們可以在用戶空間通過操作每個進程的內核參數來決定哪些進程不這么容易被 OOM killer 選中殺掉。比如,如果不想 MySQL 進程被輕易殺掉的話可以找到 MySQL 運行的進程號后,調整 oom_score_adj 為 -15(注意 points 越小越不容易被殺)
ps?aux | grep mysqld
mysql??? 2196? 1.6? 2.1 623800 44876 ???????? Ssl? 09:42?? 0:00 /usr/sbin/mysqld
?
cat /proc/2196/oom_score_adj
0
echo -15 > /proc/2196/oom_score_adj
【解決方法】
知道了原理,那么怎么解決呢?
一、增大內存。
內存不夠咱們肯定要增加啊?不然怎么叫服務器呢?
二、升級到64位操作系統。
64位的操作系統沒有對low-memory限制。
三、使用hugemem內核。
這種內核以不同的方式分割low/high memory,而且在大多數情況下會提供足夠多的low memory到high memory的映射。在大多數案例中,這是一個很簡單的修復方法:安裝hugemem kernel RPM包,然后重啟即可。
四、配置 OOM killer
通過一些內核參數來調整 OOM killer 的行為,避免系統在那里不停的殺進程。比如我們可以在觸發 OOM 后立刻觸發 kernel panic,kernel panic 10秒后自動重啟系統。
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
echo "kernel.panic=10" >> /etc/sysctl.conf
sysctl -p
五、關閉/打開oom-killer(慎用)
echo "0" > /proc/sys/vm/oom-kill
echo "1" > /proc/sys/vm/oom-kill
總結
以上是生活随笔為你收集整理的linux 终端报错 Out of memory: Kill process[PID] [process name] score问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [译]震惊!RxJava 5 个不为人知
- 下一篇: linux C++ 多线程使用pthre