该优化来自如下pr
Improvements in fsync to avoid large writes to disk (#9409)
我们在开发数据库程序或者IO密集型程序时,通常希望更新有一定的安全性,一次会在更新操作结束时调用fsync或者fdatasync来将数据写入持久设备。频繁调用fsync或者fdatasync时虽然安全性得到了保证,但是对系统性能会有很大的影响。
由于fsync与fdatasync(当写入文件长度发生变化时)系统调用都会更新元数据信息,而对于RDB这种连续性的写入数据场景,这期间可以不用频繁更新元数据信息,所以可以使用sync_file_range系统调用只将数据脏页只写入到文件区中。
总之,使用sync_file_rang系统调用在连续写入场景下,理论上可以有1-2倍间的写入性能提升。
> 注意:sync_file_range系统调用在linux 内核2.6.17版本后支持;该函数只在linux系统可以调用。
该函数定义如下:
#define _GNU_SOURCE
long sync_file_range(int fd, loff_t offset, loff_t nbytes, int flags);
刷盘前等待指定范围内的数据全部落盘;
将指定范围的数据落盘;单独使用这个flag时是异步操作
执行任何写入操作后,等待指定范围内所有数据落盘;
除了单独使用,还有几种常用的几种flag组合:
> 具体用法可以参考man手册。
> man sync_file_range
类别 | 写入相同数据rdb(7.5G,4200W Key)花费时间 |
---|---|
autoSync = 32M | 84s |
autoSync = 4M | 100s |
autoSync = 4M + sync_file_range | 73s |
> 注意:表中数据为大约值,服务器磁盘为普通机械磁盘。
Redis7 中使用小分片+sync_file_range策略,对RDB这种连续写入场景性能提升明显,而且小分片写入,可以有效降低内核脏页数量,从而也可以降低系统的负载。
本文作者: 黄威
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞2
添加新评论0 条评论