2010-01-08 24 views
6

Tôi đã cố gắng tìm ra cách nhanh nhất để mã một thói quen sao chép tập tin để sao chép một tệp lớn vào phần cứng RAID 5.Cải thiện tốc độ ghi cho bản sao tệp tốc độ cao?

Kích thước tệp trung bình khoảng 2 GB.

Có 2 ô cửa sổ (cả hai đều chạy win2k3). Hộp đầu tiên là nguồn, nơi có tệp lớn. Và hộp thứ hai có bộ nhớ RAID 5.

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

Liên kết ở trên giải thích rõ ràng lý do tại sao các cửa sổ sao chép, robocopy và tiện ích sao chép phổ biến khác đau khổ trong hoạt động ghi. Do đó, tôi đã viết chương trình C/C++ sử dụng CreateFile, ReadFile & API WriteFile với NO_BUFFERING & WRITE_THROUGH cờ. Chương trình mô phỏng ESEUTIL.exe, theo nghĩa, nó sử dụng 2 luồng, một cho đọc và một để viết. Chủ đề đọc đọc 256 KB từ nguồn và điền vào một bộ đệm. Khi 16 khối 256 KB như vậy được lấp đầy, chuỗi ghi sẽ ghi nội dung trong bộ đệm vào tệp đích. Như bạn có thể thấy, luồng ghi chỉ ghi 8MB dữ liệu trong 1 lần chụp. Chương trình phân bổ 32 khối 8MB như vậy ... do đó, việc viết và đọc có thể xảy ra song song. Thông tin chi tiết về ESEUtil.exe có thể được tìm thấy trong liên kết ở trên. Lưu ý: Tôi đang quan tâm đến các vấn đề căn chỉnh dữ liệu khi sử dụng NO_BUFFERING.

Tôi đã sử dụng các tiện ích đánh dấu băng ghế dự bị như ATTO và phát hiện ra rằng phần cứng RAID 5 của chúng tôi có tốc độ ghi là 44MB mỗi giây khi ghi dữ liệu 8MB. Đó là khoảng 2,57 GB mỗi phút.

Nhưng chương trình của tôi chỉ có thể đạt được 1,4 GB mỗi phút.

Có ai vui lòng giúp tôi xác định vấn đề là gì không? Có API nào khác nhanh hơn mà CreateFile, ReadFile, WriteFile có sẵn không?

+0

Bạn có thể muốn đăng một số mã, để biến điều này thành câu hỏi lập trình; nếu không, nó có khả năng được chuyển đến serverfault.com. – RickNZ

+0

Chờ, 44MB mỗi giây? Đó không phải là loại thông lượng bền vững mà bạn có nghĩa vụ phải mua một đĩa đơn ngày nay sao? –

+1

@Pascal: RAID 5 không được tối ưu hóa cho tốc độ ghi. Tôi ngạc nhiên khi bạn thậm chí còn nhận được 44MB/s. Tôi đã mong đợi thấp hơn. – jalf

Trả lời

0

Bạn có thể đọc tệp nguồn nhanh như thế nào nếu bạn không viết đích?

Tệp nguồn có bị phân mảnh không? Số lần đọc phân mảnh có thể có thứ tự độ lớn chậm hơn số lần đọc tiếp giáp. Bạn có thể sử dụng "Khoảng trống" tiện ích để làm cho nó tiếp giáp:

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

Làm thế nào nhanh chóng được mạng kết nối hai máy?

Bạn đã thử chỉ ghi dữ liệu giả, mà không đọc dữ liệu đầu tiên, như ATTO chưa?

Bạn có nhiều lần yêu cầu đọc hoặc viết trong chuyến bay tại một thời điểm không?

Kích thước sọc của mảng RAID-5 của bạn là bao nhiêu? Viết một sọc đầy đủ tại một thời điểm là cách nhanh nhất để ghi vào RAID-5.

0

Chỉ cần nhớ rằng một đĩa cứng đệm dữ liệu đến từ các đĩa cứng và đi đến đĩa cứng. Hầu hết các ổ đĩa sẽ cố gắng tối ưu hóa các yêu cầu đọc để giữ cho đĩa cứng quay và giảm thiểu chuyển động đầu. Các ổ đĩa cố gắng hấp thụ càng nhiều dữ liệu từ Máy chủ trước khi ghi vào đĩa cứng để Máy chủ có thể bị ngắt kết nối càng sớm càng tốt.

Hiệu suất của bạn cũng phụ thuộc vào lưu lượng truy cập bus I/O trên PC cũng như lưu lượng giữa đĩa và máy chủ lưu trữ. Có những yếu tố thay thế khác để xem xét như các nhiệm vụ hệ thống và các chương trình đang chạy "cùng một lúc". Bạn có thể không đạt được hiệu suất chính xác như công cụ đo lường của mình. Và hãy nhớ rằng những thời gian này có một yếu tố lỗi do các chi phí trên được đề cập ở trên.

