Linux服务器Swap使用过高


简单记录一下问题的排除过程,和对应的处理方式!

Linux服务器Swap使用过高

收到告警反馈,发现某台服务器上面,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

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !