2012-04-25 50 views
1

我有一個算法,執行一些文件I/O(讀,寫)和計算。如何從磁帶獲得良好的讀取性能?

如果我寫入磁帶(不讀取),該算法效果很好。如果我從磁帶上讀(不寫),表現很差。如果磁帶不在等式中(只是I/O的磁盤),那麼它就很好。

現在,我把它歸結爲一個我試圖理解的相對簡單的案例。

該設置是磁帶上的一個20 GB文件。我正在按順序讀取該文件。

測試算法是這樣的:

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

一些觀察:

  • 當使用8K的塊大小,和0休眠時間,吞吐量(數據讀/秒)是好的。此外,磁帶機不斷髮出噪音。
  • 當使用8K的blockSize和任何非零的sleepTime(甚至1ms)時,吞吐量會受到嚴重影響。數據仍然被讀取,但磁帶驅動器不會定期發出噪音。偶爾會有噪音,它變得沉默了一會兒。
  • 當使用blockSize爲2M,睡眠時間爲100ms時,吞吐量很好。磁帶機在整個過程中都會產生噪音(儘管它聽起來像是一種較慢的速度?)。
  • Windows資源管理器能夠以良好的吞吐量將文件從磁帶傳輸到磁盤。

如何在這裏獲得良好的閱讀效果?

如果你願意幫助我理解其他的祕密 - 爲什麼睡眠的存在會如此顯着地降低吞吐量(知道這有助於重新考慮算法)?一次從磁帶讀取的「最佳」數量是多少?磁帶機發出的噪音是否與通知有關?

+0

您可以讀取塊,以便最大限度地減少RAM中存儲的數據量。你不必使用這麼小的塊大小。 – Blender 2012-04-25 00:28:46

+0

磁帶機的讀取速度是多少?如果是80MB/s,那麼讀取8KB需要0.1ms(假設沒有尋道開銷)。很明顯,相應的1ms睡眠會大大減慢速度。 – 2012-04-25 00:31:00

+0

@OliCharlesworth對不起,我早先排除了數字。我相信它大約是80 MB/s(這是我觀察到的最好結果)。你的分析是正確的,我們應該預計會有一個大幅度的放緩。從現在開始,讀取8KB需要1.1ms,這意味着大約7.1MB /秒。然而,實際上讀數低於150 KB /秒 – jglouie 2012-04-25 13:16:41

回答

1

您沒有給出驅動器正在使用的磁帶介質,驅動器或接口類型的任何詳細信息。

當前的技術如LTO4/5能夠以約240-280MB/s的速度傳輸數據。性能是通過讀取LTO的最佳塊大小來實現的我相信這是64KB。不超過256KB的塊大小不會產生顯着影響,但會讀取大量小塊。讀取/寫入較大的數據塊,並在讀取完程序後將數據分割。如果數據已經以8KB塊的形式存在磁帶上,則將驅動器設置爲固定塊模式並讀取多個8KB塊。

磁帶驅動器必須達到特定的運動速度才能讀取數據。如果數據未從驅動器流出足夠快,則驅動器將不得不減速,停止,倒帶,重新定位,恢復速度,然後再次開始讀取。此停止/啓動將對性能產生重大影響。 LTO試圖通過能夠以不同的磁帶速度讀取來進行補償,但是存在限制。

使用異步I/O可以進一步提高速度,但我不認爲這對於此應用程序不是必需的。