Nếu nền tảng của bạn có bộ điều khiển DMA, hãy thử sử dụng các bộ điều khiển này.

0

Nếu tốc độ ghi là quan trọng, tại sao không xem xét RAID 0 cho cấu hình phần cứng của bạn?

  • Các khách hàng muốn RAID 5.
  • ưa thích trên RAID 0 vì khả năng chịu lỗi tốt hơn.
  • Khách hàng hài lòng với những gì mà RAID 5 có thể cung cấp. Câu hỏi ở đây là điểm chuẩn phần cứng bằng cách sử dụng ATTO cho thấy tốc độ ghi 2,57 GB mỗi phút (8MB đoạn viết), tại sao một công cụ sao chép không thể đạt được gần với nó? Một cái gì đó giống như 2 GB mỗi phút là những gì chúng tôi đang xem xét. Chúng tôi đã có thể đạt được chỉ ~ 1,5 GB mỗi phút cho đến nay.
0

Cách đúng để thực hiện điều này là với I/O không đồng bộ hoàn toàn không được đệm. Bạn sẽ muốn phát hành nhiều I/O để giữ một hàng đợi. Điều này cho phép hệ thống tập tin, trình điều khiển và hệ thống con Raid-5 tối ưu hóa hơn nữa I/O.

Bạn cũng có thể mở nhiều tệp và đọc và đọc nhiều tệp.

LƯU Ý! Số lượng tối ưu I/O nổi bật và cách bạn xen kẽ các lần đọc và ghi sẽ phụ thuộc rất nhiều vào chính hệ thống lưu trữ. Chương trình của bạn sẽ cần phải được đánh giá cao để bạn có thể điều chỉnh nó.

Lưu ý - Tôi tin rằng Robocopy đã được cải thiện - bạn đã thử chưa? Tôi

+0

Một mục tiêu là giảm thiểu chuyển động đầu đĩa. Nếu bạn mở nhiều tệp hoặc có yêu cầu I/O không tuần tự trong chuyến bay, tìm kiếm trên đĩa có thể làm cho thông lượng I/O giảm xuống theo thứ tự độ lớn hoặc nhiều hơn. – RickNZ

+1

Thực tế điều đó không đúng. Mở một số tập tin đầu tiên được rằng i/O ra khỏi con đường. nó cũng cho phép hệ thống tệp tải các thực thể thư mục hiệu quả hơn. Hệ điều hành thường sẽ hoạt động tốt hơn khi nó có hàng đợi các yêu cầu I/O để làm việc. – Foredecker

6

Bạn nên sử dụng IO không đồng bộ để có được hiệu suất tốt nhất. Đó là mở tệp bằng FILE_FLAG_OVERLAPPED và sử dụng đối số LPOVERLAPPED của WriteFile. Bạn có thể hoặc không thể có hiệu suất tốt hơn với FILE_FLAG_NO_BUFFERING. Bạn sẽ phải kiểm tra để xem.

FILE_FLAG_NO_BUFFERING thường cung cấp cho bạn tốc độ phù hợp hơn và hành vi phát trực tuyến tốt hơn và tránh làm ô nhiễm bộ nhớ cache trên đĩa với dữ liệu bạn có thể không cần nữa, nhưng không nhất thiết phải nhanh hơn.

Bạn cũng nên kiểm tra xem kích thước tốt nhất cho mỗi khối IO. Theo kinh nghiệm của tôi Có một sự khác biệt lớn về hiệu năng giữa việc sao chép một tệp 4k tại một thời điểm và sao chép nó 1Mb tại một thời điểm.

Trong thử nghiệm trước đây của tôi về điều này (một vài năm trước), tôi thấy rằng kích thước khối dưới 64kB bị chi phối bởi chi phí, và tổng sản lượng tiếp tục cải thiện với kích thước khối lớn hơn lên đến khoảng 512KB. Tôi sẽ không ngạc nhiên nếu với các ổ đĩa ngày nay, bạn cần sử dụng kích thước khối lớn hơn 1MB để có được thông lượng tối đa.

Các số bạn hiện đang sử dụng có vẻ hợp lý nhưng có thể không tối ưu. Ngoài ra tôi khá chắc chắn rằng FILE_FLAG_WRITE_THROUGH ngăn chặn việc sử dụng bộ nhớ cache trên đĩa và do đó sẽ chi phí cho bạn một chút công bằng về hiệu suất.

