使用 ping_pong 工具测试文件系统
ping_pong 是一段用 C 语言编写的小型测试工具,可用于获取集群文件系统的多项性能与一致性信息。在将集群文件系统用于 CTDB 或 Samba 之前,强烈建议先运行 ping_pong,以确认其测试结果满足要求。
获取 ping_pong 工具
ping_pong 工具随 CTDB 一同发布,亦可单独下载。源码地址如下:
https://git.samba.org/?p=samba.git;a=blob;f=ctdb/utils/ping_pong/ping_pong.c
编译命令如下:
cc -o ping_pong ping_pong.c
测试范围
ping_pong 工具能够评估集群文件系统在以下方面的表现:
- 是否支持跨集群节点的连续字节范围锁定;
- 锁竞争情况下的响应速度;
- 是否支持跨集群节点的连续读/写 I/O 操作;
- 竞争性 I/O 场景下的处理效率;
- 是否支持跨集群节点的内存映射(mmap)一致性;
- mmap 一致性机制的响应速度。
上述所有测试功能均以 176 行 C 语言代码实现,具备较高的实用价值。
值得注意的是,许多从未经过此类测试的集群文件系统,在首次运行 ping_pong 时往往会出现故障或卡死现象,这在某种程度上反映出部分文件系统开发者对锁定机制的重视程度不足。
测试锁一致性
适用于较新版本的 Samba
对于支持 -l 选项的较新版本 ping_pong,可按以下步骤验证锁一致性。
登录集群中的一个节点,首先在该节点上运行:
ping_pong -l /path/to/clusterfs/file
预期输出如下:
Holding lock, press any key to continue...
You should run the same command on another node now.
随后登录集群中的另一个节点,并执行相同命令。在该节点上应看到如下输出:
file already locked, calling check_lock to tell us who has it locked:
check_lock failed: lock held: pid='0', type='1', start='0', len='0'
Working POSIX byte range locks
若输出内容与上述一致,则说明字节范围锁定具备集群一致性,可以继续使用。
适用于较旧版本的 Samba
若当前 ping_pong 不支持 -l 选项,可采用以下方式验证锁一致性。
登录集群中的多个节点。首先在其中一个节点上运行:
ping_pong test.dat N
其中,N 的取值应至少比待测试的节点数量多 1。文件路径(如示例中的 test.dat)必须在所有集群节点上指向同一个共享存储位置。
运行后,ping_pong 会每秒输出一次锁定率。由于仅单节点运行,不存在锁竞争,因此锁定率通常较高。对于普通服务器级 CPU,该数值一般在每秒 50 万至 100 万次之间。若未能每秒输出锁定率,则表明存在异常,建议联系文件系统供应商。
接着,在集群中的另一个节点上启动第二个 ping_pong 实例,使用完全相同的参数。此时应观察到锁定率显著下降。这是因为集群文件系统现在需要为每次锁授予处理跨节点的竞争。在千兆网络环境下,根据锁一致性算法的效率差异,锁定率大致介于每秒 1 千次至 1 万次之间。
若未出现每秒锁定率输出、两次测试的锁定率相差较大,或第二个实例运行后锁定率未下降,则说明集群文件系统存在问题,建议联系供应商。
继续添加第三个乃至更多 ping_pong 实例,并观察随着节点数增加,锁定率的变化趋势,从而评估锁一致性算法在多节点环境下的扩展性能。
最后逐个终止正在运行的 ping_pong 实例。随着节点减少,锁定率应逐步回升,直至恢复到单节点运行水平。若锁定率未能按预期上升,同样表明文件系统存在异常,建议联系供应商。
测试 I/O 一致性
接下来进行 I/O 一致性测试。
请先清理所有 ping_pong 实例,然后重新启动测试,但本次添加 -rw 命令行参数。操作示例如下:
ping_pong -rw test.dat N
此时可能观察到锁定率有所降低,因为 ping_pong 会在每次锁定后执行 1 字节的读取和 1 字节的写入操作。同时,工具会输出一个“数据增量”值,该值应等于当前运行 ping_pong 的节点数量(该测试最多支持 256 个节点)。
若“数据增量”与实际运行的节点数不符,或未以每秒一次的频率输出锁定率,抑或锁定率趋近于零,均表示存在故障,建议联系供应商。
此处的锁定率可作为衡量 I/O 竞争程度的简化指标,数值越高表示性能越优。
测试 mmap 一致性
若在 ping_pong 命令中同时使用 -m 和 -rw 开关,则工具将通过 mmap 执行 I/O 一致性测试。对于 CTDB 和 Samba 而言,集群文件系统是否支持一致的 mmap 功能并非强制要求,但该特性有助于在与其他文件系统的比较中展现优势。如果文件系统未能通过此项测试,可在 smb.conf 中设置 use mmap = no 予以规避。即使文件系统能够通过测试,对于大多数集群文件系统而言,禁用 mmap 仍然是一个值得考虑的建议。
与 CTDB 及 Samba 的关联
- CTDB 恢复锁:需要集群文件系统通过锁一致性测试。
- 启用 POSIX 锁定的 Samba:要求集群文件系统通过I/O 一致性测试。
工作原理
详细实现可参阅源代码(仅 176 行)。简而言之,ping_pong 的设计目标是“使系统保持在稳定竞争状态”,从而避免文件系统利用缓存或优化手段干扰对一致性时间的测量。
测试采用的锁定模式如下:
lock byte 0
lock byte 1
unlock byte 0
lock byte 2
unlock byte 1
lock byte 3
...
lock byte N
unlock byte N-1
lock byte 0
unlock byte N
... 依此类推
所有操作在一个闭环结构中完成。在正常的文件系统行为下,两个节点无法同时锁定同一个字节。由于每个 ping_pong 实例始终保持至少一个字节处于锁定状态,因此不同实例之间无法相互超越,从而确保大量竞争场景的产生。文件系统无法通过缓存机制消除此类竞争,因此所测得的性能数据能够真实反映文件系统在竞争条件下的实际表现。

浙公网安备 33010602011771号