簡介: Linux系統診斷-内存基礎
1. 背景談及linux内存,很多時候,我們會關注free,top等基礎命令。當系統遇到異常情況時,内存問題的根因追溯,現場診斷時,缺乏深層次的debug能力。本篇幅不做深層讨論,能把當前系統的問題描述清楚,是每個SRE應該具備的最基礎能力。
2. free2.1 free命令原理
free是通過查看 /proc/meminfo 來獲取内存的使用情況。但是 /proc/meminfo 這個文件又是怎麼來的?我們先了解下 /proc 目錄:
結論: /proc/meminfo 是 /proc 文件系統下保存你内存相關信息的"僞文件"。
2.2 命令輸出簡介
每個發行版輸出都有一定差異,我們以debian8 4.19.x發行版為例。
root@4f996feeb851:~# free -m
total used free shared buffers cached
Mem: 1991 1909 81 4 155 836
-/ buffers/cache: 917 1073
Swap: 1023 1 1022
大部分的命令輸出意思,大家可以在man文檔中找到解析,這裡不做贅述。
2.3 buffer和cache會使用内存嗎?
答案是肯定的,先來了解下buffer和cache。
然而,free命令所展示的buffer和cache 有點狹義的意思——free展示的buffer表示 塊設備所占用的緩存 、free展示的cache表示普通文件占用的the page cache(緩存頁) 。
總之,buffer和cache使用的内存都是用來加速Linux讀寫性能,如果有新的進程需要内存,系統會将buffer和cache占用的内存回收,并重新分配給進程使用。
2.4 其他内存概念
RSS & VSZ & PSS & USS
usedMem分為 active & inactive
Linux會維護一個LRU List用來管理活動頁和非活動頁的回收。 簡單講, 越接近該List的末尾,該頁面被回收的概率就越大,反之,越接近列首,則更不易被回收。 linux内核會維護兩類LRUList——active list和inactive list,剛訪問過的頁面放入active list,長時間未訪問的頁面放入inactive list,内核線程kswapd會定期将active list中的頁面移至 inactive list中。
如果系統的inactive的内存過大,可以通過如下操作對其做回收。sync; echo 3 > /proc/sys/vm/drop_caches
3. 虛拟内存現代x86系統,計算機能夠使用的内存會大于其物理内存的上限,依靠的就是虛拟内存機制。Linux支持虛拟内存機制和實模式機制。
實模式下,計算機會直接申請物理内存, 虛拟内存機制下,系統會把磁盤當成内存的擴展,已增加可使用的内存大小。并通過映射map的機制,來保存和物理内存的真實對應關系。
在磁盤和内存之間傳送Page的活動叫做swapping或者頁面調度(paging),被用作虛拟内存的磁盤分區稱為swap。
可以通過在線添加swap的方式臨時緩解内存不足的問題,但一般不能直接作在線減少swap的操作,很有可能導緻進程的crash。具體swap配置方式見5.1swap相關配置。
4. OOM1.What is OOM?Out Of Memory killer 是 Linux 的一種系統保護機制,在系統内存緊張時,kill掉某些進程防止系統卡死。系統通過打分機制,來實施對進程的殺死操作。默認機制是通過掃描所有進程的内存占用,cpu占用等因素,然後打分 (badness),分數越高,進程被kill的優先級就越高。
2.哪些行為會讓系統對進程進行打分?
3.在哪兒可以看到進程的打分?/proc/<pid>/oom_score
4.手動調整分數/proc//oom_adj 該文件可以用于調整在oom發生時,哪些進程應該被kill,範圍-16 -- 15 ,默認值為0,
特殊值-17:表示進程永遠不會被kill。
5.我怎麼知道系統有沒有觸發過OOM?/var/log/messages 、 /var/log/syslog 系統日志或者 dmesg 系統日志診斷工具等都能夠找到網圖如下:
5. 内存相關配置
5.1 swap相關配置
1. 簡介
swappiness範圍0-100,默認60
0: 表示禁止使用swap
60: 默認
100: 瘋狂使用swap
2. 操作方法
# sysctl vm.swappiness=VALUE
# sysctl vm.swappiness=20
或者
# echo VALUE > /proc/sys/vm/swappiness
# echo 30 > /proc/sys/vm/swappiness
1. 需要root用戶
2. 創建存儲文件
# dd if=/dev/zero of=/home/swap2G bs=1024 count=2M
3. 安全設置
# chown root:root /home/swap2G
# chmod 0600 /home/swap2G
4. 創建liunx交換分區
# mkswap /home/swap2G
5. enable 交換分區
# swapon /home/swap2G
6. 更新fstab文件【注意: 部分操作系統不需要】
# vim /etc/fstab
/home/swap2G none swap sw 0 0
7. 檢查是否生效
#free -m
8. 卸載swap分區
# swapoff /home/swap2G
5.2 緩存相關
sync; echo 3 > /proc/sys/vm/drop_caches
0:不釋放
1:釋放頁緩存
2:釋放 dentries 和 inodes
3:釋放所有緩存
5.3 OOM相關
6. 結語
如有纰漏歡迎指正。
作者:SRE團隊技術小編-小淩
本文為阿裡雲原創内容,未經允許不得轉載
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!