关于write()和fsync()

本文详细解析了Linux系统中write与fsync函数的工作原理,强调了它们在确保数据持久化方面的重要性,特别是在数据库软件开发中。文章指出,虽然write函数能将数据发送到操作系统缓冲区,但fsync函数才是确保数据真正写入硬盘的关键,避免因系统故障导致的数据丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

write

ssize_t write(int fd, const void *buf, size_t count);

将数据写到文件中. 注意, 如果文件是保存在硬盘中, write() 函数调用返回之后, 并不表示数据已经写入到硬盘中, 这时如果掉电, 数据可能会丢失.

fsync

int fsync(int fd);

程序调用本函数, 通知内核把数据写到硬盘(file)中. 比如, 你开发一个数据库软件, 就需要这样的函数, 否则掉电或者系统崩溃时便会丢失数据.

如果你的程序不调用 fsync(), Linux 内核也会自动在”合适”的时候将你的数据真正写入到硬盘(类似调用 fsync), 最长的延时默认是 30 秒.

阻塞 

阻塞是 IO 的精华所在, 不管是文件 IO 还是网络 IO, 只有真正了理解了 IO 阻塞, 才能做出所谓在高并发高性能软件(服务器).

当 fsync() 和 write() 同一个 fd 时, write() 必然阻塞. 当系统 IO 非常繁忙时, fsync() 可能会阻塞, 即使系统 IO 不繁忙, fsync() 也会因为数据量大而慢.

 

### Redis 中 `CONFIG SET` 命令调整 `appendfsync` 参数 在 Redis 配置中,`appendfsync` 是一个重要的参数,用于控制 AOF(Append-Only File)持久化模式下的写入同步行为。通过 `CONFIG SET` 命令可以动态修改此参数,而无需重启 Redis 实例。 #### 可选配置项及其影响 `appendfsync` 支持三种不同的配置选项: 1. **always** - 当设置为 `always` 时,每次写操作都会立即触发一次 fsync 操作,将数据刷盘到磁盘上[^1]。 - 这种方式提供了最高的数据安全性,即使发生断电或其他异常情况,也不会丢失任何已提交的数据。 - 缺点是性能开销较大,因为频繁调用 fsync 会显著降低写入速度。 2. **everysec** - 设置为 `everysec` 后,Redis 不会在每次写操作后立刻调用 fsync,而是每秒执行一次批量的 fsync 操作。 - 此策略在大多数情况下能够提供良好的平衡——既保证较高的性能,又能在系统崩溃时最多只丢失一秒内的数据。 3. **no** - 如果选择 `no`,则 Redis 完全依赖于操作系统来决定何时将缓冲区中的数据刷新到磁盘。 - 虽然这种方式具有最佳的写入性能,但由于缺乏明确的时间间隔控制,可能会导致大量未保存的数据在意外停机时丢失。 #### 使用 CONFIG SET 修改 appendfsync 的方法 可以通过以下命令实时更改运行中的 Redis 实例的 `appendfsync` 参数: ```bash redis-cli CONFIG SET appendfsync always ``` 或者切换至其他两种模式之一: ```bash redis-cli CONFIG SET appendfsync everysec redis-cli CONFIG SET appendfsync no ``` 值得注意的是,这些变更仅作用于当前运行期;如果希望永久生效,则需要编辑实际的 `redis.conf` 文件并重新加载配置[^2]。 #### 对 Write/Fsync 行为的具体影响分析 不同 `appendfsync` 设定直接影响着 Redis 数据库对于硬盘 I/O 请求的态度以及由此产生的延迟表现: - 在高并发场景下选用 `always` 方式可能导致服务器负载过高甚至响应变慢; - 利用 `everysec` 方法可以在保障大部分时间里正常运转的同时减少不必要的资源消耗; - 若追求极致吞吐量且能接受一定风险的话,“no”无疑是最优解法。 总之,在具体应用环境中应权衡业务需求与硬件条件后再做决策。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值