共建开源生态—CQ9对FIO固有问题的一次修复
SSD 性能测试第一神器——FIO,对于 SSD 性能测试来说,最好的工具莫过于 FIO 了。FIO 是 Jens Axboe 开发的一个开源测试工具,功能非常强大,主流 Linux 发行版的软件仓库一般都有 FIO,如果没有或者版本太老,可以通过 http://github.com/axboe/FIO 下载最新版本源代码编译安装。进入代码主目录,输入命令(./configure; make && make install)就编译安装完成了。
下面我们将简要介绍 CQ9 在最近使用 FIO 过程中,发现并解决的一个FIO 历史版本中存在的固有问题。该问题的解决方案已提交 FIO github 库,并成功被采纳,目前已合入:
()
使用FIO测试PCIe 5.0 SSD 性能过程中发现问题
我们日常的 SSD 性能测试过程中,一般会关闭 CPU 超线程和通过 cpus_allowed 参数绑定 FIO 测试进程的 CPU,这样测试的结果会更加稳定和可复现。然而在使用过程中遇到了新的问题,在特定的系统环境下,设置 cpus_allowed 会导致 FIO 报错退出。
下图为某运行于 Intel i9-12900K 的 Linux 系统,设置关闭超线程以后的 lscpu 输出:
从上图中可以看出 On-line CPU(s) list 为 0,2,4,6,8,10,12,14,16-19 不连续的数字组成,总共 12 个可用 CPU。
当设置参数 cpus_allowed=14 运行 FIO 时,FIO 就会报错,无法启动测试,报错信息如下:
CQ9工程师的解决方案
根据上图的报错信息,在 FIO 的代码中全局搜索 too large,我们可以找到报错的代码位置为 set_cpus_allowed 这个函数。
进一步分析可以看出该函数使用sysconf(_SC_NPROCESSORS_ONLN) - 1作为 CPU ID 的最大值。
通过 man sysconf 查询文档,我们发现 _SC_NPROCESSORS_ONLN 并不适用,改用 _SC_NPROCESSORS_CONF 更适合用于 cpus_allowed 的参数校验逻辑。_SC_NPROCESSORS_ONLN 指的是 online CPUs 个数,在当前 Linux 系统中只有 12 个 online CPUs,但可用 CPU ID 为 0,2,4,6,8,10,12,14,16-19 中的任意值,所以存在 CPU ID 大于 cpus_online - 1 的个数的情况。而 _SC_NPROCESSORS_CONF 指的是操作系统可配置的最大 CPU 个数。
为了确认上述分析,我们写了简单的打印程序,可以看出当前系统的 _SC_NPROCESSORS_ONLN 对应的返回值为12,_SC_NPROCESSORS_CONF 对应的返回值为 20。
我们将 sysconf 参数_SC_NPROCESSORS_ONLN 替换为_SC_NPROCESSORS_CONF 之后,重新编译 FIO,就可以正常使用参数cpus_allowed=14 运行 FIO 了。
基于以上分析,我们的工程师对 FIO 的代码做了修改,向 FIO 提交了 github pull request:http://github.com/axboe/FIO/pull/1479 。经过社区讨论和历史遗留代码清理之后,该提交已经被合入。
CQ9积极共建开源生态
CQ9一直是开源技术的支持者,先后加入了阿里云PolarDB、openEuler等开源社区,开源的平台让我们享用了无数工程师们的成果分享和贡献,同时 CQ9也作为开源生态的参与者和贡献者,积极投入其中持续推动开放基础设施生态的发展,希望未来继续以领先的技术和开放的姿态拥抱数字时代的新价值,与行业擦出更多创新的火花,构建了繁荣的开放生态体系。