我一直在使用一套文件系统测试工具来对 GlusterFS 卷进行基准测试和滥用。该卷是分布在 6 个主机上的副本 3 卷。
Fio、iozone 和 Bonnie 向我表明 Gluster 运行良好,带宽大致等于客户端和服务器网络适配器的带宽,因此性能无法真正提高。除了 iozone 和 Bonnie 之外,我的大多数测试用例都针对 32GB 文件进行操作。
我收到过有关多个客户端同时写入某些文件时发生脑裂的报告。我读过的所有文档似乎都表明脑裂主要发生在网络分区发生时,但从日志来看,情况显然并非如此。
不幸的是,这种裂脑似乎仅在使用某个托管服务时才会发生,而我完全不了解该服务的运行方式、它拥有哪个版本的 Gluster 客户端等。服务器运行的是最新的 4.0 版本。
从我遇到的失败案例来看(“当两个容器同时写入同一个文件时就会发生脑裂”),我需要一个可以重现类似情况的测试。
我绝对可以用 C 或 Rust 编写自己的测试用例,但是有没有可以测试这个精确用例而无需编写任何代码的东西呢?
我确实可以访问(但不能自省)此托管服务,因此我可能也会测试它。我也对实际问题感到困惑:当两个程序同时将不同的数据写入同一文件时,期望的结果是什么?
编辑:服务器运行的是最新的 CentOS 7 版本。我的测试客户端服务器也运行相同的版本。底层文件系统是 XFS。
是否存在一个特定的测试用例可以帮助我尝试重现该问题?
答案1
听起来你有一个 PHP 应用程序,并且它的错误日志被破坏了。因此,最现实的测试是关闭多个 PHP 进程,这些进程并行调用 error_log()。
您可以跟踪应用程序的错误日志或阅读源代码以找出其精确的实现。如果它以 O_APPEND 的附加模式打开,那就特别有趣了。附加在 NFS 上存在竞争条件,因此这不一定能解决网络文件系统上的问题。
考虑将 error_log 切换为 syslog,并让 syslogd 转发到中央 syslog。这会将其转换为单个文件写入器。或者您可以转发到具有适当数据库的日志分析平台,如 Graylog、ELK 或 Splunk。
答案2
只需创建两个单独的 fio 作业即可direct
输入/输出到由filename
范围. 使size
文件的可能比较小,并且可能有一个或两个 fio 作业执行写入操作随机输入/输出并可能将每个作业设置为使用不同的块大小. 使用奖励积分fio 的客户端/服务器模式因此作业来自不同的机器。使用runtime
和time_based
保持 fio 循环。