Bạn cũng cần lưu ý rằng việc sao chép tệp bằng cách sử dụng CreateFile/WriteFile sẽ không sao chép siêu dữ liệu như dấu thời gian hoặc luồng dữ liệu thay thế trên NTFS. Bạn sẽ phải đối phó với những điều này một mình.

Thực tế thay thế CopyFile bằng mã của riêng bạn là khá nhiều công việc.

Hợp đồng bổ sung:

Tôi có lẽ nên đề cập đến khi tôi dùng thử phần mềm Raid 0 trên WindowsNT 3.0 (khoảng 10 năm trước). Tốc độ là rất nhạy cảm với sự liên kết trong bộ nhớ của bộ đệm. Nó bật ra rằng vào thời điểm đó, các trình điều khiển SCSI đã phải sử dụng một thuật toán đặc biệt để thực hiện DMA từ một danh sách phân tán/thu thập, khi DMA có hơn 16 vùng bộ nhớ vật lý (64Kb). Để có được hiệu suất tối ưu đảm bảo yêu cầu phân bổ vật lý tiếp giáp - đó là một cái gì đó mà chỉ trình điều khiển có thể yêu cầu. Điều này về cơ bản là một giải pháp cho một lỗi trong bộ điều khiển DMA của một chipset phổ biến hồi đó, và dường như vẫn không phải là một vấn đề.

NHƯNG - Tôi vẫn khuyên bạn nên kiểm tra TẤT CẢ sức mạnh của 2 kích thước khối từ 32kb đến 32Mb để xem nhanh hơn. Và bạn có thể xem xét thử nghiệm để xem liệu một số bộ đệm có liên tục nhanh hơn các bộ đệm khác không - nó không phải là chưa từng nghe thấy.

+0

+1. Đối với I/O không đồng bộ. – wj32

+0

Tôi chưa thử IO không đồng bộ. Tôi phải thử nó. BTW, sau một số kiểm tra đọc/ghi tôi đã tìm ra rằng 256 KB đọc và 8MB viết đã cho năng suất tối đa. Tôi đã viết một chương trình đọc để kiểm tra tốc độ đọc và sử dụng ATTO và một chương trình viết tùy chỉnh khác để kiểm tra thông lượng ghi. – ring0

2

Một thời gian ngắn, tôi đã viết một bài đăng trên blog về tệp không đồng bộ I/O và cách nó thường có xu hướng thực sự đồng bộ trừ khi bạn làm mọi thứ vừa phải (http://www.lenholgate.com/blog/2008/02/when-are-asynchronous-file-writes-not-asynchronous.html).

Các điểm chính là ngay cả khi bạn đang sử dụng FILE_FLAG_OVERLAPPEDFILE_FLAG_NO_BUFFERING bạn vẫn cần phải mở rộng tệp để các bản ghi không đồng bộ của bạn không cần mở rộng tệp khi chúng đi; vì lý do bảo mật, phần mở rộng tệp luôn đồng bộ. Để mở rộng trước, bạn cần phải làm như sau:

  • Bật đặc quyền SE_MANAGE_VOLUME_NAME.
  • Mở tệp.
  • Tìm kiếm chiều dài tệp mong muốn với SetFilePointerEx().
  • Đặt cuối tệp bằng SetEndOfFile().
  • Đặt cuối dữ liệu hợp lệ trong tệp SetFileValidData().
  • Đóng tệp.

Sau đó ...

  • Mở tập tin để viết.
  • Phát hành bài viết
+0

Thực ra tôi đang mở rộng tập tin. Như tôi đang sử dụng NO_BUFFERING, tôi đang chăm sóc các vấn đề liên kết dữ liệu. Ví dụ: Để sao chép tệp 1027 KB. 1) Tôi tạo một tệp đích với 1024 KB. Sử dụng SetFilePointerEx và SetEndOfFile. 1024 KB do cân nhắc căn chỉnh. 2) Bắt đầu sao chép. 3) Sau khi sao chép 1024 KB, tôi đóng bộ xử lý mục tiêu, mở lại nó mà không sử dụng cờ NO_BUFFERING, tìm cách bù đắp thích hợp bằng SetFilePointerEx và sau đó phát hành WriteFile sẽ tự động phát triển tệp thành 1027KB. Tôi chưa đọc blog của bạn. Tôi sẽ làm điều đó và lấy lại cho bạn. – ring0

0

Tôi đã làm một số thử nghiệm và có một số kết quả. Các thử nghiệm được thực hiện trên 100Mbps & 1Gbps NIC. Máy nguồn là máy chủ Win2K3 (SATA) và máy đích là máy chủ Win2k3 (RAID 5).

tôi chạy 3 kiểm tra:

