讲师中心 微信公众号
AI工具推荐 视频效率加速

大量脏页但 iostat 看不出哪个盘特别忙的 anon page / page cache 分析

风敏姑娘_4446

风敏姑娘_4446

发布时间:2026-01-28 18:43:02

|

962人浏览过

|

来源于php中文网

原创

iostat 看不到脏页刷盘热点,因其指标是块设备层聚合值,而脏页回写可能被拆分、延迟、走不同路径(如 swapfile)、受 cgroup 限制或 SSD 特性掩盖;需结合 vmstat、perf、bpftrace 等工具定位真实源头。

大量脏页但 iostat 看不出哪个盘特别忙的 anon page / page cache 分析

为什么 iostat 看不到脏页刷盘热点

iostat 显示的 %util 和 await 是块设备层的聚合指标,而脏页回写(尤其是 anon 页面 swap 和 page cache 回写)可能被内核拆成小 IO、合并延迟、或走不同路径(比如 swapfile vs swap partition、direct reclaim vs kswapd、writeback throttling),导致 IO 分散到多个设备或被 buffer 层掩盖。更关键的是:脏页不一定立刻触发磁盘 IO —— 它们可能卡在 writeback 队列里等 dirty_ratio 触发,或被 vm.dirty_background_ratio 延迟处理。

  • vm.dirty_background_ratio 和 vm.dirty_ratio 设置偏高时,脏页堆积但无实际 IO 流出
  • 使用 swapfile(而非 swap partition)时,回写走普通文件路径,iostat 无法区分是应用写文件还是内核写 swap
  • 启用 memcg 时,脏页限制和回写由 cgroup 控制,全局 iostat 不反映 per-cgroup 压力
  • SSD 或 NVMe 上 await 极低,%util 失去参考意义 —— 即便每秒刷 2GB 脏页,也可能显示 %util < 10%

定位 anon page 刷 swap 的真实源头

不要只盯 swapon -s 或 /proc/swaps,得看谁在触发 try_to_unmap 和 swap_writepage。优先检查:

  • 用 cat /proc/vmstat | grep -E "(pgpgin|pgpgout|pswpin|pswpout)" 对比 pswpout(换出页数)是否持续上涨,确认 anon 刷盘真实发生
  • 查 /sys/kernel/debug/tracing/events/vmscan/mm_vmscan_kswapd_sleep 和 mm_vmscan_direct_reclaim_begin 跟踪回收触发源
  • 运行 perf record -e 'sched:sched_process_exit,kmem:mm_page_alloc,swap:swap_writepage' -g -- sleep 30,再用 perf script | grep -A5 swap_writepage 看调用栈 —— 常见源头是 shrink_inactive_list → try_to_unmap → swap_writepage
  • 若用 cgroup v2,检查 /sys/fs/cgroup/memory.max 和 /sys/fs/cgroup/memory.stat 中的 swap.internal 和 pgpgout,确认是否某个容器内存超限被迫 swap

page cache 脏页不落地的隐蔽原因

大量 dirty page cache 却没看到对应磁盘写入,常见于以下情况:

财经热点新闻爬取与话题归纳系统
财经热点新闻爬取与话题归纳系统

抓取主流财经网站实时热点,提供混合评分与专业HTML报告,支持快讯采集和话题归纳。

下载
  • 挂载选项含 noatime,nodiratime,relatime 不影响,但 barrier=0 或 commit=60(ext4)会显著拉长回写间隔
  • vm.dirty_expire_centisecs 设为 30000(5 分钟)时,脏页可滞留很久才被 writeback 线程处理
  • 使用 XFS 且启用了 logbsize + logbufs,日志提交延迟掩盖了数据写入节奏
  • 进程调用 sync_file_range() 或 posix_fadvise(..., POSIX_FADV_DONTNEED) 主动丢弃 page cache,但未触发 writeback —— 此时 /proc/meminfo 的 Dirty 不变,但 Writeback 可能突增
  • 检查 /proc/sys/vm/block_dump(已废弃,仅用于老内核)或用 bpftrace -e 'kprobe:balance_dirty_pages: { printf("dirty=%d writeback=%d\n", @dirty, @writeback); }' 抓实时决策点

快速验证当前脏页压力是否真实影响性能

别依赖 free -h 的 Dirty 字段 —— 它只是快照。要看动态行为:

  • 执行 echo 1 > /proc/sys/vm/drop_caches 后立刻 watch -n1 'cat /proc/meminfo | grep -E "(Dirty|Writeback|Reclaimable)"',观察 Writeback 是否飙升并长时间不降 —— 这说明回写线程卡住或磁盘响应慢
  • 对比 cat /proc/pressure/memory 中 some 和 full 的 10s/60s/300s 值:若 full 持续 > 10%,说明进程因内存回收(含 swap 写入)被直接 throttle
  • 用 iotop -oPa 查看 COMMAND 列是否出现 [kswapd0] 或 [ksmd] 占用高 IO%,这是最直接的脏页压力信号
  • 注意 /proc/sys/vm/compact_unevictable_allowed 若为 1,内存碎片整理可能阻塞 page reclaim,间接拖慢 dirty page 回收

真正难的不是看到脏页,而是判断它是否正在变成瓶颈 —— 很多时候 Dirty 高但系统平稳,因为内核把压力消化在 background writeback 里;而另一些时候 Dirty 才 200MB,却因 SSD 限速或 swapfile 文件锁争用,让 kswapd 卡在 submit_bio,这时 iostat 依然安静。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

828

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6067

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2568

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6067

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2568

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6067

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2568

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn