问题背景
xxxx 项目中,在内存充足的情况下 swap 被使用,需要优化并释放
问题分析过程
内核参数没有配置:vm.swappiness=0
0表示最大限度使用物理内存,其次才是 swap 空间;
默认值应该是60;
100表示积极的使用 swap 空间,并且把内存上的数据及时搬运到swap空间中
free -h
命令查看结果:swap 空间被使用500M
脚本分析 swap 使用进程:
#!/bin/bash
#Author:whale
#Version:1.0
#Date:2022-11-10
#Description:Analyze swap usage
info_swap () {
##获取/proc下面的进程PID
pid=$(find /proc -maxdepth 1 -regex "/proc/[0-9]+" -type d -printf "%f\n")
##统计各进程的swap使用情况
for i in ${pid}
do
##进程名称
proName=$(ps -p $i -o comm --no-headers)
##swap使用统计
grep 'Swap' /proc/$i/smaps >/dev/null 2>&1
if [ $? -eq 0 ];then
proSwapSum=$(grep Swap /proc/$i/smaps 2>/dev/null | awk '{sum+=$2}END{printf "swapSum=%s",sum}');
echo "pid=$i process=${proName} ${proSwapSum}" >> /tmp/swap.info;
fi
done
}
info_swap
##显示swap空间使用的前10进程后删除相关记录文件
cat /tmp/swap.info |sort -t '=' -k 4 -r |head && rm -rf /tmp/swap.info
分析结果:nginx、mysql、dotnet等关键进程都使用了一部分swap空间
处理方案
-
优化内核参数:echo "vm.swappiness=0" >> /etc/sysctl.conf
-
释放现有的swap空间(测试环境截图举例)
- 查看swap的挂载信息:
swapon -s
(得到具体的挂载磁盘信息)
类似于:
- 取消swap挂载:
swapoff /dev/sda2
这步操作会将swap内容逐步复制到内存中,swap使用的越多,释放的也就越多,相应的命令执行的时间就越长,按照生产环境的经验,释放的速度并不是很快,需要耐心等待一下,也可以再开一个窗口,查看free -h
命令,可以肉眼明显看到使用大小逐步释放,也需要注意本身的内存空间是否还有剩余,是否必须要做现有swap空间释放的操作