Sao chép tệp song song


9

Tôi có một danh sách các tệp tôi cần sao chép trên hệ thống Linux - mỗi tệp có kích thước từ 10 đến 100 GB.

Tôi chỉ muốn sao chép vào hệ thống tập tin cục bộ. Có cách nào để thực hiện việc này song song - với nhiều quy trình, mỗi quy trình chịu trách nhiệm sao chép một tệp - một cách đơn giản ?

Tôi có thể dễ dàng viết một chương trình đa luồng để làm điều này, nhưng tôi muốn tìm hiểu xem có phương pháp Linux cấp thấp nào để làm việc này không.


1
Sao chép tập tin song song sẽ không tăng tốc đáng kể. (Ít nhất là về lý thuyết thì không nên.)
Tarnay Kálmán


1
@ TarnayKálmán trừ khi bạn có một hệ thống tệp kiểu cụm, lớp phủ, RAID hoặc "không sợ" hoặc bất kỳ điều nào ở trên trong một mạng có độ trễ tương đối cao hoặc bận rộn; hoặc một khối lượng công việc trong đó độ trễ trên mỗi tệp là một phần đáng kể của thời gian sao chép cho tệp đó (1e5 + các tệp rất nhỏ, phụ trợ có nội dung, v.v.). Xử lý đồng thời sẽ cực kỳ hữu ích trong các tình huống như vậy.
rvalue

Câu trả lời:


11

Nếu hệ thống của bạn không bị tấn công bởi nó (ví dụ: có thể các tệp trong bộ đệm) thì GNU Parallel http://www.gnu.org/software/abul/ có thể phù hợp với bạn:

find . -print0 | parallel -0 -j10 cp {} destdir

Điều này sẽ chạy 10 đồng thời cp.

Pro: Nó đơn giản để đọc.

Con: GNU Parallel không phải là tiêu chuẩn trên hầu hết các hệ thống - vì vậy bạn có thể phải cài đặt nó.

Xem video giới thiệu để biết thêm thông tin: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Xem thêm https://oletange.wordpress.com/2015/07/04/pool-disk-io-is-it-faster/ để thảo luận về I / O đĩa song song.


3

Không có cơ chế cấp thấp nào cho việc này vì một lý do rất đơn giản: làm điều này sẽ phá hủy hiệu năng hệ thống của bạn. Với các ổ đĩa, mỗi lần ghi sẽ tranh giành vị trí của đầu, dẫn đến sự chờ đợi I / O lớn. Với SSD, điều này sẽ làm bão hòa một hoặc nhiều xe buýt hệ thống của bạn, gây ra các vấn đề khác.


Err dường như không phải là trường hợp của một cp hiện tại, tôi chắc chắn có một phương tiện hạnh phúc cho nhiều "cp" song song mà tại đó kênh I / O của bạn không trở nên bão hòa hoàn toàn ...
Jon

1
Một chiếc xe buýt bão hòa là một chiếc xe buýt hạnh phúc. Băng thông nhàn rỗi là lãng phí băng thông.
rvalue

3

Như đã đề cập, đây là một ý tưởng khủng khiếp. Nhưng tôi tin rằng mọi người sẽ có thể thực hiện các kế hoạch khủng khiếp của riêng mình, vì vậy ...

for FILE in *;do cp $FILE <destination> &;done

Dấu hoa thị có thể được thay thế bằng một biểu thức thông thường của các tệp của bạn hoặc $(cat <listfile>)nếu bạn đã có tất cả chúng trong một tài liệu văn bản. Dấu và khởi động một lệnh trong nền, vì vậy vòng lặp sẽ tiếp tục, sinh ra nhiều bản sao hơn.

Như đã đề cập, điều này sẽ hủy hoàn toàn IO của bạn. Vì vậy, ... tôi thực sự không khuyên bạn nên làm điều đó.

--Christopher Karel


3

Câu trả lời duy nhất sẽ không làm mất khả năng phản hồi của máy bạn không chính xác là "bản sao", nhưng nó rất nhanh. Nếu bạn sẽ không chỉnh sửa các tệp ở vị trí mới hoặc cũ, thì một liên kết cứng thực sự giống như một bản sao và (chỉ) nếu bạn ở trên cùng một hệ thống tệp, chúng được tạo rất rất nhanh.

Kiểm tra cp -lvà xem nếu nó sẽ làm việc cho bạn.


2

Đây là một công cụ sao chép tệp phân tán / song song và phi tập trung sẽ phân chia tệp và sao chép tất cả các khối song song. Nó có thể sẽ chỉ giúp bạn nếu bạn có ổ SSD hỗ trợ nhiều luồng hoặc một số loại thiết lập với nhiều đầu đĩa.

https://github.com/hpc/dcp


1

Đối với những người nghĩ rằng đó không phải là một ý tưởng tuyệt vời, tôi sẽ nói nó phụ thuộc. Bạn có thể có một hệ thống đột kích lớn hoặc một hệ thống tệp song song sẽ mang lại hiệu suất thực sự tốt hơn so với quy trình một cp có thể xử lý. Sau đó, có, bạn cần sử dụng một "công cụ song song".

Hãy lấy ví dụ này:

timeout 10 strace -e write -c cp /dev/zero /dev/null
strace: Process 24187 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188           4    166222           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188                166222           total

thì đây

timeout 0.01 strace -e write  cp /dev/zero /dev/null
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
strace: Process 24567 detached

do đó, mỗi lần viết của tòa nhà được tạo bởi "cp" trong trường hợp này là 64KiB và trong 10 giây trên hệ thống của tôi, tôi có thể cung cấp băng thông này: 65536 * 166222/10 = 1089352499 = ~ 1.08GB / s

Bây giờ, hãy khởi chạy khối lượng công việc này với 2 quy trình (Tôi có 4 lõi nhưng máy tính để bàn của tôi được sử dụng cho các công cụ khác và đây chỉ là một ví dụ):

timeout 10 strace -e write -c cp /dev/zero /dev/null & timeout 10 strace -e write -c cp /dev/zero /dev/null &  wait
[1] 26106
[2] 26107
strace: Process 26113 detached
strace: Process 26112 detached
% time     seconds  usecs/call     calls    errors syscall
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108           4    162616           write
100.00    0.638468           4    162451           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108                162616           total
100.00    0.638468                162451           total
------ ----------- ----------- --------- --------- ----------------
[1]-  Exit 124                timeout 10 strace -e write -c cp /dev/zero /dev/null

Vì vậy, chúng tôi thấy chúng tôi có thể tăng gần gấp đôi hiệu suất bằng cách sử dụng 2 lõi để khởi chạy.

Vì vậy, nếu chúng ta ở trong một bối cảnh khác với ổ 1xHard sang ổ 1xHard nhưng là một mảng đột kích (hoặc nhiều NVMe thì không phải là trường hợp phổ biến nhất mà tôi đồng ý nhưng tôi làm việc này mỗi ngày), nó chắc chắn cho thấy hiệu suất tốt hơn để sử dụng nhiều phổ biến trong song song, tương đông.


-1

Bạn nên thử điều này:

    $ seq 3 | song song cp -v / etc / passwd passwd {}

Điều này sẽ sao chép tệp passwd 3 lần từ thư mục / etc / vào thư mục $ HOME của bạn

Hoặc nếu tập tin của bạn nằm trong thư mục nhà của bạn

    $ seq 3 | song song cp -v passwd {, {}}

Điều này sẽ sao chép tệp passwd 3 lần vào $ HOME của bạ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.