Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md
该优化来自如下pr
1. sync_file_range简介
我们在开发数据库程序或者IO密集型程序时,通常希望更新有一定的安全性,一次会在更新操作结束时调用fsync或者fdatasync来将数据写入持久设备。频繁调用fsync或者fdatasync时虽然安全性得到了保证,但是对系统性能会有很大的影响。
由于fsync与fdatasync(当写入文件长度发生变化时)系统调用都会更新元数据信息,而对于RDB这种连续性的写入数据场景,这期间可以不用频繁更新元数据信息,所以可以使用sync_file_range系统调用只将数据脏页只写入到文件区中。
总之,使用sync_file_rang系统调用在连续写入场景下,理论上可以有1-2倍间的写入性能提升。
该函数定义如下:
•fd 为当前操作的文件描述符
•offset 为要操作文件的偏移量
•nbytes 为需要sync数据的长度
•flags主要包含以下3种模式:
◆SYNC_FILE_RANGE_WAIT_BEFORE
◆刷盘前等待指定范围内的数据全部落盘;
◆SYNC_FILE_RANGE_WRITE
•将指定范围的数据落盘;单独使用这个flag时是异步操作
◆SYNC_FILE_RANGE_WAIT_AFTER
◆执行任何写入操作后,等待指定范围内所有数据落盘;
•除了单独使用,还有几种常用的几种flag组合:
◆SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRIT
◆ESYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE |
◆SYNC_FILE_RANGE_WAIT_AFTER
2. sync_file_range在redis中的简单流程
3. sync_file_range性能对比测试
4. 总结
Redis7 中使用小分片+sync_file_range策略,对RDB这种连续写入场景性能提升明显,而且小分片写入,可以有效降低内核脏页数量,从而也可以降低系统的负载。
文章转自公众号:Redis开发运维实战