Swap機制
當物理內存不足時,Linux系統會釋放出部分不常用的內存,臨時保存到Swap空間(磁盤空間)中, 等應用程序需要這些內存時再從Swap分區中恢復保存的數據到內存中;
Swap機制只是內存回收策略的一種,內存不足時並不是只能使用swap機制;
Swap大小查看
- free -m(靜態)
- top(動態)
- sar -r -S 1(動態)
內存回收機制
當物理內存不足時,Linux有兩種方式來釋放部分內存
- 方式1:回收Page Cache/Buffer Cache等緩存;
- 方式2:利用Swap機制將部分不常用內存置換到磁盤;
回收內存時具體使用哪種機制由內核決定(有套複雜的算法),不過用戶可以通過swappiness來調整使用 Swap機制的積極程度,swappiness 的範圍是 0-100,數值越大表示越積極使用 Swap,也就是更傾向於使用swap機制;數值越小,越消極使用 Swap,也就是更傾向於回收緩存。查看swappiness的值:
cat /proc/sys/vm/swappiness
查看Swap影響的進程
swap會將不常用的內存置換出去,因此很可能多個進程會受影響, /proc/pid/status文件中記錄了每個進程的詳細信息,其中VmSwap字段表示進程的swap大小,如下圖所示:
利用這個信息,可以通過腳本得到所有進程的swap使用情況,甚至進一步排序及可視化等,按照swap大小排序腳本如下:
# 按VmSwap使用量對進程排序,輸出進程名稱、進程ID以及SWAP用量
for file in /proc/*/status; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
Swap高排查思路
Step1: 確定可疑進程
在top界面中輸入‘M’,使個進程按照佔用內存大小排序,觀察%MEM大小及增長趨勢,將佔用量大以及增長快的進程作爲可疑進程排查;
Step2: 分析進程行爲
Case1: buff/cache佔用內存過大。使用cachetop命令(需安裝bcc-tools)查看進程佔用buff/cache情況,如果buff/cache過大或者增長快,那麼Swap高很有可能是因爲進程在讀寫文件,通過lsof/strace查看進程具體的文件操作;
Case2: 非緩存佔用內存過大。以Java爲例,需要檢查JVM參數、堆內堆外內存使用情況,以及堆內存映像等來確定原因;