深入分析Linux內核的oomkiller

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-hk/n/131984.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YCFV的頭像YCFV
上一篇 2024-10-03 23:49
下一篇 2024-10-03 23:49

相關推薦

  • 內核驅動編譯環境代價分析

    內核驅動編譯環境是在Linux系統中編譯內核模塊的過程。本文通過分析內核驅動編譯環境的各個方面,包括編譯工具的選擇、編譯速度、編譯器選項等,來探討其代價所在,並提供一些優化的建議。…

    編程 2025-04-29
  • 如何在Linux中添加用戶並修改配置文件

    本文將從多個方面詳細介紹在Linux系統下如何添加新用戶並修改配置文件 一、添加新用戶 在Linux系統下創建新用戶非常簡單,只需使用adduser命令即可。使用以下命令添加新用戶…

    編程 2025-04-27
  • 如何解決linux jar包 invalid or corrupt jarfile問題

    對於許多開發人員和系統管理員在Linux環境下使用Java開發過程中遇到的一個常見的問題是 invalid or corrupt jarfile(無效或損壞的jar文件)錯誤。當您…

    編程 2025-04-27
  • 在Linux上安裝JRE並配置環境變量

    本文將從以下幾個方面為您詳細闡述如何在Linux系統上,通過自己賬戶安裝JRE,並且配置環境變量。 一、安裝JRE 在進行安裝前,我們需要下載JRE的安裝包並解壓,可以從官方網站下…

    編程 2025-04-27
  • 如何做內核的工作

    內核是操作系統的核心,它提供了系統調用接口、存儲管理、進程管理、設備驅動等基礎功能。如何做內核的工作呢?本文從多個方面進行闡述: 一、環境搭建 首先,我們需要搭建好內核開發環境。目…

    編程 2025-04-27
  • GTKAM:Linux下的照片管理器

    GTKAM是用於Linux操作系統的一款照片管理器,它支持多種相機及存儲設備,並提供了一系列強大的工具,讓用戶可以方便地瀏覽、管理、編輯和導出照片。本文將從多個方面對GTKAM進行…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25

發表回復

登錄後才能評論