我正在调查某些新硬件导致的应用程序运行缓慢的问题,并遇到了一些奇怪的结果。我正在尝试确定导致此行为的原因。
我在用
dd if=x.b1 of=x.b10 bs=8192 oflag=dsync
101MB 文件的模拟我们的数据库如何写入磁盘(该dsync
标志由我们的数据库供应商建议),虽然没有 dsync 选项的普通 dd 命令显示 80-100 Mb/s,但使用 dsync 命令我得到的结果在 160Kb/s-200Kb/s 范围内。
这种行为已在多个硬件以及不同型号的硬盘上出现,并进行了驱动器擦除测试
dd if=/dev/zero of=/dev/sda bs=8192 oflag=dsync
显示更预期的 80-100Mb/s 速度,这似乎表明我们的自定义操作系统中存在一些问题,导致速度变慢。我们在自定义 SuseLinux 以及 OracleOS(32 位和 64 位)下运行了这些测试,我们继续看到这些非常低的数字。
你能告诉我问题出在哪里吗?
答案1
在 dd 上指定oflag=dsync
标志将大大减慢输出文件的写入速度。
来自dd 手册:
同步
使用同步 I/O 来处理数据。对于输出文件,这会强制在每次写入时对输出数据进行物理写入。
每复制一个 8kb 块后,dd 都会等待数据以物理方式写入磁盘。这会绕过所有缓存,包括驱动器本身的硬件缓存。在复制完成之前,不会开始复制 8kb 块。
如果复制速度为 200KB/s,块大小为 8k,则大约为 25 sync/s 或 40ms sync。这个时间对于硬盘来说非常典型。
数据库供应商可能会要求您尝试这一点,因为他们对数据库的事务日志使用同步 I/O(以提供 ACID 可靠性保证)。