【问题标题】:How to get good read performance from tape?如何从磁带中获得良好的读取性能?
【发布时间】:2014-07-09 14:01:15
【问题描述】:

我有一个算法可以执行一些文件 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 资源管理器能够以良好的吞吐量将文件从磁带传输到磁盘。

如何在此处获得良好的读取性能?

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

【问题讨论】:

  • 读取块是为了尽量减少存储在 RAM 中的数据量。您不必使用这么小的块大小。
  • 您的磁带机的读取速度是多少?如果它是 80MB/s,那么读取 8KB 需要 0.1ms(假设没有查找开销)。很明显,相应的 1 毫秒睡眠会大大减慢速度。
  • @OliCharlesworth 抱歉,我之前遗漏了数字。我相信它大约是 80 MB/s(这只是我观察到的最好的)。你的分析是正确的,我们应该预计会出现大幅放缓,大约是一个幅度。因为现在读取 8KB 需要 1.1 毫秒,也就是大约 7.1 MB/秒。然而,实际上阅读速度低于 150 KB / s
  • @LemonBeagle:我对磁带操作的特性了解不多,但我预计每次读取操作(加速和减速磁带或其他)也会涉及很大的开销。

标签: performance io


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-21
    • 2020-11-07
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多