Sao chép tập tin đa luồng


8

Có một tiện ích chúng tôi có được sử dụng để tải tệp lên (và thực hiện các thao tác khác trên tệp) lên vị trí chia sẻ mạng.
Kích thước tệp có xu hướng thay đổi từ vài mb đến 500 mb.
Một gợi ý đã đưa ra rằng chúng ta có thể nên hỗ trợ đa luồng khi tải các tệp lên vị trí được chia sẻ - không bắt buộc phải thực hiện theo từng byte - mỗi luồng nên chọn một tệp và cố gắng tải lên.

Tôi không chắc chắn nếu đa luồng có thể tăng tốc các hoạt động IO như thế này. Linh cảm của tôi có hợp lệ không?

Nếu thực sự chúng tôi được yêu cầu xây dựng chức năng này, tôi đã tự hỏi điều gì sẽ là một phương pháp thiết kế tốt cho công cụ sao chép tập tin?
Sẽ có ý nghĩa khi sử dụng một công cụ như robocopy (tôi đọc các phiên bản mới hơn hỗ trợ đa luồng)?

Chỉnh sửa: Xin lỗi vì sự chậm trễ và thiếu một số thông tin quan trọng.
Tiện ích này được xây dựng bằng C # (.Net 2.0) và mọi cập nhật trong tương lai cũng phải sử dụng .Net (phiên bản khung không phải là một ràng buộc). Tiện ích được cài đặt trên máy của người dùng (khoảng 20 tất cả trên WinXP). Chia sẻ mục tiêu là trên máy chủ Win2k3.

Chỉnh sửa 2: đã quyết định chạy một số thử nghiệm với một ứng dụng đơn giản thực hiện tải lên tệp thông qua TPL. Đăng phân tích này, chúng tôi sẽ quyết định có đi trước hay không. Cảm ơn mọi người vì sự giúp đỡ mở rộng.


1
Ngôn ngữ lập trình gì? Trong C, một cách tiếp cận thành ngữ hơn có thể là sử dụng I / O không đồng bộ, sử dụng selectvòng lặp thay vì các luồng. Mặc dù làm như vậy đòi hỏi bạn phải "bật mã ra" (mã để sao chép tệp không phải là một chuỗi lệnh đơn giản nữa), bạn sẽ không phải lo lắng về đồng bộ hóa luồng.
Joey Adams

Có lẽ giải pháp hợp lý dễ dàng nhất là để HĐH xử lý tất cả : SHFileOperation(FO_COPY). Điều đó giúp bạn có tất cả các tối ưu hóa mà mọi người ở Microsoft cho là hợp lý.
MSalters

Ho robocopy ho ... bạn có thể tự động hóa nó với một cái gì đó giống như robomojo
James Snell

Câu trả lời:


19

Điều này phụ thuộc vào yếu tố giới hạn là gì, phải không? Nếu nút cổ chai là chương trình tiện ích, thì chắc chắn, chạy nhiều hơn một bản sao hoặc sử dụng nhiều luồng sẽ tăng tốc mọi thứ. Nếu mạng là yếu tố giới hạn, thì việc thêm nhiều phiên bản của tiện ích sẽ không có ích vì bạn vẫn sẽ bị kẹt khi di chuyển tối đa X byte mỗi giây. Trong thực tế, nó có thể bị tổn thương vì bạn có thêm chi phí của bản sao thứ hai của ứng dụng. Tương tự với đĩa-IO. Bạn chỉ có thể sao chép nhanh như một trong hai máy có thể đọc và ghi vào đĩa. Nếu đó là tối đa, việc thêm các bản sao sẽ không có ích.

Những gì bạn cần làm là kiểm tra xem nút thắt cổ chai là gì và đi từ đó.


11

Làm thế nào đa luồng sẽ không giúp đỡ:

Nhiều luồng đọc đồng thời từ đĩa của máy khách hoặc đồng thời gửi nội dung qua mạng sẽ không giúp ích gì cả, vì rất có thể chỉ tồn tại một đường truyền giữa máy khách và máy chủ, rất có thể máy khách đang đọc các tệp từ một lần khó -drive và các tệp rất có thể được ghi trên một ổ cứng trên máy chủ. (Ngay cả khi máy chủ có RAID, nó sẽ tạo ra một số khác biệt, nhưng không nhiều.) Ngược lại, như đã được chỉ ra, hiệu suất có thể sẽ giảm, bởi vì sẽ có sự tìm kiếm liên tục giữa các tệp đang được đọc trong song song trên máy khách và tìm kiếm liên tục giữa các tệp đang được ghi song song trên máy chủ. Ngoài ra, các tập tin có thể cuối cùng được lưu trữ bị phân mảnh xấu trên máy chủ.

Làm thế nào đa luồng sẽ giúp:

