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参数、堆内堆外内存使用情况,以及堆内存映像等来确定原因;