linux 操作系统中,文件系统是直接负责磁盘I/O 操作的,无论是在高并发场景还是在大数据量的场景,磁盘I/O 对于性能的影响都至关重要。如果是在业务高峰时,瞬间的数据流量,很有可能会将文件系统的I/O 完全压垮,所以如果能够掌握文件系统的缓存原理,能够在业务高峰来临前,做更多的准备工作,以防止系统被压垮。
今天主要是和大家介绍几个关于文件系统缓存的关键参数,也是日常系统调优时经常要使用的。
vm.dirty_expire_centisecs
该参数默认值为 3000,代表是30 秒;
该参数的意义是:数据保存于文件系统的内存中,多长时间后就会被认定为“脏数据”,大家一般称为”脏页“
vm.dirty_writeback_centisecs
该参数默认值为 500,代表是 5 秒;
该参数表示,每间隔多长时间,文件系统就会自动触发将“脏页”数据刷入磁盘中
vm.dirty_background_ratio
该参数默认值为 10,代表全局系统中所有“脏页”总和超过系统总内存的 XX 百分比后,文件系统就会自动触发将“脏页”数据异步刷入磁盘中
vm.dirty_ratio
该参数默认值为 20,代表全局系统中所有“脏页”总和超过系统总内存的 XX 百分比后,文件系统将会进入I/O 阻塞状态;
========= 分割线 =========
文件系统整个缓存机制
- 应用向系统写入数据,数据进入到文件系统缓存中
- 数据在文件系统的缓存里,超过 vm.dirty_expire_centisecs 秒后,就会被标记为“脏页”
- 系统的文件系统,每隔 vm.dirty_writeback_centisecs 秒就会启动,自动将“脏页”数据异步刷入磁盘
- 如果业务持续写入数据,文件系统“脏页”总大小超过了系统总内存的 vm.dirty_background_ratio 百分比,则文件系统自动异步将“脏页”数据刷入磁盘中
- 如果业务高峰来临,“脏页”数据刷入磁盘的速度 < “脏页”数据增长速度
- 当文件系统“脏页”总大小超过了系统总内存的 vm.dirty_ratio 百分比后,文件系统直接阻塞I/O 操作,直至将文件系统缓存释放后,再恢复正常
========= 分割线 =========
- 优化建议一:应对持续数据写入
优化原则,持续写入数据,磁盘同步也尽快刷盘,但是尽可能不要影响业务写入
vm.dirty_expire_centisecs = 300
vm.dirty_writeback_centisecs = 100
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80
- 优化建议二:瞬间高峰
优化原则,加大缓存大小,让数据都暂时保存内存中,事后再异步刷入磁盘
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 500
vm.dirty_background_ratio = 70
vm.dirty_ratio = 90
========= 分割线 =========
查看当前系统中,存在多少脏页
cat /proc/vmstat | egrep "dirty|writeback"
cat /proc/meminfo |grep Dirty