2010-01-08 183 views
6

我一直在試圖找出編碼文件複製例程以將大文件複製到RAID 5硬件上的最快方法。提高高速文件複製的寫入速度?

平均文件大小約爲2 GB。

有2個窗口框(都運行win2k3)。第一個框是源文件,大文件位於何處。第二個盒子有一個RAID 5存儲器。

http://blogs.technet.com/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx

上面的鏈接清楚地解釋了爲什麼窗口複製,ROBOCOPY和其他常見的複製實用程序寫入性能受到影響。 因此,我寫了一個C/C++程序,它使用CreateFile,ReadFile & WriteFile API的NO_BUFFERING & WRITE_THROUGH flags。該程序模擬ESEUTIL.exe,在某種意義上,它使用2個線程,一個用於讀取,一個用於寫入。讀者線程從源讀取256 KB並填充緩衝區。一旦填充了16個這樣的256 KB塊,寫入器線程將緩衝區中的內容寫入目標文件。正如你所看到的,寫作者線程一次寫入8MB數據。該程序分配32個這樣的8MB塊......因此,寫入和讀取可以並行發生。 ESEUtil.exe的詳細信息可以在上面的鏈接中找到。 注意:使用NO_BUFFERING時,我正在處理數據對齊問題。

我使用了像ATTO這樣的基準測試工具,發現我們的RAID 5硬件在寫入8MB數據塊時的寫入速度爲每秒44MB。這是大約2.57 GB每分鐘

但是我的程序只能達到每分鐘1.4GB的

任何人都可以請幫助我確定問題是什麼?有沒有更快的API其他CreateFile,ReadFile,WriteFile可用?

+0

您可能想要發佈一些代碼,將其轉化爲編程問題;否則,它很可能會移到serverfault.com。 – RickNZ 2010-01-08 05:51:56

+0

等待,每秒44MB?這不是你現在應該爲單個磁盤獲得的持續吞吐量嗎? – 2010-01-08 05:56:17

+1

@Pascal:RAID 5沒有針對寫入速度進行優化。我很驚訝你甚至可以達到44MB/s。我預計會降低。 – jalf 2010-01-08 22:52:10

回答

0

如果您不寫目標文件,您可以多快地讀取源文件?

源文件是否被分割?碎片化讀取可能比連續讀取慢一個數量級。您可以使用「重疊羣」實用,使之連續:

http://technet.microsoft.com/en-us/sysinternals/bb897428.aspx

有多快的網絡連接兩臺機器?

你有沒有試過只寫虛擬數據,而不先讀它,就像ATTO那樣?

您一次有多個讀取或寫入請求嗎?

RAID-5陣列的條帶大小是多少?一次寫一個完整的條紋是寫入RAID-5的最快方式。

0

只要記住一個硬盤緩衝來自盤片的數據並進入盤片。大多數磁盤驅動器將嘗試優化讀取請求以保持盤片旋轉並最小化頭部移動。在寫入盤片之前,驅動器會嘗試從主機吸收儘可能多的數據,以便儘快斷開主機的連接。

你的性能還取決於PC上的I/O總線流量以及磁盤和主機之間的通信。還有其他可供選擇的因素需要考慮,例如系統任務和「同時」運行的程序。您的測量工具可能無法達到確切的性能。請記住,由於上述開銷,這些時間點有一個錯誤因素。

如果您的平臺具有DMA控制器,請嘗試使用這些控制器。

0

如果寫入速度非常重要,那麼爲什麼不考慮用於硬件配置的RAID 0?

  • 客戶希望RAID 5
  • 優於RAID 0,因爲更好的容錯性。
  • 客戶對RAID 5能提供什麼滿意。這裏的問題 是使用ATTO對硬件進行基準測試,顯示每分鐘2.57 GB的寫入速度(8MB 塊寫入),爲什麼複製工具無法實現接近它?類似於每GB 分鐘2 GB是我們正在尋找的東西。到目前爲止,我們只能達到每分鐘約1.5 GB的速度。
0

做到這一點,正確的方法是用無緩衝完全異步I/O。您將希望發出多個I/O來保持隊列正在運行。這可以讓文件系統,驅動程序和Raid-5子系統更好地管理I/O。

您還可以打開多個文件,並向多個文件發出讀取和寫入信息。

注意!未完成的I/O的最佳數量以及交錯讀取和寫入的方式在很大程度上取決於存儲子系統本身。您的節目需要高度配置,以便調整。

