1

我有一个算法可以执行一些文件 I/O(读、写)和计算。

如果我写入磁带(而不是读取),该算法效果很好。如果我从磁带读取(不写入),性能很差。如果不考虑磁带(仅用于 I/O 的磁盘),那么它的效果很好。

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

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

测试算法类似于:

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

一些观察:

  • 当使用 8K 的 blockSize 和 0 的 sleepTime 时,吞吐量(数据读取/秒)很好。此外,磁带机不断发出噪音。
  • 当使用 8K 的块大小和任何非零睡眠时间(甚至 1 毫秒)时,吞吐量会受到严重影响。数据仍会被读取,但磁带机不会经常发出噪音。它变得安静了一段时间,偶尔会发出噪音。
  • 当使用 2M 的 blockSize 和 100ms 的 sleepTime 时,吞吐量很好。磁带机在整个过程中都会发出噪音(尽管听起来好像速度较慢?)。
  • Windows 资源管理器能够以良好的吞吐量将文件从磁带传输到磁盘。

如何在这里获得良好的读取性能?

如果您也愿意帮助我理解其他奥秘——为什么睡眠的存在会如此显着地降低吞吐量(知道这有助于重新思考算法)?一次从磁带读取的“最佳”数量是多少?来自磁带驱动器的噪音是否与注意相关?

4

1 回答 1

1

您没有提供磁带介质、驱动器或驱动器使用的接口类型的任何详细信息。

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

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

使用异步 I/O 可以进一步提高速度,但是我认为这对于这个应用程序来说不是必需的。

于 2012-05-16T23:48:59.933 回答