Có sự thay thế nhanh hơn cho cp để sao chép các tệp lớn (~ 20 GB) không?


40

Tôi là một sinh viên tốt nghiệp và nhóm mà tôi làm việc duy trì một cụm Linux. Mỗi nút của cụm có đĩa cục bộ riêng, nhưng các đĩa cục bộ này tương đối nhỏ và không được trang bị sao lưu tự động. Vì vậy, nhóm sở hữu một máy chủ tệp có nhiều TB không gian lưu trữ. Tôi là người mới làm quen với Linux, vì vậy tôi không chắc thông số kỹ thuật của máy chủ về tốc độ, khả năng kết nối mạng, v.v. Tôi biết từ kinh nghiệm rằng các đĩa cục bộ nhanh hơn đáng kể so với máy chủ tệp về I / O . Khoảng một tá người sử dụng máy chủ.

Việc sử dụng cpđể sao chép tệp ~ 20 GB từ máy chủ tệp vào một trong các đĩa cục bộ mất trung bình khoảng 11,5 phút trong thời gian thực (theo time). Tôi biết rằng cpthao tác này không hiệu quả lắm vì (1) timecho tôi biết rằng thời gian hệ thống cho một bản sao như vậy chỉ ~ 45 giây; và bởi vì (2) khi tôi kiểm tra toptrong quá trình sao chép, % CPU khá thấp (bằng cách kiểm tra, trung bình khoảng 0-10% ).

Sử dụng cpđể sao chép cùng một tệp ~ 20 GB từ một thư mục trên đĩa cục bộ sang một thư mục khác trên cùng một đĩa cục bộ mất ít thời gian hơn - khoảng 9 phút trong thời gian thực (~ 51 giây trong thời gian hệ thống, theo time). Vì vậy, rõ ràng máy chủ tệp có phần chậm hơn so với đĩa cục bộ, như mong đợi, nhưng có lẽ không chậm hơn đáng kể. Tôi ngạc nhiên khi sao chép từ địa phương sang cùng địa phương không nhanh hơn 9 phút.

Tôi cần sao chép ~ 200 tệp lớn - mỗi tệp ~ 20 GB - từ máy chủ tệp sang một trong các đĩa cục bộ. Vì vậy, câu hỏi của tôi là: Có cách nào nhanh hơn để cpsao chép các tệp lớn trong Linux không? (Hoặc có bất kỳ cờ nào trong cpđó tôi có thể sử dụng để tăng tốc độ sao chép không?) Ngay cả khi tôi bằng cách nào đó có thể cạo một phút khỏi thời gian sao chép này, điều đó sẽ giúp ích rất nhiều.

Tôi chắc chắn rằng mua đĩa cứng mới, nhanh hơn, nhưng tôi không có quyền truy cập vào các tài nguyên đó. Tôi cũng không phải là quản trị viên hệ thống - Tôi chỉ là người dùng (người mới) - vì vậy tôi không có quyền truy cập vào thông tin chi tiết hơn về tải trên đĩa. Tôi biết rằng trong khi khoảng một chục người sử dụng máy chủ tệp hàng ngày, tôi là người duy nhất sử dụng nút / đĩa cục bộ cụ thể này.


29
Điều đó làm cho khoảng 29MB / s, khá nhanh nếu bạn hỏi tôi. Tôi không nghĩ rằng có bất kỳ lệnh nào sẽ tăng tốc độ này, "nút cổ chai" rất có thể là a) mạng hoặc b) máy chủ tệp.
tink

5
tink là chính xác 100%. Tôi chưa bao giờ thấy bất cứ điều gì có thể cải thiện điều này. Điều duy nhất tôi đã làm trong quá khứ là nén dữ liệu trước khi gửi, nhưng điều đó có nghĩa là bạn đang thêm thời gian với bước nén và các bước giải nén, nhưng đôi khi điều đó đáng giá nếu dữ liệu là một ứng cử viên tốt nén!
slm