Tuy nhiên, đa luồng có thể giúp theo một cách khác: chỉ với hai luồng trên máy khách, tệp I / O có thể được đồng bộ hóa từ I / O mạng. Điều này có nghĩa là máy khách có thể đồng thời truyền một đoạn của tệp trong khi đọc đoạn tiếp theo từ đĩa của nó. (Máy chủ đã có khả năng ghi đồng thời một đoạn tệp trên đĩa trong khi nhận đoạn tiếp theo từ mạng.) Điều này sẽ rất nhiềutăng tốc quá trình truyền, bởi vì máy khách sẽ có xu hướng giữ cho kênh mạng hoặc kênh đĩa (bất kỳ tốc độ nào chậm hơn), thay vì truy cập từng kênh một, không liên tục. Tôi đoán rằng mọi tiện ích sao chép tệp chuyên dụng ngoài đó phải đủ thông minh để làm điều đó, nhưng tôi có thể sai, vì vậy nếu "Robocopy" quảng cáo rằng họ thực hiện sao chép đa luồng, thì tốt thôi, hãy làm điều đó.

EDIT: Tôi đã sửa lại bit tôi đã viết về RAID.

EDIT: Tôi đã sửa lỗi về việc yêu cầu hai luồng trên máy chủ.

Tôi đoán điều quan trọng nhất ở đây, (vì nó gần như ở khắp mọi nơi,) là đo lường . Bạn không có quyền kiểm soát nào về cách thức các tiện ích này hoạt động, vì vậy bạn sẽ chỉ biết liệu bạn có đang làm điều đó một cách nhanh nhất có thể hay không nếu bạn đo thông lượng để xem liệu nó có ở gần thông lượng được quảng cáo của đĩa hoặc mạng của bạn hay không .)


Đây có vẻ là một ý tưởng tuyệt vời, nhưng tôi không hiểu làm thế nào tiện ích truyền tệp thực sự có thể làm điều này trừ khi nó có đặc quyền thực thi từ xa (hoặc giao thức chuyển giao vốn đã hỗ trợ điều này). Tôi đang cố gắng viết một tiện ích để thực hiện chuyển thường xuyên một số lượng khổng lồ các tệp từ NAS và tôi thực sự cần tìm cách cắt giảm thời gian.
Asad Saeeduddin

Câu hỏi của bạn rất nhạy cảm, và nó chỉ ra sự không chính xác trong câu trả lời của tôi. Máy chủ nên đã đồng bộ hóa I / O mạng từ truy cập đĩa, nhờ vào cách thức các máy chủ thường hoạt động: chúng có xu hướng thực hiện I / O không đồng bộ thay vì tạo ra một luồng riêng biệt cho mỗi máy khách, mỗi lần chỉ có thể thực hiện một luồng. Vì vậy, bạn không cần phải lo lắng về máy chủ, chỉ về máy khách. Tôi sẽ điều chỉnh lại câu trả lời của tôi.
Mike Nakis

@Asad Ngoài ra, xin lưu ý rằng "máy chủ" trong trường hợp này tôi có nghĩa là bất kỳ máy nào ở cuối nhận chuyển khoản. Nó không cần phải là một máy có vai trò máy chủ được chỉ định.
Mike Nakis

9

Trong khi sao chép nhiều tệp nhỏ hơn, đa luồng có thể giúp ích vì có xu hướng có lỗ hổng trong việc truyền dữ liệu trong khi chương trình đang tìm kiếm thư mục cho tệp tiếp theo, mở tệp và nhận dữ liệu.

Đa luồng cũng sẽ giúp ích khi cả máy khách và máy chủ đều có lưu trữ dữ liệu song song như RAID hoặc SSD: mọi thứ hoạt động tốt hơn với số độ sâu hàng đợi cao hơn.

Ngoài ra, nó sẽ thường làm mọi thứ chậm lại. Ví dụ, làm cho một ổ cứng duy nhất đọc hoặc ghi hai tệp cùng một lúc sẽ buộc nó phải liên tục tìm kiếm từ tệp 1 đến tệp 2.


2

Tôi làm việc cho Data Expedition, Inc. , như Emmad đã đề cập, sản xuất phần mềm thương mại cho loại kịch bản này. Truyền tệp đa luồng có thể có lợi ích, nhưng bạn phải hiểu kỹ các tắc nghẽn hiệu suất của bạn là gì.

Bất kỳ đường dẫn mạng nào cũng sẽ có ít nhất hàng chục thành phần phần cứng và phần mềm mà dữ liệu phải đi qua. Tốc độ chậm nhất trong số chúng sẽ quyết định tốc độ của bạn. Nhưng cách bạn di chuyển dữ liệu sẽ thay đổi cách các thành phần đó hoạt động.

Rất nhiều nền tảng về điều đó ở đây: http://www.DataExpedition.com/support/notes/tn0009.html

Chạy các TCP song song có thể giúp ích khi tốc độ TCP riêng lẻ giảm xuống dưới mức dung lượng của mạng, đĩa và CPU.

