如何排查由于操作系统内存页交换在回收日志中引发的诡异真实耗时

雨敏君_9551

雨敏君_9551

2026-05-27

928人浏览

原创

排查swap导致的日志“诡异耗时”,关键先验证系统是否真在换页:用vmstat 1 5查si/so是否持续非零(si>50 kb/s即可疑),结合sar -b看pgmajfault≥1/秒、/proc/vmstat中pgpgin增量突增,并与日志时间戳对齐sar -w和dmesg确认相关性。

如何排查由于操作系统内存页交换在回收日志中引发的诡异真实耗时

排查因内存页交换(swap)导致的日志中“诡异真实耗时”,关键不是看日志里写了多久,而是要确认那段耗时是否真的由页面换入/换出引发——因为日志打点时间差可能掩盖了底层内存调度的延迟。这类问题常见于服务响应变慢、GC停顿异常、I/O等待飙升但CPU和内存占用表象“正常”的场景。

查清系统是否真在频繁换页

先跳过应用日志,直接验证操作系统级换页行为:

  • 运行 vmstat 1 5,重点观察 si(swap-in,每秒从磁盘读入内存的KB数)和 so(swap-out,每秒写入磁盘的KB数);若连续多行非零(尤其 si > 50 KB/s),说明当前正经历实质性换页压力
  • 执行 grep -E "pgpgin|pgpgout" /proc/vmstat,查看累计换页总量;再隔10秒重复一次,计算差值——若 pgpgin 增量显著,说明有大量缺页需从swap调入,这会直接拖慢进程执行
  • 用 sar -B 1 5 查看 pgmajfault(主缺页次数):每次主缺页若需从swap加载,就会引入毫秒级延迟,且无法被缓存加速

定位具体是哪个进程在触发换页

换页不是全局平均发生的,而是由个别进程的内存访问模式驱动:

协同养育操作系统
协同养育操作系统

协同养育操作系统(Co-Parenting OS)— 离异家庭专业协同养育支持系统。12模块覆盖接送管理、成长记忆库、孩子观察站、亲子关系粘合剂、共同挑战中心、情绪冲突观察、父母成长、成长档案馆、成长阶段引擎、风险预警、驾驶舱、被恶意攻击急救包。当用户涉及离异家庭育儿、协同养育、抚养探视、接送安排、孩子成长记录、亲子关系、离异冲突、被恶意攻击、前任矛盾等话题时触发。

下载
  • 在 top 中按 M 排序,关注 %MEM 高且 VIRT 远大于 RES 的进程(VIRT大表示申请了大量虚拟内存,RES小说明实际驻留少,极易触发换页)
  • 对可疑进程,执行 cat /proc/[PID]/status | grep -E "VmSize|VmRSS|MMUPageSize",比对 VmSize(虚拟内存大小)与 VmRSS(实际物理内存)差距;若相差数倍以上,且该进程恰好处于你日志耗时对应的线程中,高度可疑
  • 用 pidstat -r -p [PID] 1 观察其 minflt(次缺页)和 majflt(主缺页)实时速率;若 majflt 持续 ≥ 1/秒,就说明它每秒都在从swap加载页面,耗时自然不可控

结合日志上下文做交叉验证

把系统指标和日志时间戳对齐,才能确认“耗时”是否真是换页所致:

  • 记录日志中高耗时事件发生的确切时间(精确到秒,如 2026-05-23T07:42:18)
  • 回查该时刻前后30秒的 sar -W(swap使用率)和 sar -B(换页统计)输出;若 %swpused > 70% 且 pgpgin 突增,则强相关
  • 检查同一时段 dmesg -T | grep -i "out of memory\|kill process",确认是否有 OOM killer 干预痕迹——哪怕没杀进程,内核回收压力也会抬高换页延迟

区分“假耗时”和“真换页延迟”

有些日志耗时长,其实和swap无关:

  • 如果 free -h 中 available 仍充足(例如 > 2 GB),而 swap used = 0,那耗时大概率来自锁竞争、网络超时或磁盘I/O,不用查swap
  • 如果 cat /proc/swaps 显示 swap 分区已禁用(空输出),却在 vmstat 中看到 so/si 非零——这是异常,说明内核在用 zram 或 cgroup memory swap,需查 /sys/fs/cgroup/memory/ 下对应组的 memory.memsw.usage_in_bytes
  • Java 应用中若 jstat -gc [PID] 显示 GC 耗时飙升但 survivor 区未满,同时 vmstat 有高频 so,很可能是堆外内存(如 DirectByteBuffer)触发了系统级换页,而非JVM堆内GC

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

操作系统

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
视频服务器配置参数有哪些
视频服务器配置参数有哪些

视频服务器配置参数有处理器、内存、存储、视频编解码器、网络接口、视频输入输出接口、操作系统、安全性、环境适应性和成本。在搭建视频服务器时,需要根据实际需求和预算,合理选择这些参数,以实现高性能、高稳定性和低成本的目标。

2023.10.17

4540

11

linux的操作系统介绍
linux的操作系统介绍

Linux是一个灵活、稳定、安全的操作系统,适用于各种不同的应用场景,从个人电脑到服务器和嵌入式系统。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.20

3566

12

Linux操作系统的主要用途
Linux操作系统的主要用途

Linux操作系统用途广泛,包括:服务器运营,软件开发,科学研究和教育,嵌入式系统,以及个人电脑和笔记本电脑。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.21

6219

8

linux操作系统的作用
linux操作系统的作用

linux操作系统在以下领域发挥着关键作用:服务器和云计算;嵌入式系统;个人电脑和笔记本电脑;超级计算;其他领域等等。想了解更多linux操作系统的相关内容,可以阅读本专题下面的文章。

2024.04.12

2895

5

有哪些常见的网络操作系统
有哪些常见的网络操作系统

常见的网络操作系统有windows server、linux、unix、macos server、freebsd、cisco ios、juniper junos和hp-ux等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.12

3464

6

32位操作系统怎么改成62位的
32位操作系统怎么改成62位的

要将 32 位操作系统升级到 64 位,需要遵循以下步骤:1. 检查硬件和软件兼容性;2. 备份数据;3. 获取 64 位操作系统;4. 创建可启动安装媒体;5. 从安装媒体启动计算机;6. 选择“升级”选项;7. 完成安装。

2025.04.02

3463

9

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

0

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

ubuntu官方总文档
ubuntu官方总文档

共0课时 | 0人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 20.5万人学习