3
Bạn cũng có thể thử ddrsyncso sánh cái nào hoạt động nhanh hơn trong môi trường của bạn
Raza

@Salton Cảm ơn. Tôi chưa thử dd, nhưng tôi chỉ thử rsync. Thời gian thực là khoảng 11,5 phút và thời gian hệ thống là khoảng 1,5 phút, theo time.
Andrew

2
Tôi ngạc nhiên không ai chỉ ra rằng đĩa cục bộ vào bản sao đĩa cục bộ có thể được thực hiện hiệu quả hơn bằng cách gắn nhiều đĩa. Sao chép từ /dev/sda1sang /dev/sdb1sẽ nhanh hơn sao chép từ một vị trí trên /dev/sda1sang một vị trí khác trên /dev/sda1hoặc một phân vùng khác /dev/sdavì ổ cứng sẽ không phải tìm kiếm thêm giữa đọc và ghi (giả sử ổ cứng truyền thống có đĩa quay và đầu di chuyển; SSD rõ ràng là khác nhau).
tripleee

Câu trả lời:


53

% CPU phải thấp trong khi sao chép. CPU nói với bộ điều khiển đĩa "lấy dữ liệu từ các ngành X, Y vào bộ nhớ đệm tại Z". Sau đó, nó đi và làm một cái gì đó khác (hoặc ngủ, nếu không có gì khác). Phần cứng kích hoạt ngắt khi dữ liệu nằm trong bộ nhớ. Sau đó, CPU phải sao chép nó một vài lần và nói với card mạng "truyền gói tin tại các vị trí bộ nhớ A, B và C". Sau đó, nó quay trở lại để làm một cái gì đó khác.

Bạn đang đẩy ~ 240mbps. Trên mạng LAN gigabit, bạn phải có thể thực hiện ít nhất 800mbps, nhưng:

  1. Điều đó được chia sẻ giữa mọi người bằng cách sử dụng máy chủ tệp (và có thể là kết nối giữa các thiết bị chuyển mạch, v.v.)
  2. Điều đó bị giới hạn bởi tốc độ mà máy chủ tệp có thể xử lý ghi, lưu ý rằng băng thông I / O đĩa của nó được chia sẻ bởi mọi người sử dụng nó.
  3. Bạn đã không chỉ định cách bạn truy cập máy chủ tệp (NFS, CIFS (Samba), AFS, v.v.). Bạn có thể cần phải điều chỉnh gắn kết mạng của mình, nhưng trên bất kỳ thứ gì gần đây, các mặc định thường khá lành mạnh.

Để theo dõi nút cổ chai, iostat -kx 10đây sẽ là một lệnh hữu ích. Nó sẽ cho bạn thấy việc sử dụng trên các đĩa cứng cục bộ của bạn. Nếu bạn có thể chạy nó trên máy chủ tệp, nó sẽ cho bạn biết máy chủ tệp bận đến mức nào.

Giải pháp chung sẽ là tăng tốc độ tắc nghẽn đó, tất nhiên bạn không có ngân sách cho. Nhưng, có một vài trường hợp đặc biệt mà bạn có thể tìm thấy cách tiếp cận nhanh hơn:

  • Nếu các tệp có thể nén được và bạn có CPU nhanh, thực hiện nén tối thiểu khi đang di chuyển có thể nhanh hơn. Một cái gì đó thích lzophoặc có thể gzip --fastest.
  • Nếu bạn chỉ thay đổi một vài bit ở đây và sau đó gửi tệp trở lại, chỉ gửi deltas sẽ nhanh hơn nhiều. Thật không may, rsyncsẽ không thực sự giúp đỡ ở đây, vì nó sẽ cần phải đọc tệp ở cả hai bên để tìm delta. Thay vào đó, bạn cần một cái gì đó theo dõi đồng bằng khi bạn thay đổi tệp ... Hầu hết các cách tiếp cận ở đây là dành riêng cho ứng dụng. Nhưng có khả năng là bạn có thể xử lý một cái gì đó với, ví dụ, trình ánh xạ thiết bị (xem mục tiêu thời đại dm hoàn toàn mới ) hoặc btrfs.
  • Nếu bạn đang sao chép cùng một dữ liệu vào nhiều máy, bạn có thể sử dụng một cái gì đó như udpcast để gửi nó đến tất cả các máy cùng một lúc.

