Linux記憶體高,觸發oom killer問題

2021-06-25 09:46:04 字數 1915 閱讀 4232

最近遇到兩起linux的記憶體問題,其一是觸發了oom-killer導致系統掛

1. 首先確認該系統的版本是32位

#uname -a

linux alarm 2.6.9-67.elsmp #1 smp wed nov 7 13:58:04 est 2007 i686 i686 i386

2. 我們了解一下32位linux的記憶體管理結構

# dma: 0x00000000 -  0x00999999 (0 - 16 mb)

# lowmem: 0x01000000 - 0x037999999 (16 - 896 mb) - size: 880mb

# highmem: 0x038000000 - 《硬體特定》

核心使用low memory來跟蹤所有的記憶體分配,這樣的話乙個16gb記憶體的系統比乙個4gb記憶體的系統,需要消耗更多的low memory,當low memory耗盡,即便系統仍然有剩餘記憶體,仍然會觸發oom-killer。在2.6核心的表現是,殺掉占用記憶體最高的程序,所以會導致sshd等程序 被殺掉,造成系統無法登入。

3. 如何檢視lowmem

-bash-3.00# free -lm

total used free shared buffers cached

mem: 2026

1973520

361303

low: 874

82351

high: 1151

1150

1-/+ buffers/cache: 633

1392

swap: 3067

1422924

4. 所以我們需要保護lowmem,在2.6核心引入了lower_zone_protection,這將讓核心願意保護low memory,從而在分配記憶體時優先考慮從high memory分配。

-bash-3.00# cat /proc/sys/vm/lower_zone_protection

0

-bash-3.00#echo 400 > /proc/sys/vm/lower_zone_protection

另一起問題是24g記憶體的系統,空閒記憶體已經不到50m

1. 確認該系統的版本是64位

# uname -a

2. 用ps檢視各程序的記憶體,大約就占用了4g, 絕大部分記憶體都是被page cache所占用。linux核心的策略是最大程度的利用記憶體cache 檔案系統的資料,提高io速度,雖然在機制上是有程序需要更大的記憶體時,會自動釋放page cache,但不排除釋放不及時或者釋放的記憶體由於存在碎片不滿足程序的記憶體需求。

所以我們需要乙個方法,能夠限定pagecache的上限。

linux 提供了這樣乙個引數min_free_kbytes,用來確定系統開始**記憶體的閥值,控制系統的空閒記憶體。值越高,核心越早開始**記憶體,空閒記憶體越高。

163840

echo 963840 > /proc/sys/vm/min_free_kbytes

其他可選的臨時解決方法:

關閉oom-killer

cat /proc/sys/vm/oom-kill

echo "0" > /proc/sys/vm/oom-kill

vi /etc/sysctl.conf

vm.oom-kill = 0

2. 清空cache (可選)

echo 1 > /proc/sys/vm/drop_caches

Linux 查記憶體占用高 程序

linux下有時候需要檢視系統記憶體占用的情況,兩個方法。乙個是用top 輸入大寫的m 可以檢視到占用記憶體的程序pid,以及占用的百分比 pid是第一列,記憶體占用百分比是 mem這一列 另外也可以通過下面的方法查記憶體占用 ps aux sort nk4 這個命令其實就相當於 ps aux so...

linux 定時觸發

在oracle 中可以利用dbms job包定時執行pl sql sql過程,在像備份等需要在作業系統級定時任務只能採用crontab來完成 本文講述crontab具體用法,以供備忘.在oracle 中可以利用dbms job包定時執行pl sql sql過程,在像備份等需要在作業系統級定時任務只能...

autofs觸發掛載 linux

autofs觸發掛載 問題 格式化 dev sdb5為ext4檔案系統 配置乙個觸發掛載服務 監控目錄為 misc 觸發目錄為tools 掛載裝置為 dev sdb5 方案 autofs觸發掛載是乙個服務,要想使用這個服務,要確保系統安裝了此服務和開啟此服務。autofs之所以可以達到觸發掛載,原因...