Linux buffer和cache高

問題描述

近期有一臺linux服務器一致觸發告警,物理內存利用率(%)在2020-04-17 10:02:55發生錯誤告警94.37 >= 90,登錄服務器查看free,如下圖所示:
在這裏插入圖片描述
在這裏插入圖片描述
shift + M按內存排序後,觀察系統中使用內存最大的進程情況,如上圖所示,最大隻佔用1G多內存(RES);
附:第三行cpu的狀態的解釋:
us(user cpu time):用戶態使用的cpu時間比。該值較高時,說明用戶進程消耗的 CPU 時間比較多,比如,如果該值長期超過 50%,則需要對程序算法或代碼等進行優化。
sy(system cpu time):系統態使用的cpu時間比。
ni(user nice cpu time):用做nice加權的進程分配的用戶態cpu時間比
id(idle cpu time):空閒的cpu時間比。如果該值持續爲0,同時sy是us的兩倍,則通常說明系統則面臨着 CPU 資源的短缺。
wa(io wait cpu time):cpu等待磁盤寫入完成時間。該值較高時,說明IO等待比較嚴重,這可能磁盤大量作隨機訪問造成的,也可能是磁盤性能出現了瓶頸。
hi(hardware irq):硬中斷消耗時間
si(software irq):軟中斷消耗時間
st(steal time):虛擬機偷取時間
上述這些參數的值加起來是100%。
在這裏插入圖片描述
在這裏插入圖片描述
shared 多個進程共享的內存總額
buffers 磁盤緩存(Buffer Cache)的大小(可提高系統I/O調用的性能),buffers是用來給塊設備做的緩衝大小、buffers是用來存儲目錄裏面有什麼內容,權限等等
cached 磁盤緩存(Page Cache)的大小(可提高系統I/O調用的性能),cached用來給文件做緩衝,用來記憶我們打開的文件.
-buffers/cache 表示已被我們的程序使用的內存數,計算方法:used - buffers - cached
+buffers/cache 表示還可已被我使用的內存數,計算方法:free + buffers + cached

操作系統目前可用內存總量=free + buffers + cached,

問題分析

執行:cat /proc/meminfo
在這裏插入圖片描述
參數解釋如下:
MemTotal: 16431704 kB //可用的總內存
MemFree: 1427312 kB //完全未用到的物理內存 LowFree+HighFree
MemAvailable: 14627588 kB //可用的MemAvailable ≈ MemFree+Buffers+Cached,應用程序可用內存數,預先分配給應用及文件使用,可以被釋放,其家屬memfree纔是總的可用內存;
Buffers: 377300 kB //緩衝區內存數,即buffer cache寫緩衝到磁盤的內存臨時存放,
Cached: 12880152 kB //緩存區內存數,即Page Cache讀緩存到內存的臨時空間
SwapCached: 0 kB //被告訴緩衝區cache使用的交換空間使用的大小
Active: 1714236 kB //Active:(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE])活躍中的高速緩存區使用的頁面文件大小
Inactive: 12749900 kB //pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]不常用的高速緩存區頁面文件大小
Active(anon): 1221132 kB //表示anonymous pages,與文件無關的內存(比如進程的堆棧,用malloc申請的內存)也屬於用戶進程的內存頁的一種;最近被訪問過的內存頁
Inactive(anon): 123316 kB //長時間未被訪問過的內存頁
Active(file): 493104 kB //表mapped pages/file pages,與文件關聯的內存(比如程序文件、數據文件所對應的內存頁),屬於用戶進程的內存頁的一種。
Inactive(file): 12626584 kB
Unevictable: 4084 kB
Mlocked: 4084 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 82068 kB // 需要寫入磁盤(等待被寫回磁盤)的內存區大小
Writeback: 0 kB //正在被寫回磁盤的大小
AnonPages: 1210972 kB //未映射頁的內存大小
Mapped: 135868 kB //設備和文件等映射的大小
Shmem: 135256 kB
Slab: 455588 kB //存放內核數據結構緩存,可減少申請和釋放內存帶來的消耗,slabtop 可查看這部分內存的具體使用
SReclaimable: 418912 kB //可收回Slab的大小
SUnreclaim: 36676 kB //不可回收的slab的大小,36676+418912=455588
KernelStack: 5568 kB //常駐內存,每一個用戶線程都會分配一個kernel stack(內核棧),認爲它是kernel消耗的內存,64bit 系統的 task_struct size 是16KB,

32bit的系統task_struct size爲 8KB,每一個用戶線程都會分配一個kernel stack(內核棧),內核棧雖然屬於線程,

但用戶態的代碼不能訪問,只有通過系統調用(syscall)、自陷(trap)或異常(exception)進入內核態的時候纔會用到,也就是說內核棧是給kernel code使用的。

PageTables: 9560 kB //管理內存分頁頁面的索引表的大小
NFS_Unstable: 0 kB //不穩定頁表的大小
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 8215852 kB
Committed_AS: 3231192 kB
VmallocTotal: 34359738367 kB //vmalloc內存區大小,34T
VmallocUsed: 0 kB //vmalloc已經使用的內存
VmallocChunk: 0 kB /vmalloc區可用的連續最大塊的大小
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 155516 kB //描述線性映射空間中,有多個空間分別使用了2M/4K頁映射,直接映射(direct mapping)的內存大小
DirectMap2M: 12427264 kB
DirectMap1G: 6291456 kB

2)vmstat
在這裏插入圖片描述
解釋說明:

procs部分的解釋:
r 列表示運行和等待cpu時間片的進程數,如果長期大於1,說明cpu不足,需要增加cpu。
b 列表示在等待資源的進程數,比如正在等待I/O、或者內存交換等。

cpu部分的解釋:
us 列顯示了用戶方式下所花費 CPU 時間的百分比。us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期大於50%,需要考慮優化用戶的程序。
sy 列顯示了內核進程所花費的cpu時間的百分比。這裏us + sy的參考值爲80%,如果us+sy 大於 80%說明可能存在CPU不足。
wa 列顯示了IO等待所佔用的CPU時間的百分比。這裏wa的參考值爲30%,如果wa超過30%,說明IO等待嚴重,這可能是磁盤大量隨機訪問造成的,也可能磁盤或者 磁盤訪問控制器的帶寬瓶頸造成的(主要是塊操作)。
id 列顯示了cpu處在空閒狀態的時間百分比

system部分的解釋
in 列表示在某一時間間隔中觀測到的每秒設備中斷數
cs列表示每秒產生的上下文切換次數,如當 cs 比磁盤 I/O 和網絡信息包速率高得多,都應進行進一步調查。

memory部分的解釋
swpd 切換到內存交換區的內存數量(k表示)。如果swpd的值不爲0,或者比較大,比如超過了100m,只要si、so的值長期爲0,系統性能還是正常
free 當前的空閒頁面列表中內存數量(k表示)
buff 作爲buffer cache的內存數量,一般對塊設備的讀寫才需要緩衝。
cache: 作爲page cache的內存數量,一般作爲文件系統的cache,如果cache較大,說明用到cache的文件較多,如果此時IO中bi比較小,說明文件系統效率比較好。

swap部分的解釋
si 由內存進入內存交換區數量。so由內存交換區進入內存數量。
IO部分的解釋
bi 從塊設備讀入數據的總量(讀磁盤)(每秒kb)。
bo 塊設備寫入數據的總量(寫磁盤)(每秒kb)

3)hcache

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章