设置
MoBo:Super Micro 服务器
处理器:Twin Xenon,配备 20 个物理核心和 40 个线程
内存:128 GB
操作系统:Cento 7.x 服务器
VCard:nVidia Quadro 4000
该任务涉及以机械方式尽可能快地写入和读取 USB 安装的 SSD(1TB Micron 5100 Pro 格式 vfat),以验证数据完整性。每个处理器有 40 个 PCIe 2.0 通道。其中 1 个有两个 StarTech USB 3.0 卡,具有专用的 5Gbps 通道,但没有额外的内部电源。我们使用 Orico 外部 SSD 文档来连接和为驱动器供电。除了不同的 USB 文档之外,服务器硬件、SSD 格式和操作系统无法修改。
现在来看看实际的问题。当我们开始在写入/读取周期中写入驱动器时,一切开始正常。
-从远程文件服务器获取 200Mb 到 1.6GB 的文件(存储在本地 RAM 中)
-将文件写入四个 USB 安装的 SSD 中的每一个(每次写入都在其自己的线程上)
-从 USB 安装的 SSD 读取文件进行 SHA 检查(也在单独的线程上) -
从 RAM 中清除文件数据
-重复,直到所有文件完成
写入大约十几个文件后,一两个磁盘上的写入速度会变得非常慢,以至于其他磁盘被迫等待,因为我们对同时保存的文件数量进行了限制。然后磁盘将“赶上”,另一个磁盘将变慢。这个问题是间歇性的,我们已经写入了整批文件(最多 1600 个),没有任何问题,并且只占物理可能值的 10%。
所以问题是,是什么原因导致了这种情况,我们可以做些什么来防止这种情况发生?我们的软件确保不会同时写入和读取任何磁盘,也不会尝试一次从任何给定磁盘读取或写入多个文件。任何帮助都将不胜感激。
PS 这与我问的问题不同这里。
编辑 1:所以这可能实际上与 USB、SSD、驱动程序、上下文切换、PCIe 带宽等无关......我只是碰巧在一个非常合适的时刻暂停执行,而我用来存储要写入的数据的 std::vector 在 QtCreator 的调试器上被标记为不可访问。几个打印语句和一些断点之后,我发现数据在那里,::data() 函数返回的指针是好的,一切都如它应该的那样,除了调试器中的局部变量显示为不可访问。然而,每次向量显示不可访问时,写入磁盘的时间都非常长。所以,现在我正在寻找破坏内存或类似的东西。非常奇怪的行为。