Và, vì bạn lưu ý rằng bạn không phải là sysadmin, tôi đoán điều đó có nghĩa là bạn có một sysadmin. Hoặc ít nhất là ai đó chịu trách nhiệm cho máy chủ và mạng tập tin. Bạn có thể nên hỏi anh ấy / cô ấy / họ, họ nên quen thuộc hơn nhiều với các chi tiết cụ thể của thiết lập của bạn. Sysadmin của bạn ít nhất có thể cho bạn biết tốc độ chuyển mà bạn có thể mong đợi một cách hợp lý.


+1 cho i điều chỉnh -kx 10 :-)
n611x007

16

Đây có thể là một giải pháp thay thế nhanh hơn và bạn sẽ không làm tắc mạng trong hai ngày: Lấy một hoặc hai USB lớn (USB 3 nếu bạn có) hoặc đĩa FireWire, kết nối nó với máy chủ và sao chép các tệp vào Cái đĩa. Mang đĩa đến máy cục bộ của bạn. Sao chép các tập tin vào máy.


23
Sneakernet ( en.wikipedia.org/wiki/Sneakernet ) có thể rất nhanh: Đừng bao giờ đánh giá thấp băng thông của một toa xe ga đầy băng từ trên đường cao tốc.
SplinterReality

10

Định nghĩa của bạn về hiệu quả là ngược. Việc thực hiện hiệu quả hơn sẽ lãng phí ít thời gian cpu hơn . Trên bản sao cục bộ, bạn đạt trung bình khoảng 74 MB / s thông lượng (đọc + ghi), tương đương với một đĩa cứng duy nhất sẽ có được.


1
Úi. Khi tôi nói "hiệu quả", tôi có nghĩa là "nhanh".
Andrew

10

Nếu bạn có quyền truy cập SSH (hoặc SFTP) trực tiếp (hãy hỏi sysadmin của bạn), bạn có thể sử dụng scpvới nén ( -C):

scp -C you@server:/path/to/yourfile .

Tất nhiên, điều đó chỉ hữu ích nếu tệp có thể nén được và điều này sẽ sử dụng nhiều thời gian CPU hơn, vì nó sẽ sử dụng mã hóa (vì nó qua SSH) và nén.


Trong trường hợp này, sẽ rất hữu ích khi vô hiệu hóa mã hóa. Hãy nhớ rằng chúng tôi đang cố gắng để làm cho bản sao nhanh hơn .
lgeorget

3
@lgeorget Tôi nghi ngờ chi phí mã hóa sẽ không đáng kể, xem xét các ổ đĩa cứng chậm như thế nào. Tôi đã xem xét thêm một cái gì đó về -c none, nhưng điều đó dường như là không chuẩn .
Phục hồi Monica

1
Chúng tôi đang xử lý các tệp ~ 20G nên việc sử dụng mã hóa không hiệu quả nếu không cần thiết.
lgeorget

1
@lgeorget Mã hóa có thể được thực hiện nhanh hơn nhiều so với thông lượng mà anh ta nhận được, vì vậy nó sẽ không làm chậm bất cứ điều gì. Nhưng có vẻ như không cần thiết phải thông qua SSH ở đây. Nếu bạn chỉ cần nén chắc chắn có công cụ khác?
Thomas

@Thomas Ưu điểm của SSH là nếu bạn được cho là có quyền truy cập vào máy chủ từ xa thì gần như chắc chắn sẽ chạy SSH. Một tùy chọn khác là nén tệp cục bộ, sao chép nó vào máy chủ, sau đó sshvào và giải nén nó ..
Phục hồi lại

8

