对于大文件,内部磁盘之间的传输速度会变慢

对于大文件,内部磁盘之间的传输速度会变慢

我在一台具有 1.6Ghz 双核 CPU、4GB RAM 和 2x250GB 7200 SATA 驱动器(均为 3.0Gb/s 且从全新安装中新格式化)的机器上运行 Ubuntu Server 11.04 (amd64)。当我在两个驱动器之间传输相对较小的文件(~100MB)时,我获得的传输速率(优于)预期,在 300-350MB/秒范围内。但是,传输 500MB 文件的速度约为 50MB/秒,而传输 1GB 文件的速度约为 25MB/秒。

以下是我运行的一些显示此行为的测试:

/disk1 $ dd if=/dev/zero of=output-small.dat bs=1M count=128
 bytes (134 MB) copied, 0.388619 s, 345 MB/s
/disk1 $ dd if=/dev/zero of=output-med.dat bs=1M count=500
524288000 bytes (524 MB) copied, 20.0151 s, 26.2 MB/s
/disk1 $ dd if=/dev/zero of=output-large.dat bs=1M count=1000
1048576000 bytes (1.0 GB) copied, 45.7304 s, 22.9 MB/s

/disk2 $ dd if=/dev/zero of=output-small.dat bs=1M count=128
134217728 bytes (134 MB) copied, 0.372266 s, 361 MB/s
/disk2 $ dd if=/dev/zero of=output-med.dat bs=1M count=500
524288000 bytes (524 MB) copied, 10.0856 s, 52.0 MB/s
/disk2 $ dd if=/dev/zero of=output-large.dat bs=1M count=1000
1048576000 bytes (1.0 GB) copied, 37.1851 s, 28.2 MB/s

$ time cp /disk1/output-small.dat /disk2/test-small.dat
real    0m0.532s
user    0m0.000s
sys     0m0.410s

$ time cp output-med.dat /playpen/test-med.dat
real    0m30.879s
user    0m0.010s
sys     0m3.740s

$ time cp /disk1/output-large.dat /disk2/test-large.dat
real    0m26.643s
user    0m0.010s
sys     0m3.390s

最后,运行命令时pv < /disk1/output-large.dat > /disk2/test.dat,我最初看到出色的传输速度,但随后速率下降到 1-10MB/秒范围,周期性地跳得更高。我知道这不是一个特别有用的磁盘性能测量方法,因为我正在使用 pv,但它与我的其他测试的性能一致。

我有几个问题:

  • 是什么原因导致我的传输速度在传输较大文件时降低?难道它不应该加快吗?
  • 采用这种设置我应该能看到什么样的速度?
  • time在我看来,等待 IO(从, real- )所花的时间(大概)sys似乎太长了。是吗?

答案1

小文件适合放在页面缓存中,因此测试在内容写入磁盘之前就已完成。尝试将 conv=f​​sync 选项添加到 dd。

对于 1 GB 的文件,也许您会遇到写回的一些副作用,导致吞吐量低于磁盘应能处理的吞吐量。您可以尝试 dd 选项 iflag=direct 和 oflag=direct 来绕过页面缓存,看看这会如何影响结果。

答案2

您可能会看到文件缓存的效果。您可以将 iflag 或 oflag 设置为 nocache,然后重新测试,这样您将看到原始的、基于媒体的速度,而不是缓冲区到缓冲区的速度。

相关内容