Linux 記憶體 占用較高問題排查

2021-09-19 14:41:05 字數 4060 閱讀 7876

#按 k 檢視

free 

#按兆m檢視

若伺服器沒有此命令則進行pidstat 安裝pidstat 是sysstat軟體套件的一部分,sysstat包含很多監控linux系統狀態的工具,它能夠從大多數linux發行版的軟體源中獲得。

ps aux | head -1;ps aux |grep -v pid |sort -rn -k +4 | head -20

slabtop

buffer,cached的作用:

cached主要負責快取檔案使用, 日誌檔案過大造成cached區記憶體增大把記憶體占用完 .

free中的buffer和cache:(它們都是占用記憶體):

buffer : 作為buffer cache的記憶體,是塊裝置(磁碟)的緩衝區,包括讀、寫磁碟

cache: 作為page cache的記憶體, 檔案系統的cache,包括讀、寫檔案

如果 cache 的值很大,說明cache住的檔案數很多。

linux伺服器會自動釋放記憶體,保障系統執行,但只會釋放夠用的記憶體,而不會去釋放更多的記憶體。

手動釋放cached方法有三種(系統預設值是0,釋放之後你需要再改回0值):

釋放前最好sync一下,防止丟資料

sync 在啟動機器或關機之前一定要執行sync命令。記住在任何情況下,慎重地執行sync命令決不會有任何壞處,sync命令強制把磁碟緩衝的所有資料寫入磁碟

to free pagecache: #echo 1 > /proc/sys/vm/drop_caches

to free dentries and inodes: #echo 2 > /proc/sys/vm/drop_caches

to free pagecache, dentries and inodes: #echo 3 > /proc/sys/vm/drop_caches

#常用方法是syncecho 1 > /proc/sys/vm/drop_caches

#清除後要還原系統預設配置:

echo 0 > /proc/sys/vm/drop_caches

#檢視設定

sysctl -a | grep drop_caches

補充: echo 字串 > 檔案  就是把字串內容從定向到檔案中

這時檢視 free  可以看到 cached 降低了很多

sysctl -a | grep min_free_kbytes        #centos6.4預設66m

67584                            該檔案表示強制linux vm最低保留多少空閒記憶體(kbytes)。

當可用記憶體低於這個引數時,系統開始**cache記憶體,以釋放記憶體,直到可用記憶體大於這個值。

#改為1g

命令:sysctl -w  vm.min_free_kbytes=1048576

(如果命令執行不成功,直接編輯檔案進行替換即可)

#檢視是否改動

sysctl -a | grep min_free_kbytes

(1)vm.overcommit_memory

執行grep -i commit  /proc/meminfo

看到commitlimit和committed_as引數。

commitlimit是乙個記憶體分配上限,commitlimit = 物理記憶體 * overcommit_ratio(預設50,即50%) + swap大小

committed_as是已經分配的記憶體大小。

vm.overcommit_memory檔案指定了核心針對記憶體分配的策略,其值可以是0、1、2                             

0: (預設)表示核心將檢查是否有足夠的可用記憶體**用程序使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程序。0 即是啟發式的overcommitting handle,會儘量減少swap的使用,root可以分配比一般使用者略多的記憶體

1: 表示核心允許分配所有的物理記憶體,而不管當前的記憶體狀態如何,允許超過commitlimit,直至記憶體用完為止。在資料庫伺服器上不建議設定為1,從而盡量避免使用swap.

2: 表示不允許超過commitlimit值

(2)vm.overcommit_ratio

預設值為:50 (即50%)

這個引數值只有在vm.overcommit_memory=2的情況下,這個引數才會生效。

vm.vfs_cache_pressure

該項表示核心**用於directory和inode cache記憶體的傾向:

預設值100表示核心將根據pagecache和swapcache,把directory和inode cache保持在乙個合理的百分比

降低該值低於100,將導致核心傾向於保留directory和inode cache

增加該值超過100,將導致核心傾向於**directory和inode cache。

sysctl -a | grep vfs_cache_pressure

sysctl -w  vm.vfs_cache_pressure=200  

其實一般情況下不需要調整,只有在極端場景下才建議進行調整,只有此時,才有必要進行調優,這也是調優的意義所在。

vm.dirty_background_ratio   預設為10

所有全域性系統程序的髒頁數量達到系統總記憶體的多大比例後,就會觸發pdflush/flush/kdmflush等後台回寫程序執行。

將vm.dirty_background_ratio設定為5-10,將vm.dirty_ratio設定為它的兩倍左右,以確保能持續將髒資料重新整理到磁碟,避免瞬間i/o寫,產生嚴重等待(和mysql中的innodb_max_dirty_pages_pct類似)

vm.dirty_ratio   預設為20

單個程序的髒頁數量達到系統總記憶體的多大比例後,就會觸發pdflush/flush/kdmflush等後台回寫程序執行。

vm.panic_on_oom    預設為0開啟    為1時表示關閉此功能

等於0時,表示當記憶體耗盡時,核心會觸發oom killer殺掉最耗記憶體的程序。

當oom killer被啟動時,通過觀察程序自動計算得出各當前程序的得分 /proc//oom_score,分值越高越容易被kill掉。

而且計算分值時主要參照 /proc//oom_adj ,  oom_adj 取值範圍從-17到15,當等於-17時表示在任何時候此程序都不會被 oom killer kill掉(適用於mysql)。

/proc/[pid]/oom_adj ,該pid程序被oom killer殺掉的權重,介於 [-17,15]之間,越高的權重,意味著更可能被oom killer選中,-17表示禁止被kill掉。

/proc/[pid]/oom_score,當前該pid程序的被kill的分數,越高的分數意味著越可能被kill,這個數值是根據oom_adj運算後的結果,是oom_killer的主要參考。

sysctl 下有2個可配置選項:

vm.panic_on_oom = 0                      #記憶體不夠時核心是否直接panic                

vm.oom_kill_allocating_task = 1       #oom-killer是否選擇當前正在申請記憶體的程序進行kill

linux記憶體占用問題

linux開機後,使用top命令檢視,4g物理記憶體發現已使用的多大3.2g,佔用率高達80 以上 mem 3889836k total,3341868k used,547968k free,286044k buffers swap 6127608k total,0k used,6127608k f...

Erlang記憶體占用排查流程

使用erlang搭建遊戲伺服器時,運維往往會吐槽cpu占用過高 頻寬太大或者記憶體消耗太快,本文總結一下排查記憶體占用過高的主要思路和流程。erlang system info process count 看是否有大量的異常程序在耗記憶體,之前寫過一篇博文 點我檢視文章 記錄過乙個類似的問題 專案因...

Erlang 程序記憶體占用排查

注 output 指定輸出方式 interval 記憶體資訊重新整理間隔時間 lines 顯示記憶體記錄行數 sort 排序規則 上文指令基於記憶體用量倒排 引數名稱 描述dictionary 程序字典中所有的資料項 registerd name 註冊的名字 status 程序狀態 links 所有...