IRP_MJ_WRITE 延迟最多 15 秒

IRP_MJ_WRITE 延迟最多 15 秒

我们编写了一个应用程序,可以在同一本地卷(RAID1)上同时对多个文件执行小规模(22kB)的写入操作(一个线程代表其他线程对多个位置执行异步排队写入)。99.9
%的写入都是低延迟的,但偶尔(可能每隔一两分钟)我们会得到一两次巨大的延迟写入(我见过10秒及以上),但没有任何真正的解释。

平台:带 NTFS 的 Win2003 Server。
监控:Sysinternals 进程监控器(见下面的链接)和我们自己的应用程序日志记录。

我们尝试了多种方法来解决这个问题,这些方法都是从一些网站上收集到的,例如:

  • 使文件名的第一部分唯一以帮助 8.3 名称生成

  • 将文件写入多个目录

  • 更改英特尔磁盘写入缓存

  • Windows 文件/打印机共享

    • 尽量减少内存使用

    • 平衡

    • 最大化文件共享的数据吞吐量

    • 最大化网络应用程序的数据吞吐量

  • 系统->高级->性能->高级

  • NtfsDisableLastAccessUpdate - 使用 fsutil 行为设置 disablelastaccess 1

  • 禁用 8.3 名称生成 - 使用“fsutil behavior set disable8dot3 1”+重新启动

  • 启用大尺寸文件系统缓存

  • 禁用内核代码分页

  • IO 页面锁定限制

  • 关闭(或打开)索引服务

但似乎没有什么太大的区别。有很多事情我们还没有尝试过,但我们想知道是否有人遇到过同样的问题、原因和解决方案(是否是程序化的)?

我们可以使用 IOMeter 和一个简单的设置来重现这个问题:

  1. 启动 IOMeter 并使用断开连接按钮删除‘拓扑’中除第一个工作线程之外的所有线程。

  2. 选择工作线程,在“磁盘目标”选项卡中要使用的磁盘旁边的框中打叉,并在“最大磁盘大小”中输入“2000000”(注意:必须至少有 1GB 的可用空间;扇区大小为 512 字节)

  3. 接下来创建一个新的访问规范并将其添加到工作线程:

    • 传输请求大小 = 22kB

    • 100% 顺序

    • 访问规范百分比 = 100%

    • 读取/写入百分比 = 100% 写入

  4. 将结果显示更新频率更改为 5 秒,测试设置运行时间更改为 20 秒,并将“自动生成的工人数量”设置更改为零。

  5. 在拓扑面板中选择工作线程,然后点击“复制工作线程”按钮 59 次,以创建 60 个具有相同设置的线程。

点击“开始”按钮(绿色旗帜)并监视“结果”选项卡。我们的机器上的“最大 I/O 响应时间(毫秒)”始终至少达到 3500。我们的机器并不慢(Xeon 8 核机架服务器,4GB 和板载 RAID)。

我很想知道其他人得到了什么。我们觉得这可能与 NTFS 文件系统有关(我们的文件系统目前有 75% 都是碎片文件),我们将围绕这个原则尝试一些方法。但它也与磁盘性能有关,因为我们在 RAMDisk 上看不到它,而且它在 RAID10 阵列上没有那么严重。

任何帮助都非常感谢。
理查德

右键单击并选择“在新选项卡中打开链接”:
ProcMon 结果

答案1

我现在对这个问题有了更多的了解。

在使用各种硬件的 12 台不同机器上测试了所述 IOMeter 测试后,我将其范围缩小到特定的 RAID 芯片组(使用 RAID1 和 RAID10 的 3 台具有相同芯片组的不同机器表现出这种行为)。所有其他机器的结果至少好一个数量级。

芯片组:英特尔 631xESB/632xESB SATA RAID(又名 ESB2)

请参阅英特尔网站上的这篇文章以了解更多信息,并希望得到英特尔的回复:
Intel 631xESB/632xESB SATA RAID(又名 ESB2)写入速度慢

理查德

相关内容