Việc cpthực hiện rất có thể không phải là một nút cổ chai. Cố gắng quan sát việc sử dụng IO thông qua iotoptrên cả máy chủ và nút cụm. Điều này sẽ cung cấp cho bạn một ý tưởng nơi bạn có thể cải thiện hiệu suất.

Một mẹo khác, là tránh sao chép cùng một dữ liệu từ cùng một máy chủ. Ví dụ: nếu bạn có tệp 20G giống hệt nhau để phân phối từ máy chủ tệp qua mạng tới tất cả các nút cụm, thì nó sẽ hoạt động nhanh hơn nhiều nếu bạn sao chép tệp theo kiểu ngang hàng thay vì một máy chủ cho tất cả các máy khách. Việc thực hiện phức tạp hơn một chút, nhưng bạn thậm chí có thể thử sử dụng một số dòng lệnh p2p như trung tâm kết nối trực tiếp.

Nếu trong các tệp 20G đó, một số phần là phổ biến và một số là cụ thể của nút cụm, hãy xem xét tách nó thành các phần chung và các phần cụ thể, sau đó phân phối phần chung theo cách p2p.


1
Nếu bạn đang sử dụng mạng LAN, bạn sẽ có thể thực hiện phát đa hướng thay vì ngang hàng. Mà nên nhanh hơn, và tải ít hơn trên mạng.
derobert

8

Bản chất / nội dung của các tệp đó có thể tạo ra một số khác biệt. Tôi hiểu rằng bạn cần sao chép 200 tệp, mỗi tệp ~ 20 GB, từ máy tính này sang máy tính khác, phải không?

Nếu các tệp đó có thể nén hoặc có các phần tương tự / giống hệt nhau, bạn có hai cách tiếp cận:

  • nén chúng trước khi sao chép hoặc tạo một đường hầm giữa các máy tính có bật zip trên nó. Vì vậy, nếu mạng là nút cổ chai, nó sẽ nhanh hơn một chút

  • nếu các tệp rất giống nhau hoặc chia sẻ một số nội dung phổ biến giữa chúng, hãy thử sử dụng rsync . Nó sẽ dành một chút thời gian để tìm ra những gì phổ biến trong các tệp và sẽ không cần phải sao chép nó theo nghĩa đen , bởi vì nó sẽ tái cấu trúc nó dựa trên những gì phổ biến.

biên tập

Bạn sẽ cần phải sao chép những tập tin đó nhiều lần chứ ?? (như bản sao -> sử dụng các tệp đó -> thay đổi nội dung nào đó trong các tệp trong máy tính A -> sao chép lại tệp vào máy tính B)

Nếu vậy, rsync sẽ hữu ích, bởi vì nó sẽ cố gắng phát hiện những gì bằng nhau giữa các phiên bản và không sao chép những gì không thay đổi.

Và một phương pháp thứ ba: nếu điều trên là chính xác (thay đổi trong tệp, sau đó sao chép lại tất cả các tệp vào máy tính thứ hai), bạn có thể thử một số binary diffđể chỉ thay đổi trong máy tính thứ hai đã thay đổi trong máy tính đầu tiên.


6

Tôi thấy như sau đây, mã hóa không phải là một ý tưởng tốt vì nó có thể TĂNG SỐ lượng dữ liệu được chuyển.

Nếu bạn đang sao chép giữa hai hệ thống, thì nút cổ chai dĩ nhiên là kết nối giữa các máy chủ.

Nếu bạn đang sao chép cục bộ, hãy xem quá trình diễn ra như thế nào, đó là SINGLE được xâu chuỗi, do đó các tiện ích Linux tiêu chuẩn sử dụng:

- for all blocks in a file
      read a block
      write a block

KHÔNG có sự tương tranh với hoạt động này.

Để tăng tốc mọi thứ, bạn có thể sử dụng một cái gì đó như thế này:

  buffer -i infile -o outfile -m size-of-shared-memory-default-1MByte

Xem trang man (1) bộ đệm để biết thêm thông tin.

