哈喽大家好,我是咸鱼。

今天收到了一个告警,说有台服务器上的 swap 过高,已经用了 50% 以上了。

登录机器查看一下内存以及 swap 的使用情况。

[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 62G 27G 2.9G 568M 32G 33G
swap: 16G 8.3G 8.1G

可以看到还有 2.9G 的空闲物理内存,但是系统已经开始使用 swap 了,初步判断是机器上面的程序内存需求比较大,但物理内存不够用所以开始使用 swap 来存储部分数据。

什么是 swap

swap 顾名思义指的是 Linux 上的交换分区,有点像 Windows 的虚拟内存,说白了就是把一块磁盘空间或者一个本地文件当成内存来使用

在早期内存价格昂贵的时代,swap 的出现解决了物理内存不足导致无法运行程序的问题。

swap 包含换出和换入两个过程:

  • 换出:把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
  • 换入:进程再次访问这些内存数据时,把它们从磁盘读到内存来。

那现在随着内存越来越便宜,服务器上面的内存也越来越大,swap 是不是就没啥作用了呢?

不是的,对于程序来说,内存再大也有不够用的时候。比如说内存不足的时候,有些程序不希望被 OOM 杀死,而是希望等待一段时间让人工来处理,或者等系统自动释放其他进程的内存之后再分配给它。

又比如我们常见的笔记本电脑的休眠和快速开机的功能确实是基于 swap 的。在休眠时,操作系统会将当前内存的状态保存到交换空间或者称为休眠文件中,然后关闭计算机。当再次开机时,系统可以直接从休眠文件中恢复内存状态,而不需要重新加载应用程序和初始化系统,从而实现了快速开机的功能。

在 Linux 中,/proc/sys/vm/swappiness 用来调整使用 swap 的积极程度。swappiness 的范围是 0-100,数值越大,越积极使用 swap。一般来讲默认值是 60 。

需要注意的是:这个范围是 swap 积极程度的权重,即使我们设置成 0,在某些情况下(例如进程可用内存耗尽了)还是会使用 swap 的。

排查过程

首先我们来看下 swap 的积极程度。

[root@localhost ~]# cat /proc/sys/vm/swappiness
60

swappiness 显示的是默认值 60,这是一个相对中和的配置,所以系统会根据实际情况来选择是回收可用缓存以增加可用内存空间,还是使用交换空间来增加可用内存空间。

接下来我们要找出是哪些进程使用到了 swap。在 Linux 中,可以用 proc 文件系统来查看进程 swap 换出的虚拟内存大小,它保存在 /proc/pid/status 的 Vmswap 字段中。

但是一台服务器中有这么多进程,一个一个找太麻烦了,所以我们可以使用下面的命令来找出当前系统中 swap 占用最大的几个进程,并列出它们的进程号、进程名和 swap 大小。

[root@localhost ~]# for file in /proc/*/status ; do awk '/Vmswap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
java 153707 3245376 kB
java 153544 1757916 kB
java 172612 732100 kB
java 323072 339756 kB
java 172807 161988 kB
  1. for file in /proc/*/status ; do ... done:这是一个 for 循环,它遍历了 /proc 目录下的所有子目录,每个子目录都包含一个名为 status 的文件,其中包含了该进程的一些状态信息。
  2. awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file:对于每个 /proc/*/status 文件,awk 命令用于匹配 VmSwapName 或者 Pid 这几个关键字,并输出它们的值。这些关键字分别表示交换空间、进程名和进程号。
  3. sort -k 3 -n -r:对输出的结果进行排序。-k 3 表示按第三列进行排序,即按照交换空间大小排序;-n 表示按照数字顺序排序;-r 表示逆序排序,即从大到小排序。
  4. head -5 :输出排序后的前5行。

从输出的结果可以看到,使用 swap 比较多的是 java 进程。

如何解决

在定位到是哪些进程使用 swap 比较高之后,我们找到对应的开发同事进行讨论,最后决定把 swap 关掉。通常来讲,降低 swap 的使用,可以提高系统的整体性能。

一方面是因为频繁地进行 swap 操作,会导致大量的磁盘读写操作,降低系统的响应速度和整体性能。

另一方面是因为频繁地将数据从内存交换到 swap 空间,并在需要时再次交换回来时,会增加 CPU 和内存的负担。

如何关闭 swap ?

首先使用 swapoff 命令关闭当前正在使用的交换空间。

[root@localhost ~]# swapoff -a

然后我们看下 swap 空间是否已经关闭,如果输出为空则表示 swap 成功关闭。

[root@localhost ~]# cat /proc/swaps

需要注意的是,前面的 swap 关闭操作只是临时关闭,如果机器重启是会重新开启 swap 的。

所以为了下一次重启机器后 swap 还是关闭状态我们还要编辑 /etc/fstab 文件,将其中关于 swap 的配置注释掉或者删除掉。

# 找到以 swap 标识的行,然后注释
[root@localhost ~]# vim /etc/fstab
# /dev/mapper/centos-swap swap swap

这样如果机器后面要是重启了,swap 依旧是关闭状态。

线上机器 swap 过高导致告警的更多相关文章

  1. 线上服务器CPU彪高的调试方式

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/2fee7b91-f ...

  2. expect结合ssh遍历线上机器

    有个需求,有个文件删除了,但是不确定线上机器还都存不存在 #!/home/work/.jumbo/bin/expect -f set timeout - set mac [lindex $argv ] ...

  3. 使用expect快速登录线上机器

    背景: 公司登陆线上服务器一般都要经过跳板机才能登陆,过程比较麻烦,如果要频繁登陆某个机器而且机器名不好记很费劲,使用expect自动登陆会方便很多 实现: 使用expect脚本自动登陆: #!/us ...

  4. 线上cpu使用率过高解决方案

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top命令得到 ...

  5. 如何在linux平台上编译安装zlib软件(公司部分线上机器缺少zlib不能安装supervisor)

    文章在Centos  6.5 linux平台上演示一下如何进行编译安装zlib软件,并配置相关的选项加载使用.示范从下载到安装并配置进行使用过程一系列整套讲解,希望可以给网友考虑使用,谢谢.   工具 ...

  6. 公司机器(线上机器)启动ftp任务的命令

    这个命令: /usr/local/proftp/sbin/proftpd 注意要在root账户,并且kill掉原来的同名进程.

  7. 线上CUP负载过高排查方法

      1.top命令查看线程占据的CPU 注意:上面行的cpu是多个内核的平均CPU,不可能超过100% 下面的cpu是每个进程实际占用的cpu,可能超过100% 备注:查看多个内核cpu,只需要在输入 ...

  8. 记一次线上由nginx upstream keepalive与http协议"协作"引起的接口报错率飙高事件

    年前接到个任务,说要解决线上一些手机客户端接口报错率很高的问题.拿到了监控邮件,粗略一看,各种50%+的错误率,简直触目惊心.这种疑难杂症解决起来还是挺好玩的,于是撸起袖子action. 最终的结果虽 ...

  9. 线上CPU100%?看看这篇是怎么排查的!

    前言 作为后端开发工程师,当收到线上服务器CPU负载过高告警时,你会这么做?重启服务,忽略告警?不过在我看来一个合格的工程师是一定要定位到具体问题所在的,从而 fix 它.下面记录一下线上服务器 CP ...

  10. 转:一篇讲线上优化查 CPU的脚本

    原文链接:https://my.oschina.net/leejun2005/blog/1524687   摘要: 本文主要针对 Java 服务而言 0.背景 经常做后端服务开发的同学,或多或少都遇到 ...

随机推荐

  1. VUE3子表格嵌套分页查询互相干扰的问题解决

    VUE3在表格中嵌套子表格子表格的分页查询互相干扰的问题解决 简单嵌套 如果不需要做子表格的分页查询,那么可以直接在主表格中嵌套子表格,有两种方式:一种是主表格加载的同时加载子表格数据,另一种是点击展 ...

  2. Spring一套全通3—AOP编程

    百知教育 - Spring系列课程 - AOP编程 第一章.静态代理设计模式 1. 为什么需要代理设计模式 1.1 问题 在JavaEE分层开发开发中,那个层次对于我们来讲最重要 DAO ---> ...

  3. Windows系统phpstudy+PbootCMS搭建网站记录

    环境 Windows 10 phpstudy v8.1           下载地址:https://www.xp.cn/download.html PbootCMS v3.2.4  下载地址:htt ...

  4. Advanced Installer添加快捷方式和卸载功能

    依次点击左侧"资源 "中的"文件和文件夹"选中"应用程序快捷方式文件夹 ",在右侧空白处右键-新建快捷方式 在弹出的对话框中,选择需要创建快 ...

  5. 一图看懂iPhone 15系列:15/Plus/Pro/Pro Max有啥区别?详细配置对比

    距离iPhone 15系列发布只剩下2天(北京时间9月13日凌晨1点),即将推出预计分别是iPhone 15.iPhone 15 Plus,以及Pro系列的iPhone 15 Pro以及iPhone ...

  6. 案例:OGG目标端进程ABENDED处理

    源端环境:RHEL 6.5 + Oracle 11.2.0.4 RAC + OGG 19.1.0.0.4 目标端环境:RHEL 7.6 + Oracle 19.3 + OGG 19.1.0.0.4 故 ...

  7. RabbitMQ 使用细节 → 优先级队列与ACK超时

    开心一刻 今天坐在太阳下刷着手机 老妈走过来问我:这么好的天气,怎么没出去玩 我:我要是有钱,你都看不见我的影子 老妈:你就不知道带个碗,别要边玩? 我:...... 优先级队列 说到队列,相信大家一 ...

  8. NC17889 新建 Microsoft Office Word 文档

    题目链接 题目 题目描述 CSL正在学习<计算机办公自动化>文件的建立与删除. CSL发现,当他新建一个word文档时,会得到一个名为"新建 Microsoft Office W ...

  9. NC15445 wyh的吃鸡

    题目链接 题目 题目描述 最近吃鸡游戏非常火,你们wyh学长也在玩这款游戏,这款游戏有一个非常重要的过程,就是要跑到安全区内,否则就会中毒持续消耗血量,我们这个问题简化如下 假设地图为n*n的一个图, ...

  10. NC24623 Tree Decoration

    题目链接 题目 题目描述 Farmer John is decorating his Spring Equinox Tree (like a Christmas tree but popular ab ...