【swap】swap使用过高的处理方法

生产有一台主机Swap使用很高,一看内存使用率高,基本耗尽。

Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。

即使你的程序运行结束后,Cache Memory也不会自动释放。

这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。

那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。

这样,系统总是在物理内存不够时,才进行Swap交换。

Swap分区在什么时候会使用,是受参数swappiness来控制的。

这个参数值可为 0-100,控制系统 swap 的使用程度。

高数值可优先系统性能,在进程不活跃时主动将其转换出物理内存。

低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。

默认值为 60,这只是一个权值,不是一个百分比值,涉及到系统内核复杂的算法。

# cat /proc/sys/vm/swappiness

【swap】swap使用过高的处理方法_第1张图片

【swap】swap使用过高的处理方法_第2张图片

【swap】swap使用过高的处理方法_第3张图片

【swap】swap使用过高的处理方法_第4张图片

通常,Swap使用过高的处理方法主要有:

1.扩物理内存;

2.调整swappiness参数;

3.扩Swap。

查看发现,我们的swappiness设置的是10,也就是说当物理内存大约剩余10%时,就会使用Swap分区,所以说没有什么调整空间了,当然调成0也可以。

这里我们采用的是扩物理内存的方法。

联系主机机侧扩容,扩容后物理内存可用20多G,但是Swap不会释放。

这时候,就想知道是哪些程序使用了Swap,于是通过脚本查询出使用Swap的top10进程。

# cat check_swap.sh

###########################

#!/bin/bash

pids=`for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{j=j+$2}END{print '"$i"',j/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10 | awk '{print $1}'`

for pid in ${pids}; do  ls -lt /proc/${pid}/cwd; done

for i in $( cd /proc;ls |grep "^[0-9]"|awk ' $0 >100') ;do awk '/Swap:/{j=j+$2}END{print '"$i"',j/1024"M"}' /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10

###########################

【swap】swap使用过高的处理方法_第5张图片

增加内存资源后,根据脚本找到相关pid和进程,重启,释放swap。

参考

Swap使用过高处理

https://mp.weixin.qq.com/s/IMfmw_lfROT2YDN-gTeizA

为什么大部分应用的运行都建议关 swap?

https://www.jianshu.com/p/8690d6bcf059

你可能感兴趣的:(Linux,swap)