0

0

大量脏页但 iostat 看不出哪个盘特别忙的匿名页/缓存排查

冷漠man

冷漠man

发布时间:2026-01-25 14:41:02

|

305人浏览过

|

来源于php中文网

原创

脏页堆积但iostat无磁盘热点,主因是swap、tmpfs或共享匿名映射产生的脏页不经过块设备I/O路径;需查pswpout、/proc/swaps、tmpfs使用量及mmap(MAP_ANONYMOUS|MAP_SHARED)进程。

大量脏页但 iostat 看不出哪个盘特别忙的匿名页/缓存排查

脏页堆积但 iostat 无明显磁盘热点,先确认脏页来源类型

Linux 的 dirty_pages 不一定都来自文件系统写回——匿名页(如进程堆、mmap 私有匿名区)的换出(swap)也会产生脏页,但这类页不走 pdflushwriteback 路径,不会触发块设备写请求,因此 iostat 看不到对应磁盘 activity。此时 /proc/meminfo 中的 Dirty:Writeback: 可能偏高,但 pgpgout(每秒换出页数)和 pswpin/pswpout(swap in/out 次数)才是关键线索。

  • 运行 grep -E "Dirty|Writeback|pgpgout|pswpin|pswpout" /proc/vmstat,若 pswpout 显著上升而 pgpgout 增长平缓,基本可断定是 swap 引起的脏页堆积
  • 检查 /proc/swaps 是否启用 swapfile 或 swap partition;用 swapon --show=NAME,TYPE,SIZE,USED,PRI 确认活跃 swap 设备
  • 注意:即使 swapon -s 显示 swap 已关闭,内核仍可能因 vm.swappiness=100 或内存压力在 tmpfs(如 /dev/shm)上触发匿名页回收,这部分页会标记为 dirty 但不落地到磁盘

排查 tmpfs 和 shm 匿名页污染

tmpfs 是基于内存的文件系统,其内容本质是匿名页,且默认可被 swap。当应用往 /dev/shm 或自挂载的 tmpfs 写入大量数据(如数据库 shared memory segment、大 buffer mmap),这些页一旦变 dirty,就计入 Dirty: 统计,但不会触发块设备 I/O——因为没磁盘后端

  • df -t tmpfs 查看所有 tmpfs 挂载点使用量,重点关注 /dev/shm/run/sys/fs/cgroup 下的子挂载
  • 对可疑挂载点执行 find /dev/shm -type f -ls | sort -k7nr | head -10,找大文件或已删除但未释放的“幽灵文件”(lsof +L1 可辅助定位)
  • 临时禁用 tmpfs swap 行为:挂载时加 noexec,nosuid,nodev,mode=1777,size=2G,mpol=bind:0 并设 vm.mmap_min_addr=65536 减少 mmap 分配风险;长期方案需控制应用内存使用模式

确认是否 mmap(MAP_ANONYMOUS|MAP_SHARED) 导致脏页无法回收

共享匿名映射(mmap(..., MAP_ANONYMOUS|MAP_SHARED))产生的页,在 fork 后被子进程修改时会触发写时复制(COW),但若父/子均未调用 msync(MS_SYNC)munmap,这些页会持续处于 dirty 状态,且不归属任何文件,无法通过 syncecho 3 > /proc/sys/vm/drop_caches 清理。

  • cat /proc/[pid]/maps | grep -E "anon|shared" | awk '{print $5,$6}' | sort | uniq -c | sort -nr 扫描各进程的匿名共享映射大小
  • 结合 pstack [pid]lsof -p [pid] | grep mem 判断是否为数据库(PostgreSQL shared memory)、JVM(-XX:+UseSHM)、或自定义 IPC 使用了该模式
  • 这类页的生命周期由进程控制:只有进程退出、显式 munmap 或触发 OOM killer 才会真正释放;echo 1 > /proc/sys/vm/compact_memory 对它们无效

为什么 iostat 看不出问题?关键在 writeback vs swap vs tmpfs 路径分离

iostat 统计的是 blk_mq_make_request 层面的块设备 I/O,只覆盖文件系统 writeback 和 swap device I/O。而 tmpfs 页面回收走的是 shrink_slabshrink_page_listtry_to_unmap 路径;匿名页 swap out 走的是 swap_writepagesubmit_bio,但如果 swap 是 file-backed(swapfile),且该文件本身在 ext4/xfs 上,I/O 会被归入对应 block device;但若 swap 是 LVM LV 或 zram,iostat -x 需指定对应设备名(如 zram0)才可见。

  • 运行 iostat -x 1 3 时务必加上 -d 参数并列出所有块设备:lsblk -d -o NAME,TYPE,SIZE,ROTA,MODEL,避免漏看 zram、loop、nvme ns
  • cat /proc/buddyinfocat /proc/pagetypeinfo 可辅助判断是否因内存碎片导致 direct reclaim 频繁,进而推高 dirty page 回收延迟
  • 最易忽略的一点:某些容器运行时(如 containerd + overlayfs)在 /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs 下创建的 tmpfs mount,其 dirty 页完全不可见于宿主机 iostat,必须进容器命名空间查

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.09.27

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

389

2023.09.04

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

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

394

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

158

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

978

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

198

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

269

2023.11.20

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.8万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号