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
posted @ 2022-07-20 14:34  vx_guanchaoguo0  阅读(57)  评论(0编辑  收藏  举报