我们有一台连接了 24 个自定义 NVMe 设备的服务器(我工作的公司正在开发一种自定义 ASIC,用于利用 NVMe 作为传输方式进行硬件视频转码)我们使用 NVMe 协议中的供应商特定命令与我们的 NVMe 设备进行交互,使用带有标准内置 NVMe Linux 驱动程序的 Linux IOCTL 接口。我们在具有各种内核的 ubuntu 16.04 和 18.04 上对此进行了测试,但无论我们做什么,最终都会出现同样的问题。我们在技嘉制造的存储服务器上通过 NVMe 连接了 24 台设备。当我们进行测试时,我们能够同时使用 9 台设备在所需的转码 FPS 范围内工作。我们使用带有自定义 AVCODEC 插件的 FFMpeg 来运行转码会话。一旦我们尝试使用第 10 台 NVMe 设备,我们就会发现其他设备的性能下降,这表明在执行 NVMe 传输时存在某种瓶颈。我们的 IO 与普通的 SSD 驱动器非常不同,因为我们尝试对读取和写入操作进行尽可能多的传输(不是 NVMe 读/写,而是通过供应商特定的命令接口进行的读/写)
我们尝试调整现有的几乎每个内核参数,包括对 nvme 使用轮询/混合轮询/中断、更改最大传输大小等,但都无济于事。
该服务器能够使用 10 个甚至 24 个 nvme 驱动器,它是为此而构建的,并且 CPU 使用率绝对不是瓶颈。我们从用户空间到内核空间的所有数据传输都是零拷贝和 512 字节对齐的,这可以通过在实例上运行 perf 来确认。
如果有人有在 Ubuntu 中调整超过 10 个驱动器的大型 NVME 存储系统的经验(Ubuntu 是我们目前的主要 Linux 发行版),请分享还有什么其他方法可以让超过 10 个设备以最大传输速率运行。
答案1
可能值得检查一下 perf 的瓶颈在哪里。
安装方式:
sudo apt-get install linux-tools
记录事件,例如以每秒 1000 个样本的速度记录 20 秒:
sudo perf record -a -F 1000 sleep 20
..看看瓶颈在哪里发生:
sudo perf report
參閱https://perf.wiki.kernel.org/index.php/Tutorial有关 perf 的更多详细信息。一篇关于使用 perf 监控内存带宽利用率的非常有用的文章是https://yunmingzhang.wordpress.com/2015/07/22/measure-memory-bandwidth-using-uncore-counters/
或者,这可能是内存/缓存带宽限制,在这种情况下,可以在一些现代处理器上使用 pqos 工具来监视缓存利用率:
sudo apt-get install intel-cmt-cat
sudo modprobe msr
sudo pqos -r