Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md

vincent0809
发布于 2022-4-14 12:34
浏览
0收藏

该优化来自如下pr

Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md-鸿蒙开发者社区

1. sync_file_range简介


我们在开发数据库程序或者IO密集型程序时,通常希望更新有一定的安全性,一次会在更新操作结束时调用fsync或者fdatasync来将数据写入持久设备。频繁调用fsync或者fdatasync时虽然安全性得到了保证,但是对系统性能会有很大的影响。

 

由于fsyncfdatasync(当写入文件长度发生变化时)系统调用都会更新元数据信息,而对于RDB这种连续性的写入数据场景,这期间可以不用频繁更新元数据信息,所以可以使用sync_file_range系统调用只将数据脏页只写入到文件区中。

 

总之,使用sync_file_rang系统调用在连续写入场景下,理论上可以有1-2倍间的写入性能提升。

 

Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md-鸿蒙开发者社区

该函数定义如下:

Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md-鸿蒙开发者社区

 •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

 

Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md-鸿蒙开发者社区

2. sync_file_range在redis中的简单流程

 

Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md-鸿蒙开发者社区

 

3. sync_file_range性能对比测试

 

Redis 7持久化优化 -- 1. 使用sync_file_range系统调用.md-鸿蒙开发者社区

4. 总结


Redis7 中使用小分片+sync_file_range策略,对RDB这种连续写入场景性能提升明显,而且小分片写入,可以有效降低内核脏页数量,从而也可以降低系统的负载。

 

文章转自公众号:Redis开发运维实战

分类
标签
收藏
回复
举报
回复
    相关推荐