如何从磁带获得良好的读取性能?

时间:2012-04-25 00:25:33

标签: performance io

我有一个执行文件I / O(读,写)和计算的算法。

如果我写入磁带(未读取),算法效果很好。如果我从磁带上读(没有写),性能很差。如果将磁带从等式中取出(只是磁盘用于I / O),那么它的效果很好。

现在,我把它归结为一个我想要理解的相对简单的案例。

设置是磁带上的单个20 GB文件。我按顺序在块中读取此文件。

测试算法类似于:

while (fileRemaining)
{
    ReadBlock(blockSize);
    Sleep(sleepTime); // this is to mimic computation time
}

一些观察结果:

  • 当使用8K的blockSize,并且sleepTime为0时,吞吐量(数据读取/秒)是好的。此外,磁带机不断发出噪音。
  • 当使用8K的blockSize和任何非零睡眠时间(甚至1ms)时,吞吐量会受到严重影响。数据仍然被读取,但磁带驱动器不会经常发出噪音。它偶尔会发出一阵噪音。
  • 当使用2M的blockSize和100ms的sleepTime时,吞吐量良好。磁带机整个时间都会产生噪音(虽然它听起来像速度较慢?)。
  • Windows资源管理器能够以良好的吞吐量将文件从磁带传输到磁盘。

如何在此获得良好的阅读效果?

如果你非常友好地帮助我理解其他的谜团 - 为什么睡眠的存在会如此显着地甩掉吞吐量(知道这有助于重新思考算法)?一次从磁带读取的“最佳”量是多少?来自磁带机的噪音是否与通知相关?

1 个答案:

答案 0 :(得分:1)

您尚未提供驱动器正在使用的磁带介质,驱动器或接口类型的任何详细信息。

LTO4 / 5等当前技术能够以大约240 - 280MB / s的速度提供数据。通过读取LTO的最佳块大小来实现性能我相信这是64KB。块大小高达256KB不会对显着影响,但会读取大量小块。读取/写入更大的块,并在读入数据后将数据分离到程序中。如果数据已经在8KB块中的磁带上,则将驱动器设置为固定块模式并读取多个8KB块。

磁带机必须达到特定的运动速度才能读取数据。如果数据没有足够快地从驱动器流式传输,那么驱动器将不得不减速,停止,倒带,重新定位,恢复速度,然后再次开始读取。此停止/启动将对性能产生重大影响。 LTO试图通过能够以不同的磁带速度读取来弥补这一点,但是存在限制。

使用异步I / O可以进一步提高速度,但我不相信这不是必需的。