Linux PageCache
原理
- 定义: 操作系统在读写文件的时候并不会直接写入磁盘,而是在内存申请一块缓存,先写入缓存 然后定时刷盘 刷盘时优化写入排序
- 来源:read、mmap
优势
- I/O Scheduler 会将连续的小块写组装成大块的物理写从而提高性能
- I/O Scheduler 会尝试将一些写操作重新按顺序排好,从而减少磁盘头的移动时间
- 充分利用所有空闲内存 减少Gc压力
- 读写时间很近 读操作可直接在 Page Cache 内进行
- 只要系统不宕机,程序重启可以充分利用 Page Cache 缓存数据
查看
free
cache/ buffer
- cache 是快取 写入文件时落入pagecache 加快读取
- buffer 从磁盘读取数据块先读到 pagecache 下次无需读盘
实测
// 生成一个大小为4G的文件
dd if=/dev/zero of=/home/felixzh_dd.out bs=4096 count=1048576 status=progress
// 查看文件的读取耗时
time cat home/felixzh_dd.out &> dev/null
//清空Page Cache
sync && echo 3 > proc/sys/vm/drop_caches
// 再次读取
time cat home/felixzh_dd.out &> dev/null
查看脏页参数
cat proc/vmstat | egrep "dirty|writeback"
// sar 可以监控脏页
sar -B 1
参数优化场景
- 尽可能不丢数据 : 减少Cache,更加频繁唤醒回刷进程的方式,尽可能让数据回刷
dirty_background_ratio = 5 // 触发回刷的脏数据占用内存的百分比
dirty_ratio = 10 // 触发同步写的脏数据占可用内存的百分比
dirty_writeback_centisecs = 50 // 回刷进程定时唤醒时间
dirty_expire_centisecs = 100 // 脏数据超时回刷时间(单位:1/100S)
- 追求更高性能: 增大Cache,延迟回刷唤醒时间来尽可能缓存更多数据,进而实现提高性能
dirty_background_ratio = 50
dirty_ratio = 80
dirty_writeback_centisecs = 2000
dirty_expire_centisecs = 12000
- 应对峰值: 增大Cache和更加频繁唤醒回刷的方式,解决IO峰值的问题。通过保证脏数据比例保持在一个比较低的水平,当突然出现峰值,也有足够的Cache来缓存数据
dirty_background_ratio = 5
dirty_ratio = 80
dirty_writeback_centisecs = 500
dirty_expire_centisecs = 3000
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16497905.html