OS的监控告警,swap占用超过80%,记录解决思路
事件
监控告警Linux系统的swap占用超过80%。
相关知识
Swap使用过高解决方法
首先要保证内存剩余要大于等于swap使用量,否则会宕机!根据内存机制,swap分区一旦释放,所有存放在swap分区的文件都会转存到物理内存上。通常通过重新挂载swap分区完成释放swap。
1 2 3 4
| Swapoff –a 或 swapoff /dev/sda2
Swapon –a 或 swapon /dev/sda2
|
内存占用多少后启动物理内存
cat /proc/sys/vm/swappiness
60
上面这个60代表物理内存在使用60%的时候才会使用swap
swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,
swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
通常情况下:
swap分区设置建议是内存的两倍 (内存小于等于4G时),如果内存大于4G,swap只要比内存大就行。另外尽量的将swappiness调低,这样系统的性能会更好。
修改swappiness参数
临时性修改:
sysctl vm.swappiness=10
vm.swappiness = 10
cat /proc/sys/vm/swappiness
10
永久性修改:
vim /etc/sysctl.conf
vm.swappiness = 35
sysctl -p
查看是否生效:
cat /proc/sys/vm/swappiness
35
检查哪个进程使用最多swap内存
手动命令:
在 top 命令中,按 f,就是 field 的意思,调出列选项,把 swap 列显示出来,然后按 O,大写的,应该是 order 的意思,选择按照 swap 列进行排序,可以看到下面的结果
脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #!/bin/bash
echo -e "PID\t\tSwap\t\tProc_Name"
for pid in `ls -l /proc | grep ^d | awk '{ print $9 }'| grep -v [^0-9]` do if [ $pid -eq 1 ];then continue;fi grep -q "Swap" /proc/$pid/smaps 2>/dev/null if [ $? -eq 0 ];then swap=$(grep Swap /proc/$pid/smaps \ | gawk '{ sum+=$2;} END{ print sum }') proc_name=$(ps aux | grep -w "$pid" | grep -v grep \ | awk '{ for(i=11;i<=NF;i++){ printf("%s ",$i); }}') if [ $swap -gt 0 ];then echo -e "${pid}\t${swap}\t${proc_name}" fi fi done | sort -k2 -n | awk -F'\t' '{ pid[NR]=$1; size[NR]=$2; name[NR]=$3; } END{ for(id=1;id<=length(pid);id++) { if(size[id]<1024) printf("%-10s\t%15sKB\t%s\n",pid[id],size[id],name[id]); else if(size[id]<1048576) printf("%-10s\t%15.2fMB\t%s\n",pid[id],size[id]/1024,name[id]); else printf("%-10s\t%15.2fGB\t%s\n",pid[id],size[id]/1048576,name[id]); } }'
|
补充
- 打开大的文件或物理内存被占用,都可能导致swap过高。
- 内存很大的机器建议直接不要swap内存
- 最后gan