linuxoom
㈠ linux oom 內存超過多少會被kill
OOM_killer是Linux自我保護的方式,當內存不足時不至於出現太嚴重問題,有點壯士斷腕的意味
在kernel 2.6,內存不足將喚醒oom_killer,挑出/proc/<pid>/oom_score最大者並將之kill掉
為了保護重要進程不被oom-killer掉,我們可以:echo -17 > /proc/<pid>/oom_adj,-17表示禁用OOM
我們也可以對把整個系統的OOM給禁用掉:
sysctl -w vm.panic_on_oom=1 (默認為0,表示開啟)
sysctl -p
值得注意的是,有些時候 free -m 時還有剩餘內存,但還是會觸發OOM-killer,可能是因為進程佔用了特殊內存地址
平時我們應該留意下新進來的進程內存使用量,免得系統重要的業務進程被無辜牽連
可用 top M 查看最消耗內存的進程,但也不是進程一超過就會觸發oom_killer
參數/proc/sys/vm/overcommit_memory可以控制進程對內存過量使用的應對策略
當overcommit_memory=0 允許進程輕微過量使用內存,但對於大量過載請求則不允許(默認)
當overcommit_memory=1 永遠允許進程overcommit
當overcommit_memory=2 永遠禁止overcommit
ref:http://www.2cto.com/os/201309/247081.html
㈡ 如何理解Linux中的OOM機制
首先解釋兩個概念:
swap:在linux裡面,當物理內存不夠用了,而又有新的程序請求分配內存,那麼linux就會選擇將其他程序暫時不用的數據交換到物理磁碟上(swap out),等程序要用的時候再讀進來(swap in)。這樣做的壞處顯而易見,swap in/swap out這里的代價比較大,相比數據一直放在內存裡面,多了讀磁碟的操作,而磁碟IO代價。。大家都懂的。
OOM:out of memory,指在linux裡面,由於系統內存壓力,系統會選擇保護一些系統進程,而將一些其他的進程kill掉,釋放內存。
㈢ 如何優雅地使用Linux系統OOM ( Out Of Memory Killer)
Linux內核根據伺服器上當前運行應用的需要來分配內存。因為這通常是預先發生的,所以應用並不會使用所有分配的內存。這將會導致資源浪費,Linux內核允許超分內存以提高內存使用效率。Linux內核允許超分內存,比如總共8G內存,可以分給10個進程各1G,這通常沒問題。但問題發生在太多應用一起佔用內存,有8個進程各佔了1G,剩下兩個進程要喝西北風了。
由於內存不足,伺服器有崩潰的風險。The server runs the risk of crashing because it ran out of memory。為了防止伺服器到達這個臨近狀態,內核中有一個OOM Killer殺手進程。To prevent the server from reaching that critical state, the kernel also contains a process known as the OOM Killer。內核利用這個殺手進程開始屠殺那些非必要進程,以便伺服器正常運行。The kernel uses this process to start killing non-essential processes so the server can remain operational.
當你認為這一切都不是問題時,因為OOM Killer只殺掉那些非必要的,不是用戶需要的進程。舉例,兩個應用(Apache和MySQL)通常先被殺掉,因為佔用大量的內存。但這將導致一個web網站立馬癱瘓了。
當嘗試找到為什麼一個應用程序或進程被OOM killer殺掉時,有很多地方可以找到一個進程如何被殺掉以及被殺掉的原因。
$ grep -i kill /var/log/messages*
host kernel: Out of Memory: Killed process 5123 (exampleprocess)
The capital K in Killed tells you that the process was killed with a -9 signal, and this typically is a good indicator that the OOM Killer is to blame.
$ free -lh
The -l switch shows high and low memory statistics, and the -h switch puts the output into gigabytes for easier human readability. You can change this to the -m switch if you prefer the output in megabytes.
同時該命令會給出Swap內存使用信息。注意:free命令給出某個時刻得數據,需要多執行幾次才能知道內存動態的佔用情況。
$ vmstat -SM 10 20
20次,每次間隔10秒給出內存使用情況。
top 默認輸出CPU的使用情況,不過你可以在top後再按下shift + M,你將得到內存的使用情況。
配置文件/etc/sysctl.conf:
sysctl vm.panic_on_oom=1
sysctl kernel.panic=X
echo 「vm.panic_on_oom=1」 >> /etc/sysctl.conf
echo 「kernel.panic=X」 >> /etc/sysctl.conf
大多數情況下,內存不足時每次都重啟是不合適的。
既可以保護一些重要進程不被OMM killer殺掉,又可以讓不重要的進程更容易殺掉:
echo -15 > /proc/(PID)/oom_adj (不被殺)
echo 10 > /proc/(PID)/oom_adj (更易殺)
pstree -p | grep "process" | head -1
在某些情況下,豁免進程可能導致意外的行為變化,取決於系統和資源配置。假如內核無法殺死一個佔用大量內存的進程,將殺死其他進程,包括那些重要的操作系統進程。
由於OOM killer可調節的有效范圍在-16到+15之間,設置為-17將豁免一個進程,因為在OOM killer調節范圍之外。通常的規則是這個參數越大越容易被殺死豁免一個進程的命令是
echo -17 > /proc/(PID)/oom_adj
警告:不建議用於生產環境。
假如重啟,修改進程優先順序,豁免一個進程不足夠好,有個風險的選項:將oom killer 功能關閉。
這一選項參數將有如下影響:
4.1) 嚴重的內核恐慌kernel panic
4.2) 系統掛住system hang-up
4.3) 一個完整的系統崩潰system crash
為什麼關閉有風險呢呢?該功能避免自己因資源而跑飛了。如果你關閉此功能,將不能避免內存耗盡。考慮此項時請極度慎重。
sysctl vm.overcommit_memory=2
echo 「vm.overcommit_memory=2」 >> /etc/sysctl.conf