carlosfu
作者carlosfu·2022-02-17 10:22
软件开发工程师·快手

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

字数 1241阅读 2305评论 0赞 2

该优化来自如下pr

Improvements in fsync to avoid large writes to disk (#9409)

1. sync_file_range简介

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

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

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

> 注意:sync_file_range系统调用在linux 内核2.6.17版本后支持;该函数只在linux系统可以调用。

该函数定义如下:

#define _GNU_SOURCE  

include

long sync_file_range(int fd, loff_t offset, loff_t nbytes, int flags);

  • 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_WRITE
    • SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER

> 具体用法可以参考man手册。

> man sync_file_range

2. sync_file_range在redis中的简单流程

3. sync_file_range性能对比测试

类别写入相同数据rdb(7.5G,4200W Key)花费时间
autoSync = 32M84s
autoSync = 4M100s
autoSync = 4M + sync_file_range73s

> 注意:表中数据为大约值,服务器磁盘为普通机械磁盘。

4. 总结

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

本文作者: 黄威

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广