Nhưng nếu bạn đang xem tốc độ mạng hơn hàng chục megabit mỗi giây, thì việc truyền dữ liệu song song sẽ giảm theo cấp số nhân ổ đĩa của bạn do làm hỏng ổ cứng. Nó có thể nhanh chóng rơi xuống điểm truy cập đĩa trở nên chậm hơn nhiều so với dung lượng mạng. Chọn kích thước khối đọc / ghi phù hợp có thể giúp ích, nhưng điều đó sẽ phụ thuộc vào phần cứng cụ thể. Ngoài ra, hãy nhớ rằng Windows XP / 2003 có bộ nhớ phân trang rất hạn chế, điều này có thể khiến nó không ổn định nếu tốc độ vượt quá khoảng 200 megabit / giây.

Mặt khác, nếu mạng chậm hơn vài chục megabit mỗi giây, thì việc chạy nhiều TCP song song có thể đẩy độ trễ lên đến điểm mà các phiên riêng lẻ bắt đầu chậm lại hoặc thậm chí giảm kết nối. Một lần nữa, đây là vấn đề thử nghiệm để tìm ra mức độ song song nào sẽ hoạt động cho bất kỳ con đường và điều kiện nhất định nào.

Vì vậy, sao chép tệp đa luồng có thể giúp ích nếu bạn có đường dẫn dữ liệu đã biết và có thể dành thời gian để tinh chỉnh số phiên song song và I / O đĩa của bạn. Nhưng nó đòi hỏi bạn phải nghỉ hưu bất cứ khi nào điều kiện thay đổi, và có thể gây rối nếu bạn làm quá sức. Đó là lý do tại sao chúng tôi đã chọn tránh chuyển tiền song song trong phần mềm của chính mình, giống như chúng tôi tránh TCP.


1

Ngoài những gì đã nói, hãy xem xét: - Phải có một nhiệm vụ trên máy khách để tạo các khối và một khối khác trên máy chủ để đặt chúng trở lại với nhau dưới dạng 1 tệp. Điều này đòi hỏi một số công việc.

  • Một điều tốt về các khối nhỏ là bạn có thể gửi lại các phần của tệp nếu quá trình không thành công thay vì gửi toàn bộ tệp lớn.

  • Xem xét yêu cầu "đường ống lớn hơn" giữa máy khách của bạn và máy chủ.

  • Xem xét việc nén tệp lớn trước khi gửi tệp (Tôi không chắc liệu điều này có giúp ích trong trường hợp tệp đa phương tiện không vì chúng đôi khi đã được nén).

  • Cân nhắc sử dụng tiện ích chuyển tập tin thương mại, chẳng hạn như:

DataExp


0

Nếu bạn đang nói về một tập tin lớn, đa luồng sẽ không thực sự hữu ích. Bạn sẽ bị ràng buộc I / O, vì vậy sử dụng một chuỗi sẽ không làm chậm quá trình tải lên.

Tuy nhiên, điều bạn làm có thể lo lắng là sự tranh chấp tài nguyên (giả sử bạn cũng đang viết máy chủ). Nếu bạn đang xử lý tải lên trong chuỗi cũng chấp nhận và xử lý các yêu cầu mới, các yêu cầu khác sẽ chờ. Miễn là bạn trì hoãn trở lại hàng chọn sau khi đọc một đoạn từ ổ cắm và ghi nó vào đĩa, tuy nhiên, bạn sẽ ổn thôi.


0

Làm những gì bạn đề xuất một cách ngây thơ sẽ giết chết thông lượng của bạn, điểm nghẹt thở là I / O đĩa và không sẵn sàng cho các tệp.

Tôi sẽ đề nghị sử dụng một luồng nhận tệp để làm việc và xếp hàng chúng cho bản sao và sau đó giữ một bản sao liên tiếp diễn ra trên bất kỳ thứ gì trong hàng đợi; chủ đề nhà cung cấp của bạn chịu trách nhiệm nhận các tệp được đọc để xếp hàng. Theo cách này, bạn sẽ không làm hỏng hệ thống tệp trên (các) ổ đĩa chung và bạn không thực hiện từng tệp một lần với các khoảng trống để chuẩn bị tiếp theo, bạn đang chuẩn bị và gửi đồng thời.

Phần thưởng là chỉ có một điểm đồng bộ hóa trong hàng đợi để lo lắng.


0

Thay vì tự thực hiện tải lên song song, bạn có thể xem xét các giao thức và công cụ hiện có. Ví dụ: giao thức ftp và công cụ lftp (lftp có thể chuyển một số tệp song song).

Vì vậy, có thể dễ dàng và mạnh mẽ hơn nhiều khi sử dụng các tập lệnh lftp hoặc kiểm soát lftp từ ứng dụng của bạn thay vì thực hiện mọi thứ từ đầu.


0

Tất cả phụ thuộc vào yếu tố giới hạn ở đâu.

Đa luồng có thể giúp đỡ nếu có sự chậm trễ chuyến đi khứ hồi hoặc các khoảng trống khác trong quá trình truyền và các luồng giúp điền vào các khoảng trống.

Đa luồng có thể bị tổn thương nếu nó có tác dụng làm cho đĩa của bạn chạy rầm rầm, cố gắng giữ tất cả các luồng được cung cấp với dữ liệu.

Vân vân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.