一、需求说明

  有些服务器因为历史原因和特殊需求分配的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占用大小,请谨慎尝试。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