1) Mạng đọc -> Chương trình này chỉ đọc các file trên mạng. Mục đích của chương trình là tìm tốc độ đọc n/w tối đa. Tôi đang thực hiện một NON BUFFERED lần đọc bằng cách sử dụng CreateFile & ReadFile.

2) Trình ghi đĩa -> Chương trình này đánh giá tốc độ RAID 5 bằng cách ghi dữ liệu. NON BUFFERED viết được thực hiện bằng cách sử dụng CreateFile & WriteFile.

3) Blitz Copy -> Chương trình này là công cụ sao chép tệp. Nó sao chép các tập tin trên mạng. Logic của chương trình này đã được thảo luận trong câu hỏi ban đầu. Tôi đang sử dụng I/O đồng bộ với NO_BUFFERING Reads & Viết. Các API được sử dụng là CreateFile, ReadFile & WriteFile.


Dưới đây là kết quả:

NETWORK READER: -

100 Mbps NIC

Đã 148.344 ms đọc 768 MB với kích thước đoạn 8 KB.

Took 89.359 ms đọc 768 MB với kích thước đoạn 64 KB

Took 82.625 ms đọc 768 MB với kích thước đoạn 128 KB

Took 79.594 ms đọc 768 MB với chunk size 256 KB

Mất 78687 ms để đọc 768 MB với kích thước chunk 512 KB

Took 79.078 ms đọc 768 MB với kích thước đoạn 1024 KB

Took 78.594 ms đọc 768 MB với kích thước đoạn 2048 KB

Took 78.406 ms đọc 768 MB với kích thước đoạn 4096 KB

Took 78.281 ms đọc 768 MB với kích thước đoạn 8192 KB

1 Gbps NIC

Đã 206.203 ms để đọc 5120 MB (5GB) với kích thước đoạn 8 KB

Took 77.860 ms để đọc 5120 MB với kích thước đoạn 64 KB

Đã đọc 74531 mili giây để đọc 5120 MB với kích thước chunk 128 KB

Took 68656 ms để đọc 5120 MB với kích thước chunk 256 KB

Took 64.922 ms để đọc 5120 MB với kích thước đoạn 512 KB

Took 66.312 ms để đọc 5120 MB với kích thước đoạn 1024 KB

Took 68.688 ms để đọc 5120 MB với chunk size 2048 KB

Mất 64922 ms để đọc 5120 MB với kích thước chunk 4096 KB

Took 66.047 ms để đọc 5120 MB với kích thước đoạn 8192 KB

DISK WRITER: -

Viết thực hiện trên RAID 5 Với NO_BUFFERING & WRITE_THROUGH

Viết 2048MB (2GB) dữ liệu với kích thước chunk 4MB mất 68328ms.

Viết 2048MB dữ liệu với kích thước chunk 8MB mất 55985ms.

Viết 2048MB dữ liệu với kích thước chunk 16MB mất 49569ms.

Viết 2048MB dữ liệu với kích thước chunk 32MB mất 47281ms.

Viết thực hiện trên RAID 5 Với NO_BUFFERING chỉ

Viết 2048MB (2GB) dữ liệu với kích thước đoạn 4MB mất 57484ms.

Viết 2048MB dữ liệu với kích thước chunk 8MB mất 52594ms.

Viết 2048MB dữ liệu với kích thước chunk 16MB mất 49125ms.

Viết 2048MB dữ liệu với kích thước chunk 32MB mất 46360ms.

Viết hiệu suất làm giảm tuyến tính khi kích thước đoạn văn bản giảm. Và WRITE_THROUGH cờ giới thiệu một số hiệu suất trúng

BLITZ COPY: -

1 Gbps NIC, Sao chép 60 GB bộ file với NO_BUFFERING

gian thực hiện để hoàn thành bản sao: 2.236.735 ms. Tức là, 37,2 phút. Tốc độ là ~ 97 GB/mỗi.

100 Mbps NIC, Sao chép 60 GB bộ file với NO_BUFFERING

gian thực hiện để hoàn thành bản sao: 7.337.219 ms. Tức là, 122 phút. Tốc độ là ~ 30 GB/mỗi.

Tôi đã thử sử dụng chương trình 10 FileCopy của Jeffrey Ritcher sử dụng Async-IO với NO_BUFFERING. Nhưng, kết quả rất kém. Tôi đoán lý do có thể là kích thước chunk là 256 KB ... 256 KB ghi trên RAID 5 là khủng khiếp chậm.

So sánh với robocopy:

100 Mbps NIC: Blitz Sao chép và robocopy thực hiện @ ~ 30 GB mỗi giờ.

1 GBps NIC: Blitz Sao chép chuyển @ ~ 97 GB mỗi giờ trong khi robocopy @ ~ 50 GB mỗi giờ.

Các vấn đề liên quan