我们编写了一个应用程序,该应用程序在同一个本地卷 (RAID1) 上一次对多个文件执行小 (22kB) 写入(一个线程代表其他线程对多个位置执行异步排队写入)。
99.9% 的写入是低延迟的,但偶尔(可能每分钟或两分钟)我们会收到一两个巨大的延迟写入(我见过 10 秒及以上)而没有任何真正的解释。
平台:带 NTFS 的 Win2003 服务器。
监控:Sysinternals Process Monitor(参见下面的链接)和我们自己的应用程序日志记录。
我们已经尝试了多种方法来尝试解决从一些网站收集到的这个问题,例如:
使文件名的第一部分唯一以帮助 8.3 名称生成
将文件写入多个目录
更改英特尔磁盘写入缓存
Windows 文件/打印机共享
最小化内存使用
平衡
最大化文件共享的数据吞吐量
最大化网络应用程序的数据吞吐量
系统->高级->性能->高级
NtfsDisableLastAccessUpdate - 使用 fsutil 行为设置 disablelastaccess 1
禁用 8.3 名称生成 - 使用“fsutil 行为集 disable8dot3 1”+ 重新启动
启用大尺寸文件系统缓存
禁用内核代码的分页
IO 页面锁定限制
关闭(或打开)索引服务
但似乎没有什么太大的不同。有很多事情我们还没有尝试过,但我们想知道是否有人遇到过同样的问题、原因和解决方案(程序化与否)?
我们可以使用 IOMeter 和简单的设置重现问题:
启动 IOMeter 并使用断开按钮删除“拓扑”中除第一个工作线程之外的所有工作线程。
选择 Worker 线程并在 Disk Targets 选项卡中要使用的磁盘旁边的框中打一个叉,然后在 Maximum Disk Size 中输入“2000000”(注意:必须至少有 1GB 可用空间;扇区大小为 512 字节)
接下来创建一个新的访问规范并将其添加到工作线程:
传输请求大小 = 22kB
100% 连续
访问规范的百分比 = 100%
读/写百分比 = 100% 写
将结果显示更新频率更改为 5 秒,将测试设置运行时间更改为 20 秒,并将“自动生成的工人数量”设置均为零。
在 Topology 面板中选择 Worker Thread 并点击 Duplicate Worker 按钮 59 次以创建 60 个具有相同设置的线程。
点击“开始”按钮(绿旗)并监控“结果”选项卡。我们机器上的“最大 I/O 响应时间 (ms)”总是至少达到 3500。我们的机器并不是很慢(具有 4GB 和板载 RAID 的 Xeon 8 核机架服务器)。
我很想看看其他人得到了什么。我们感觉这可能与 NTFS 文件系统有关(我们的文件系统目前 75% 都是碎片文件),我们将围绕这个原则尝试一些事情。但它也与磁盘性能有关,因为我们在 RAMDisk 上看不到它,而且在 RAID10 阵列上也没有那么严重。
任何帮助深表感谢。
理查德
右键单击并选择“在新选项卡中打开链接”:
ProcMon 结果
我现在有更多关于这个问题的信息。
在使用各种硬件在 12 台不同的机器上测试了所描述的 IOMeter 测试后,我将其缩小到特定的 RAID 芯片组(具有相同芯片组的 3 台不同的机器使用 RAID1 和 RAID10 表现出这种行为)。所有其他机器的结果至少要好一个数量级。
芯片组:英特尔 631xESB/632xESB SATA RAID(又名 ESB2)
有关更多信息,请参阅英特尔网站上的这篇文章,并希望得到英特尔的回应:
英特尔 631xESB/632xESB SATA RAID (aka ESB2) writes slow
理查德