一、需求说明
有些服务器因为历史原因和特殊需求分配的swap空间比较大,服务器长时间运行后发现swap空间使用率很高。我们知道swap实际上是使用的硬盘空间,比起内存运行会慢很多。那到底是哪些进程占用了大量的swap空间呢?又如何释放swap空间呢?
二、查询swap使用前10的进程
1、查看进程占用swap的方法
通过free命令我们可以查看整个系统的内存使用情况,通过top命令我们可以看到每个进程占用的内存、CPU等使用信息,但是没有swap占用多少这方面的信息。实际上在/proc/{pid}/smaps文件里有关于虚拟内存、实际使用内存、swap等使用信息。
2、编写脚本找出swap占用top10进程
/proc/{pid}/smaps文件中每个进程占用的swap是按区单独记录的,需要通过求和得到单个进程占用的swap大小,然后再进行排序找到swap占用空间最大的top10。
smaps
#!/bin/bash
#script name: swap_check.sh
#author: wuhs
#version: v1
#description: 这是一个检查哪些进程使用了SWAP分区的脚本
do_swap () {
SUM=0
OVERALL=0
#获取进程目录
for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
#获取进程PID
PID=`echo $DIR | cut -d / -f 3`
#获取进程名称
PROGNAME=`ps -p $PID -o comm --no-headers`
#获取进程的所有分区中SWAP值
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
do
#进程swap值求和
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - $PROGNAME"
#总共swap分区值求和
let OVERALL=$OVERALL+$SUM
SUM=0
done
echo "Overall swap used: $OVERALL"
}
do_swap > tmp.txt
#查询结果排序并截取top10
cat tmp.txt |awk -F[\ \(] '{print $5,$1,$7}' | sort -n | tail -10
cat tmp.txt |tail -1
rm -rf tmp.txt
3、执行验证
直接执行脚本,可以看到结果按照升序排列展示了占用了top10的进程及每个进程占用的swap空间大小,单位是KB。
三、swap释放方法
1、查看swap使用情况
(base) [root@test tools]# free -h
total used free shared buff/cache available
Mem: 7.6G 360M 288M 148M 6.9G 6.7G
Swap: 1.0G 635M 388M
2、查看swap挂载
(base) [root@test tools]# swapon -s
文件名 类型 大小 已用 权限
/dev/sda2 partition 1048572 650292 -2
3、取消swap挂载
#取消swap挂载的时候会将swap内网逐步复制到内存中,swap占用越大需要的时间越长
(base) [root@test tools]# swapoff /dev/sda2
4、再次挂载swap
(base) [root@test tools]# swapon /dev/sda2
5、查看swap使用情况
(base) [root@test tools]# free -h
total used free shared buff/cache available
Mem: 7.6G 805M 139M 297M 6.6G 6.2G
Swap: 1.0G 0B 1.0G
6、对比前后内存和swap的变化
如下图可以知道是否swap空间需要足够的内存空间,如果内存可用大小小于swap占用大小,请谨慎尝试。