线上机器 swap 过高导致告警

简介: 线上机器 swap 过高导致告警

哈喽大家好,我是咸鱼。

今天收到了一个告警,说有台服务器上的 swap 过高,已经用了 50% 以上了。
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 依旧是关闭状态。

相关文章
|
消息中间件 NoSQL Java
springboot redis 实现消息队列
springboot redis 实现消息队列
925 1
|
机器学习/深度学习 网络协议 Java
聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)
聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)
|
存储 前端开发 安全
webhook是什么 与API的区别在哪里
webhooks是一个api概念,是微服务api的使用范式之一,也被成为反向api,即:前端不主动发送请求,完全由后端推送。 举个常用例子,比如你的好友发了一条朋友圈,后端将这条消息推送给所有其他好友的客户端,就是 Webhooks 的典型场景。
webhook是什么 与API的区别在哪里
|
Ubuntu Linux
Manjaro Linux 安装 deb 软件包
“记得上次用 Manjaro Linux 的时候,还是上次:)”。三年前,工作都是在 Linux 下完成的——那时候的我还没买苹果电脑,每天的快乐就是折腾 Linux 发行版……
665 0
|
Oracle JavaScript Java
JDK的版本迭代特性(JDK9 - JDK20)
JDK的版本迭代特性(JDK9 - JDK20)
|
5月前
|
人工智能 自然语言处理 前端开发
API赋能:从大模型到智能应用的“最短路径”
在AI技术迅猛发展的今天,大模型已成为智能应用的核心驱动力。本文探讨如何通过API这一“数据桥梁”,高效对接大模型,实现智能应用开发。内容涵盖API的核心价值、分类与适用场景,API对接的关键实践步骤,以及如何通过前后端分离、AI Agent和低代码平台等新范式提升开发效率。结合医疗影像分析与智能教育平台等案例,展示API如何改变传统开发模式。展望未来,随着模型即服务(MaaS)和智能化API的发展,智能应用开发将迈向更广阔的新时代。
|
5月前
|
人工智能 Serverless 数据处理
AI练习场|如何从多模态文件中自动提取有效信息?
本文介绍了利用AI技术进行多模态文件信息抽取的实战教程,涵盖从文档、图像、音视频等多种数据中自动提取关键信息的技术方案。通过阿里云百炼模型与函数计算服务,实现高效数据处理,适用于信息提取、图片分类、音视频分析等场景,提升数据处理效率与准确性。
AI练习场|如何从多模态文件中自动提取有效信息?
|
11月前
|
前端开发 Java API
SpringBoot整合Flowable【06】- 查询历史数据
本文介绍了Flowable工作流引擎中历史数据的查询与管理。首先回顾了流程变量的应用场景及其局限性,引出表单在灵活定制流程中的重要性。接着详细讲解了如何通过Flowable的历史服务API查询用户的历史绩效数据,包括启动流程、执行任务和查询历史记录的具体步骤,并展示了如何将查询结果封装为更易理解的对象返回。最后总结了Flowable提供的丰富API及其灵活性,为后续学习驳回功能做了铺垫。
884 0
SpringBoot整合Flowable【06】- 查询历史数据
|
安全 JavaScript 前端开发
在Linux中生成随机数的各种方法
在计算机编程中,生成随机数是一项常见的任务,用于模拟实际情况、加密、游戏设计等。Linux系统提供了多种方法来生成随机数。本文将介绍Linux环境下生成随机数的几种常用方法,包括伪随机数生成器、/dev/random 和 /dev/urandom 设备、以及使用编程语言生成随机数。
1503 3
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
230 3