![ceph(cephfs)的 fsync() 很慢](https://linux22.com/image/697705/ceph%EF%BC%88cephfs%EF%BC%89%E7%9A%84%20fsync()%20%E5%BE%88%E6%85%A2.png)
我已经构建了一个实验性的 ceph 集群 - 12 个节点、50 个 osd、3 个 mon、3 个 md,我正在尝试为其运行一个 samba 网关。似乎在写入大量小文件时,samba 的 fsync() 系统调用会定期阻塞,大概是按照日志刷新间隔的频率。我是一名开发人员,而不是真正的系统管理员,希望了解一些有关如何使用 ceph 最大限度地减少 fsyncs 影响的背景知识。我暂时从 samba 中删除了 fsync 调用,这有很大帮助,但我仍然认为处理大量小文件时的性能应该会好得多。断电完整性不是问题。此外,对于大文件,集群将饱和 10G 链路。我的日志磁盘肯定不是最佳的 - 它们是机械磁盘,每个磁盘由几个 osd 共享。有没有办法防止日志写入 (?) 在 fsync 上阻塞这么长时间?ceph 在遇到 fsync 调用时是否在等待下一次日志提交?我真的没有预算用于 ssd 日志,因此影响最小化将是唯一的选择。此外,使用 ceph 内核客户端,性能比通过 samba 网关要好得多 - 因此这显然不受网络带宽的限制。
使用的服务器是已重新利用的旧计算节点:每个节点有 4x Xeon 5160,16Gb RAM,1G 绑定网络接口,以及用于集群网络的 10G Infiniband。
每个 OSD 节点都有一个用于日志的本地 10K SAS 磁盘,多个 OSD 使用大型 Dell PERC RAID 机箱,每个 OSD 模式使用单个磁盘。
暂停时间可以从零到大约 5 秒不等,这是日志刷新间隔,所以我猜这取决于 fsync() 相对于日志提交等待时间的位置。
我还没有尝试过 Bluestore,但如果/当它投入生产时,它将成为未来的默认选择。
答案1
当 ceph 遇到 fsync 调用时,它是否会等待下一次日志提交?
是的,大部分情况下如此。但根据后端的不同,其行为会略有不同。
在 FileStore 下,有一个小型日志缓冲区,可以充当小型写入突发缓存,但它很小。是的,一旦它填满,它就会阻塞以刷新 - 跨整个集群或 PG。
在 BlueStore 下,没有这样的缓冲区。是的,bluestore 会在每次写入时阻止 fsync 到日志 - PG 中的所有日志。这就是 BlueStore 如何在 IOPS 和写入中保持非常一致和可预测的方式。在 Bluestore 下,您至少需要将预写日志 (WAL) 移至企业 SSD - 因为 BlueStore 会将日志和 DB 移至同一个 WAL 分区 - 如果有足够的空间(您甚至不必指定它们,只需指定 WAL)。
企业级 SSD 作为 WAL/DB/Journals,因为它们忽略fsync
但是该集群的真正问题是,您正在使用次优 HDD 作为日志,当它们被刷新时,它们会在非常慢的 fsync 上发生阻塞。
即使是消费级 SSD,在 Ceph 的fsync
频率作为日志/WAL 方面也存在严重问题,因为消费级 SSD 只有事务日志,没有真正的电源备份。
企业级 SSD 具有大容量电容器,可让驱动器在断电后继续运行。因此,它们可以保证在断电情况下成功写入。
额外的好处是企业级 SSD 通常会忽略来自操作系统的 fsync 命令! 因为它们可以保证写入成功,所以它们立即返回fsync
来自操作系统的请求。
因此,当使用企业级 SSD 作为 WAL/DB/Journal 时,您可以获得显著的性能提升。
在 FileStore 下,您会看到这些延迟消失,但您会看到不一致的缓存突发然后回落。
这正是 BlueStore 发挥作用的地方,因为 BlueStore 将保证一致的 IOPS 和全面写入。但是,您需要企业级 SSD 上的 WAL/DB/Journal 来忽略这些 fsync。
目前,Intel S3700 在二手市场上的售价约为每台 40 美元。只需很小的投资,就能获得解锁 fsyncs 的巨大性能提升。
Filestore 将所有内容写入日志,并且只有当日志填满到配置的百分比时才开始将其刷新到数据设备。这非常方便,因为它使日志充当吸收随机写入突发的“临时缓冲区”。
即使将 WAL+DB 放在 SSD 上,Bluestore 也无法做到这一点。它还有一种称为“延迟写入队列”的“日志”,但它非常小(只有 64 个请求),并且缺乏任何类型的后台刷新线程。因此,您实际上可以增加延迟请求的最大数量,但在队列填满后,性能将下降,直到 OSD 重新启动。
和:https://docs.ceph.com/en/latest/rados/configuration/bluestore-config-ref/
BlueStore 日志将始终放置在可用的最快设备上,因此使用 DB 设备将提供与 WAL 设备相同的优势,同时还允许将其他元数据存储在那里(如果合适)。这意味着,如果指定了 DB 设备但未指定明确的 WAL 设备,则 WAL 将隐式地与 DB 一起放置在速度更快的设备上。