Linux內核的oomkiller(Out of Memory Killer)是一個非常有用的工具,它可以在Linux系統內存不足的時候,關閉一些進程來釋放內存。oomkiller在大多數情況下都能正常工作,但是,在某些情況下,它可能會關閉一些重要的進程,導致系統崩潰或數據丟失。接下來,我們將從多個方面深入分析oomkiller。
一、oomkiller日誌
oomkiller的日誌是非常重要的,因為它能夠記錄oomkiller的行為和執行過程,幫助我們更好地理解它的機制和獲取錯誤診斷。查看Linux系統的oomkiller日誌文件,可以使用以下命令:
dmesg | grep -i "oom"
如果系統中發生oom事件,可以查看到類似下面的輸出:
[817032.308828] Out of memory: Kill process xxxx (php-fpm) score xxxx or sacrifice child
[817032.324742] Killed process xxx (php-fpm) total-vm:xxxxx kB, anon-rss:xxxxx kB, file-rss:xxxx kB, shmem-rss:xxxx kB
可以看到,oomkiller關閉了一個大小為xxxxkB的進程(上面輸出內容中的 pid, score和KB的位置,因為不同系統和內核版本的問題可能會有所差異,需要自行修改)。
此時,用戶需要檢查進程的日誌,排查問題,再決定是否需要對oomkiller設置進行調整或升級硬件配置等操作。
二、oomkiller設置
默認情況下,Linux系統的oomkiller是開啟的,並且是按照缺省優先級進行操作的。但是,在實際生產環境中,有時需要對oomkiller進行一些配置優化或調整。以下是一些常見的設置:
1、修改優先級:如果系統中有一些特別重要的進程需要保持運行,可以通過指定/proc位置下的相應進程中oom_score_adj參數,調整其優先級。例如,以下命令將php-fpm進程優先級降低50:
echo -500 > /proc/<pid>/oom_score_adj
2、禁用oomkiller:在某些情況下,禁用oomkiller是有必要的,比如,當你的系統運行了非常穩定的程序或負載非常低的任務時。可以使用sysctl命令來禁用oomkiller:
sysctl -w vm.overcommit_memory=2
sysctl -w vm.oom_kill_allocating_task=1
3、設置oom_adj:這個參數是用來決定在系統內存不足時,哪些進程應該被關閉。可以使用以下命令設置它的值:
echo -17 > /proc/<pid>/oom_adj
注意,需要root權限來修改以上設置。
三、oomkiller機制
oomkiller的機制涉及很多內核調度算法和內存管理。在Linux內核中,當系統內存出現不足的時候,會採取一些機制來嘗試解決內存不足的問題。
如果所有嘗試都失敗了,它將找到一個將釋放最多內存的進程,並關閉它,然後回收其內存。oomkiller對進程排序的算法是基於進程的內存佔用率進行的。不過,如果有些進程被明確地標記為不可殺死的,oomkiller將會繞過它們。
四、oomkiller 路由器
儘管本文一直在講述Linux中的oomkiller,但它並不是Linux系統的專利。事實上,許多路由器使用的嵌入式系統也具有oomkiller功能。如果你想查看路由器中的oomkiller日誌,可以使用以下命令:
dmesg | grep -i "oom"
如果路由器中的oomkiller關閉了一個進程,用戶應該根據操作系統及應用程序的要求,對操作系統和應用程序進行檢查和調整,處理問題。如果出現了頻繁的oomkiller事件,你可能需要升級硬件或更改軟件配置。
五、oomkiller 關掉
在大多數情況下,oomkiller是非常有用的,但是,如果你想關閉oomkiller,請使用以下命令:
sysctl -w vm.panic_on_oom=1
當你這樣做時,oomkiller將被永久關閉。這是一個非常危險的操作,如果系統出現了內存不足的情況,它將無法自動釋放一些內存,導致系統崩潰或死機。
六、oomkiller ac2100選取
oomkiller並不是所有Linux系統都默認開啟的,即使它被開啟了,也需要一些參數和優化。這也使得有些用戶選擇其他系統或路由器設備。
ASUS的AC2100路由器,是一款非常受歡迎的路由器設備。它的Linino系統默認開啟oomkiller,並可以進行修改。以下是一些與oomkiller相關的設置示例:
#獲得所有PID 和 OOM得分
ps waux | awk '{print $2,$6,$10}' | grep -v '' | sort -n -k 2
#修改啟用優先級為-999,禁用Oomkiller,值可以根據實際情況適當修改
echo "-999">/proc/self/oom_adj
#查看當前內存狀態
cat /proc/meminfo
#修改啟用優先級-offset,默認值為0
echo "10">/proc/sys/vm/overcommit_memory
echo "100">/proc/sys/vm/oom_score_adj-offset
#查看崩潰日誌
grep -i "oom" /var/log/messages
以上示例僅供參考,因為不同的系統和硬件可能需要不同的優化參數。
總結
oomkiller是Linux系統很重要的一個功能組件,負責釋放內存、殺死進程等操作。文章從日誌、設置、機制、路由器、關閉等多個方面詳細介紹了oomkiller的作用和使用方法。當然,在開啟和修改oomkiller的參數時,需要謹慎進行,並根據實際情況進行調整,盡量避免因oomkiller而導致系統崩潰。
原創文章,作者:YCFV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131984.html