Lệnh bộ đệm thiết lập hai quy trình để chạy quy trình sao chép đồng thời: một để đọc và một để ghi và nó sử dụng bộ đệm chia sẻ để giao tiếp dữ liệu giữa hai quy trình. Bộ nhớ đệm được chia sẻ là bộ đệm tròn cổ điển của bạn, giúp ghi đè lên dữ liệu không được ghi và ghi dữ liệu đã được ghi. Tôi đã sử dụng chương trình này để cắt giảm khoảng 10-20% thời gian sao chép khi chuyển từ đĩa sang băng.


Trên thực tế, có sự đồng thời trong "đọc một khối / viết một khối" bởi vì "viết một khối" thực sự chỉ đặt nó vào bộ đệm của kernel và kernel xử lý việc ghi khối thực sự trong nền (ít nhất là cho đến khi bạn bắt đầu chạy ra của RAM). Hoặc nếu bạn đang sử dụng O_DSYNC / O_SYNC vì một số lý do.
derobert

3

Tại sao không thử thuật toán lan truyền P2P, nếu bạn cần cập nhật toàn bộ cụm của mình cùng một lúc?

https://github.com/lg/murder là những gì twitter sử dụng

BTSync mà bạn có thể thử là tốt.


1

Nếu bạn đang sao chép cùng một bộ tệp thường xuyên từ máy tính cục bộ của mình sang máy chủ với những thay đổi nhỏ ở đây và đó. Bạn có thể tăng tốc độ chuyển bằng cách sử dụng rsync hoặc DVCS (ví dụ: hg hoặc git).

git hoặc hg có thể theo dõi và phát hiện deltas và chỉ chuyển những deltas đó. Trong trường hợp sử dụng git, vì cả hai bên đều có lịch sử đầy đủ của kho lưu trữ, nên việc tìm ra delta rất rẻ.

rsync sử dụng một hình thức thuật toán kiểm tra cuộn để phát hiện đồng bằng mà không có kiến ​​thức trước về những gì ở phía bên kia. Mặc dù phải mất nhiều công sức hơn cho rsync để tính toán đồng bằng, nhưng không cần lưu trữ toàn bộ lịch sử tệp.


1

Bạn có thể muốn thử đóng gói tất cả các tệp vào một kho lưu trữ (không cần phải nén). Theo kinh nghiệm của tôi, sao chép một kho lưu trữ nhanh hơn sao chép một số lượng lớn các tệp riêng lẻ


3
Quan sát chung tốt, nhưng như câu hỏi nói rằng ~ ~ 200 tệp lớn - mỗi tệp ~ 20 GB, tôi không tin rằng đây có thể được coi là một câu trả lời thực sự cho vấn đề này .
thao tác

@manatwork ah .. tôi không đọc rõ. Tôi nghĩ rằng anh ta có 200 tệp tổng cộng 20gb
Munim

0

Hãy thử bbcp . Thử nghiệm trong môi trường của chúng tôi cho thấy cp có một số loại được xây dựng trong quản trị. Chỉ cần cẩn thận vì khi bạn gỡ bỏ quản trị viên, bạn có thể sắp xếp lại máy chủ của mình và gây ra sự cố ngừng hoạt động. Trong trường hợp của chúng tôi, chúng tôi đã lấy máy chủ ngoại tuyến để thực hiện sao chép, vì vậy nhanh hơn là tốt hơn. Điều này cải thiện thời gian chuyển vài giờ.


0

Đảm bảo các tệp mục tiêu không tồn tại trước khi sao chép.

Đôi khi thật đáng ngạc nhiên là đã dành bao nhiêu thời gian thậm chí chỉ sao chép trên cùng một máy chủ (không liên quan đến mạng).

Xem câu trả lời của tôi cho một câu hỏi cp khác ở đây . Câu chuyện dài, ghi đè một tập tin hiện có chậm hơn nhiều so với cắt ngắn nó hoặc hủy liên kết nó trước, sau đó sao chép. Cái sau nhanh hơn 8 lần cho một tệp 1,2 GB.

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.