注 - 我相信是的Robocopy已得到改進 - 你試過了嗎?我

+0

一個目標是使磁頭移動最小化。如果您打開多個文件或在運行中有非順序I/O請求,則磁頭查找會導致I/O吞吐量下降一個數量級或更多。 – RickNZ 2010-01-12 10:26:06

+1

其實這是不正確的。首先打開幾個文件即可獲得該I/O。它也讓文件系統更有效地加載目錄實體。如果有一系列I/O請求需要處理,操作系統通常會做得更好。 – Foredecker 2010-01-13 04:18:16

6

您應該使用異步IO來獲得最佳性能。這是打開文件FILE_FLAG_OVERLAPPED並使用WriteFile的參數LPOVERLAPPED。使用FILE_FLAG_NO_BUFFERING您可能獲得更好的表現,也可能獲得更好的表現。你將不得不測試看看。

FILE_FLAG_NO_BUFFERING通常會爲您提供更一致的速度和更好的流式傳輸行爲,並且避免使用您可能不再需要的數據污染磁盤緩存,但整體速度不一定更快。

你也應該測試看到的最好的尺寸是什麼IO的每個塊。根據我的經驗每次複製4k文件和每次複製1Mb文件有巨大的性能差異。

在我過去的這個測試(幾年前),我發現,塊大小低於大約64kB的是由頭頂爲主,總吞吐量持續改善具有較大的塊大小高達約512KB。如果今天的驅動器需要使用大於1MB的塊大小以獲得最大吞吐量,我不會感到驚訝。

你目前正在使用似乎是合理的,但可能不是最佳的數字。另外,我相當確定FILE_FLAG_WRITE_THROUGH可以防止使用磁盤緩存,因此會花費您一定的性能。

您還需要注意,使用複製的CreateFile/WriteFile的不復制元數據,如NTFS時間戳或替代數據流文件。你將不得不自己處理這些事情。

其實用自己的代碼替換CopyFile是一個相當大量的工作。

附錄:

我也許應該提到的是,當我(大約10年前)在WindowsNT的3.0試圖與軟件RAID 0。速度對緩衝區內存的對齊非常敏感。事實證明,當DMA超過16個物理區域的內存(64Kb)時,SCSI驅動程序必須使用特殊的算法來從分散/收集列表中進行DMA。要獲得保證最佳性能,需要物理連續分配 - 這是隻有駕駛員才能請求的情況。這基本上是當時受歡迎的芯片組DMA控制器中的錯誤的解決方法,並且不太可能是問題。

但 - 我還是強烈建議你從32KB測試2米大小的所有電源,32Mb的,看看這是更快。你可能會考慮測試一下,看看有些緩衝區是否比其他緩衝區更快 - 這是前所未有的。

+0

+1。對於異步I/O。 – wj32 2010-01-12 21:36:08

+0

我還沒有嘗試過異步IO。我必須嘗試一下。 順便說一句,經過一些讀/寫測試後,我發現256 KB讀取和8MB寫入正在產生最大吞吐量。我編寫了一個讀取程序來檢查讀取速度,並使用ATTO和另一個自定義編寫的程序來測試寫入吞吐量。 – ring0 2010-01-19 12:12:09

2

前陣子我寫了一個博客張貼有關異步文件I/O,以及如何往往傾向於實際上最終是同步的,除非你做的一切恰到好處(http://www.lenholgate.com/blog/2008/02/when-are-asynchronous-file-writes-not-asynchronous.html)。

關鍵是,即使您使用的是FILE_FLAG_OVERLAPPEDFILE_FLAG_NO_BUFFERING,您仍然需要預擴展文件,以便異步寫入不需要隨時擴展文件;出於安全原因文件擴展名始終是同步的。要預先擴展,您需要執行以下操作:

  • 啓用SE_MANAGE_VOLUME_NAME權限。
  • 打開文件。
  • 尋求到所需的文件長度SetFilePointerEx()
  • SetEndOfFile()設置文件末尾。
  • 設置文件SetFileValidData()中的有效數據的結束。
  • 關閉文件。

則...

  • 打開寫入文件。
  • 發出寫入
+0

其實我是預擴展文件。由於我使用的是NO_BUFFERING,因此我正在處理數據對齊問題。例如,要複製1027 KB文件。 1)我創建一個1024 KB的目標文件。使用SetFilePointerEx和SetEndOfFile。 1024 KB,因爲對齊考慮。 2)開始複製。 3)複製1024 KB後,我關閉目標文件句柄,不使用NO_BUFFERING標誌重新打開它,使用SetFilePointerEx尋找適當的偏移量,然後發出WriteFile,它將自動將文件增長到1027KB。 我還沒有讀你的博客。我會做到這一點,並回到你身邊。 – ring0 2010-01-19 12:24:15

