我有一个 Amazon EC2 实例c4.8xlarge
,我将其用作正在进行的 rsync 进程的目标,该进程存储我的数据库数据文件和事务日志以用于灾难恢复。除了从 rsync 接收文件外,EC2 实例没有任何工作负载。我使用 EBS 卷来存储文件(每个数据库实例一个),并且在 rsync 完成后,我将对该卷进行 EBS 快照。
最初,我很惊讶地发现,即使 rsync 过程已经顺利完成,快照中仍包含部分写入的文件。我最终发现,数据位于文件系统缓存中,而且由于 EBS 快照发生在块级别,因此内存中但尚未写入磁盘的所有内容当然不在快照中。在/bin/sync
快照之前调用显式操作可获得一致的快照。
但是,/bin/sync
有时需要很长时间(在我看来)才能完成。通常需要 5-10 分钟,有时甚至长达 15 分钟。但是,我有多个 rsync 作业正在运行,如果其中一个/bin/sync
最近调用过,那么后续调用当然会非常快(不到一秒)。我希望解决这个问题,以便系统更频繁地将更改写入块存储。目标是提高整体写入性能,并使我的 rsync 作业的持续时间更加可预测和一致。
我的问题是: 我如何调整文件系统缓存,以便当 rsync 读取/比较文件以计算传输增量时,它会积极使用可用 RAM,但也会积极将脏块写入磁盘? 我已经阅读了内核参数,/proc/sys/vm
但我能找到的大多数文档似乎都假设我是一个经验丰富的 Linux 系统管理员(其实我不是,我是一个出于需要执行系统管理任务的 DBA),或者我可以轻松地阅读内核源代码(我不能)。
我相信这些是来自的相关参数/sbin/sysctl
。我没有故意设置其中任何一个:
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirtytime_expire_seconds = 43200
vm.vfs_cache_pressure = 100