简单记录一下问题的排除过程,和对应的处理方式!
收到告警反馈,发现某台服务器上面,swap
内存使用很高,但实际的物理内存使用却不高。随即,登录服务器,查看内存的使用情况和对应的负载情况。
- [1] 查看服务器内存使用情况
Swap: total = used + free
Mem: total = used + free + buff/cache
Mem: available = free + shared + buff/cache
$ uptime
13:24:45 up 7 days, 8:05, 2 users, load average: 19.66, 22.23, 23.26
$ free -g
total used free shared buff/cache available
Mem: 125 75 15 2 34 46
Swap: 63 59 4
- [2] 通过 top/htop 查看内存使用高的进程
# 查看内存
$ top + M
# 查看内存
$ htop + M
# 命令查看占用swap过高的进程
for i in $(cd /proc; ls | grep "^[0-9]" | awk ' $0 >100'); do
awk '/Swap:/{aa=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps
done | sort -k2nr
- [3] 通过查看进程 pid 来确定是哪个服务占用了
# 查看进程
$ ps -ef | grep 8755
ubuntu 8755 8725 16 Feb10 ? 29-08:47:43 /opt/jdkxxx
- [4] 配置内核参数来减少 swap 的使用
如果部署服务的服务器内存足够大的话,其实并没有不必使用太多的 swap
分区,因为直接使用物理内存会更快、更迅速。这时,我们可以通过修改 swappiness
的数值来控制 swap
分区的使用条件。在 Linux
里面,默认设置 swappiness
的值为 60
。
# 查看默认值
$ cat /proc/sys/vm/swappiness
60
设置 swappiness=0
的时候,则表示操作系统将最大限度上的使用服务器的物理内存,即能在物理内存上跑的话就不会再使用 swap
分区了,实在没办法了才会开始使用 swap
分区;设置 swappiness=100
的时候,则表示操作系统将积极的使用 swap
分区,并且把内存上的数据及时的搬运到 swap
分区里面。
# 刷新swap存储
# 将swap里的数据转储回内存,并清空swap里的数据
$ sudo swapoff -a && sudo swapon -a
# 清理缓存
$ sudo sync && $ sudo echo 3> /proc/sys/vm/drop_caches
# 临时修改
$ sudo sysctl vm.swappiness=10
# 永久修改
$ sudo echo "vm.swappiness=10" >> /etc/sysctl.conf
$ sudo sysctl -p
- [5] 查看配置生效情况
$ free -g
total used free shared buff/cache available
Mem: 125 80 25 2 14 46
Swap: 63 2 51