0

我做了一些測試並得到了一些結果。 測試是在100Mbps的& 1Gbps網卡上進行的。源機器是Win2K3服務器(SATA),目標機器是Win2k3服務器(RAID 5)。

我跑了3次試驗:

1)網絡讀者 - >這個程序在網絡上只是讀取文件。該程序的目的是找到最大n/w讀取速度。我正在執行使用CreateFile的非緩衝讀取& ReadFile。

2)Disk Writer - >該程序通過寫入數據來衡量RAID 5的速度。非緩衝寫入使用CreateFile & WriteFile執行。

3)Blitz複製 - >該程序是文件複製引擎。它通過網絡複製文件。在最初的問題中討論了這個程序的邏輯。我正在使用帶NO_BUFFERING的同步I/O讀取&寫入。使用的API是CreateFile,ReadFile & WriteFile。


下面是結果:

網絡的讀者: -

百兆網卡

花了148344毫秒讀取768 MB與塊大小8 KB。

注意到89359毫秒讀取768 MB與塊大小64 KB

注意到82625毫秒讀取768 MB與塊大小128 KB

注意到79594毫秒讀取768 MB與塊大小256 KB

花了78687毫秒讀取768 MB與塊大小512 KB

花了79078毫秒讀取768 MB與塊大小爲1024 KB

花了78594毫秒讀取768 MB與塊大小2048 KB

花了78406毫秒讀取768 MB與塊大小4096 KB

花了78281毫秒讀取768 MB與塊大小8192 KB

1 Gbps的NIC

注意到206203毫秒讀取5120 MB(5GB)與塊大小8 KB

注意到77860毫秒讀取5120 MB與塊大小64 KB

花費74531毫秒讀取5120 MB的塊大小128 KB

花費68656 ms讀取塊大小爲256 KB的5120 MB

花了64922毫秒讀取5120 MB與塊大小爲512 KB

花了66312毫秒讀取5120 MB與塊大小爲1024 KB

花了68688毫秒讀取5120 MB與塊大小2048 KB

花了64922毫秒讀取5120 MB與塊大小4096 KB

花了66047毫秒讀取5120 MB與塊大小8192 KB

DISK編劇: - 隨着NO_BUFFERING & WRITE_THROUGH

寫作2048MB對RAID 5進行

寫(2GB)大小爲4MB的數據佔用了68328ms。

寫入塊大小爲8MB的2048MB數據花了55985ms。

寫入塊大小爲16MB的2048MB數據需要49569ms。

寫入塊大小爲32MB的2048MB數據需要47281ms。

寫在RAID 5進行與僅塊大小爲4MB NO_BUFFERING

數據寫入2048MB(2GB)把57484ms。與塊大小8MB的數據

寫作2048MB了52594ms。

寫入塊大小爲16MB的2048MB數據花費了49125ms。

寫入塊大小爲32MB的2048MB數據需要46360ms。

隨着塊大小的減小,寫入性能線性下降。而WRITE_THROUGH標誌引入了一些性能命中

BLITZ COPY: -

1 Gbps的NIC,複製60 GB的文件與NO_BUFFERING

拍攝時間才能完成副本:2236735毫秒。即37.2分鐘。 速度約爲97 GB /每個。

百兆網卡,複製60 GB的文件與NO_BUFFERING

拍攝時間才能完成副本:7337219毫秒。即,122分鐘。 速度約爲30 GB /每個。

我嘗試使用Jeffrey Ritcher的10-FileCopy程序,它使用Async-IO和NO_BUFFERING。但是,結果很差。我想原因可能是塊大小爲256 KB ...在RAID 5上寫入256 KB的速度非常慢。

比較ROBOCOPY:

百兆網卡:閃電戰複製和ROBOCOPY執行@〜每小時30 GB。

1 GBps網卡:閃電覆制每小時@ @ 97 GB,而robocopy @〜每小時50 GB。