目录
本章核心概念
1. 页高速缓存(Page Cache)
- 作用:Linux内核主要磁盘缓存,减少磁盘I/O操作
- 特点:
- 缓存最近访问的磁盘数据
- 统一缓存文件系统和块设备数据
- 基于页(通常4KB)进行管理
- 数据结构:
struct address_space { struct inode *host; /* 所属inode */ struct radix_tree_root page_tree; /* 页的基数树 */ unsigned long nrpages; /* 总页数 */ /* ... */ };
2. 页回写(Page Writeback)
- 目的:延迟写入以提高性能
- 触发条件:
- 空闲内存低于阈值
- 脏页存在时间超过阈值
- 用户主动调用sync()/fsync()
- 相关进程:
pdflush
(2.6.32之前)bdi_writeback
(现代内核)
关键技术实现
1. 地址空间(address_space)
- 连接inode和页缓存的核心结构
- 使用基数树(radix tree)高效管理缓存页
2. 脏页管理
struct page {
unsigned long flags; /* 包含PG_dirty等标志 */
struct address_space *mapping; /* 所属地址空间 */
/* ... */
};
3. 回写机制
- 策略控制参数(/proc/sys/vm/):
dirty_background_ratio
:触发后台回写的脏页比例dirty_expire_interval
:脏页超时时间(毫秒)
性能优化技巧
-
预读机制:
- 预测性加载后续可能访问的页
- 通过
readahead()
系统调用控制
-
写合并:
- 将相邻的小写入合并为大块写入
-
调节参数(针对SSD优化示例):
echo 50 > /proc/sys/vm/dirty_background_ratio echo 1000 > /proc/sys/vm/dirty_expire_interval
实战问题排查
常见问题1:IO延迟高
# 查看当前脏页状态
cat /proc/meminfo | grep Dirty
# 监控回写进程
watch -n 1 'ps aux | grep [b]di'
常见问题2:内存占用高
# 查看页缓存占用
free -m
# 手动释放缓存(生产环境慎用)
echo 3 > /proc/sys/vm/drop_caches
扩展阅读
- 《Understanding the Linux Kernel》Chapter 15
- Linux内核文档:Documentation/admin-guide/sysctl/vm.rst