内容目录
介绍
页高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对哪些数据进一步访问不用再访问磁盘而能尽快得到满足。
页高速缓存流程
读请求
操作系统内核在读取磁盘时使用页高速缓存。当用户对磁盘进行读请求时,如果读取的页不在高速缓存中,那么操作系统内核会从磁盘读取数据块追加到页高速缓存中;如果读取的也在高速缓存中,那么操作系统内核就直接访问页高速缓存而会读取磁盘。
写请求
操作系统内核在写磁盘时也会使用也高速缓存。当用户对磁盘进程写请求时,操作系统内核会先检查对应的页是否已经在高速缓存中,如果不在,就现在其中增加一个新项,并用要写入的磁盘中的数据填充到新项中。
当时I/O数据的传送并不是在写入页高速缓存后就立即开始写入磁盘的,而是要等待写入条件满足后才会写入磁盘(延迟写)。
脏页写入条件
- 页高速缓存区内存已经被占用完,但是现在依然有新页要放入到页高速缓存中或者脏页数量已经太多,那么操作系统内核会选择对应的页写入磁盘以释放页高速缓存区的内存空间;
- 干净的页变成脏页的时间太长(防止刷盘饥饿和数据丢失问题);
- 进程调用了对应的刷盘API,比如:Linux的函数sync()、fsync()或fdatasync()系统调用。
Linux页高速缓存
查看脏页大小
cat /proc/meminfo
- Dirty:写入缓存页的大小
- Writeback: 缓存写入硬盘的大小
执行一次文件复制导致脏页增加:
查看脏页比例
cat /proc/sys/vm/dirty_ratio
# 比例为总内存大小的百分比
更多参考
- linux页高速缓存_脏页_延迟写_I/O内核参数优化_pdflush,链接: https://www.douyacun.com/article/37c7ae7c04e74ad0aa75fda1b907ea48
总结
- 上层用户对同一磁盘块反复频繁访问,那么这种情况下使用页高速缓存可以提升性能;反过来如果上层用户不会对同一磁盘块反复频繁访问,那么使用页高速缓存反而会降低性能和占用内存空间;
- 页高速缓存在提供高性能的文件读写,但是可能在计算机故障时可能会丢失数据。如果上层应用(如数据库)对数据刷盘有限制,那么就需要使用直接I/O(Linux设置O_DIRECT标志来禁用Linux页高速缓存),然后上层应用可以根据业务特性自定义高速缓存机制而不是使用操作系统的页高速缓存。
参考
- 深入理解Linux内核(第三版)
- linux页高速缓存_脏页_延迟写_I/O内核参数优化_pdflush