Tại sao rsync nhanh hơn NFS?


40

Vài ngày trước tôi nhận thấy một điều khá kỳ lạ (ít nhất là đối với tôi). Tôi đã chạy rsync sao chép cùng một dữ liệu và xóa nó sau đó đến NFS mount, được gọi /nfs_mount/TEST. Điều này /nfs_mount/TESTđược lưu trữ / xuất khẩu từ nfs_server-eth1. MTU trên cả hai giao diện mạng là 9000, chuyển đổi ở giữa cũng hỗ trợ các khung jumbo. Nếu tôi làm, rsync -av dir /nfs_mount/TEST/tôi nhận được tốc độ truyền mạng X MBps. Nếu tôi làm, rsync -av dir nfs_server-eth1:/nfs_mount/TEST/tôi nhận được tốc độ truyền mạng ít nhất là 2 lần MBps. Tùy chọn gắn NFS của tôi là nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

Điểm mấu chốt: cả hai lần chuyển đều đi qua cùng một mạng con, cùng một dây, cùng giao diện, đọc cùng một dữ liệu, ghi vào cùng một thư mục, v.v.

Máy khách là Ubuntu 10.04, máy chủ Ubuntu 9.10.

Làm thế nào đến rsync là nhanh hơn nhiều? Làm thế nào để làm cho NFS phù hợp với tốc độ đó?

Cảm ơn

Chỉnh sửa: xin lưu ý Tôi sử dụng rsync để ghi vào chia sẻ NFS hoặc SSH vào máy chủ NFS và ghi cục bộ tại đó. Cả hai lần tôi làm rsync -av, bắt đầu với thư mục đích rõ ràng. Ngày mai tôi sẽ thử với bản sao đơn giản.

Edit2 (thông tin bổ sung): Kích thước tệp nằm trong khoảng từ 1KB-15MB. Các tập tin đã được nén, tôi đã cố gắng nén chúng hơn nữa nhưng không thành công. Tôi đã làm tar.gztập tin từ đó dir. Đây là mẫu:

  • rsync -av dir /nfs_mount/TEST/ = chuyển chậm nhất;
  • rsync -av dir nfs_server-eth1:/nfs_mount/TEST/= rsync nhanh nhất với khung jumbo được bật; không có khung jumbo thì chậm hơn một chút, nhưng vẫn nhanh hơn đáng kể so với khung trực tiếp đến NFS;
  • rsync -av dir.tar.gz nfs_server-eth1:/nfs_mount/TEST/ = về tương tự như không tương đương tar.gz của nó;

Các thử nghiệm với cpscp:

  • cp -r dir /nfs_mount/TEST/= nhanh hơn một chút rsync -av dir /nfs_mount/TEST/nhưng vẫn chậm hơn đáng kể rsync -av dir nfs_server-eth1:/nfs_mount/TEST/.
  • scp -r dir /nfs_mount/TEST/= tổng thể nhanh nhất, vượt qua một chút rsync -av dir nfs_server-eth1:/nfs_mount/TEST/;
  • scp -r dir.tar.gz /nfs_mount/TEST/ = về tương tự như không tương đương tar.gz của nó;

Kết luận, dựa trên kết quả này: Đối với thử nghiệm này, không có sự khác biệt đáng kể nếu sử dụng tệp lớn tar.gz hoặc nhiều tệp nhỏ. Khung jumbo bật hoặc tắt cũng làm cho hầu như không có sự khác biệt. cpscpnhanh hơn tương rsync -avđương của chúng. Viết trực tiếp vào chia sẻ NFS xuất khẩu chậm hơn đáng kể (ít nhất 2 lần) so với ghi vào cùng thư mục qua SSH, bất kể phương thức được sử dụng.

Sự khác biệt giữa cprsynckhông liên quan trong trường hợp này. Tôi quyết định thử cpscpchỉ để xem liệu họ có hiển thị cùng một mẫu không và họ làm - chênh lệch 2 lần.

Khi tôi sử dụng rsynchoặc cptrong cả hai trường hợp, tôi không thể hiểu điều gì ngăn NFS đạt tốc độ truyền của các lệnh tương tự trên SSH.

Làm thế nào để viết vào chia sẻ NFS chậm hơn 2 lần so với viết vào cùng một nơi trên SSH?

Edit3 (tùy chọn máy chủ NFS / etc / export) : rw,no_root_squash,no_subtree_check,sync. / Proc / mounts của khách hàng hiển thị : nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp.

Cảm ơn tất cả!


Đây có phải là kết quả tương tự cho nhiều tệp nhỏ và một tệp lớn?
Xiè Jìléi

@notpeter - đã thêm các tùy chọn trong bài viết gốc. Cảm ơn bạn!
grs

Tôi nhận ra đây là một câu hỏi khá cũ, nhưng một điểm khác biệt lớn giữa SCP và rsync chiếm một chút khác biệt về thời gian chuyển là kiểm tra chuyển tệp tự động được thực hiện để cho thấy rằng tệp được chuyển chính xác. Điều này khác với tùy chọn -c của rsync sử dụng tổng kiểm tra để xác thực nếu một tệp đã được cập nhật giữa các máy chủ. Nếu bạn chỉ đối phó với các tệp mới không hoạt động.
Rowan Hawkins

Câu trả lời:


20

Có thể đó không phải là tốc độ truyền chậm hơn, nhưng độ trễ ghi tăng lên. Hãy thử gắn đồng bộ chia sẻ NFS thay vì đồng bộ hóa và xem liệu điều đó có đóng khoảng cách tốc độ không. Khi bạn rsync qua ssh, quy trình rsync từ xa sẽ ghi không đồng bộ (nhanh chóng). Nhưng khi ghi vào chia sẻ nfs được gắn đồng bộ, ghi không được xác nhận ngay lập tức: máy chủ NFS đợi cho đến khi chúng chạm đĩa (hoặc nhiều khả năng là bộ đệm của bộ điều khiển) trước khi gửi xác nhận cho máy khách NFS rằng việc ghi đã thành công.

Nếu 'async' khắc phục sự cố của bạn, hãy lưu ý rằng nếu có điều gì đó xảy ra với máy chủ NFS giữa chừng thì bạn rất có thể sẽ có dữ liệu không nhất quán trên đĩa. Miễn là giá trị NFS này không phải là bộ lưu trữ chính cho dữ liệu này (hoặc bất kỳ dữ liệu nào khác), có lẽ bạn sẽ ổn. Tất nhiên, bạn sẽ ở trong cùng một chiếc thuyền nếu bạn rút phích cắm trên máy chủ nfs trong / sau khi rsync-over-ssh chạy (ví dụ: rsync trả về đã 'kết thúc', máy chủ nfs gặp sự cố, dữ liệu không được cam kết trong bộ đệm ghi hiện bị mất để lại dữ liệu không nhất quán trên đĩa).

Mặc dù không phải là vấn đề với thử nghiệm của bạn (rsyncing dữ liệu mới), xin lưu ý rằng rsync trên ssh có thể tạo ra các yêu cầu CPU và IO đáng kể trên máy chủ từ xa trước khi một byte được chuyển trong khi tính toán tổng kiểm tra và tạo danh sách các tệp cần phải có cập nhật.


1
Tôi nghĩ rằng câu trả lời này là đúng. Nếu phương tiện (đĩa) trên hai máy tương đương nhau (cùng cấu hình RPM / băng thông / RAID), bạn có thể biết được liệu đây có phải là trường hợp bằng cách thực hiện thao tác nghịch đảo: 'rsync -av / nfs_mount / TEST / dir 'Nếu không, tắt đồng bộ hóa và thử nó là cách để kiểm tra.
Slartibartfast

Tôi đã thực hiện các bài kiểm tra nhanh với đồng bộ hóa với async và tôi nghĩ rằng câu trả lời này có cơ hội tuyệt vời để trở thành câu hỏi đúng. Việc chọn async sẽ thu hẹp khoảng cách đáng kể, nhưng nó vẫn chậm hơn một chút so với SSH. Tôi sẽ làm thêm các bài kiểm tra và cho các bạn biết. Cảm ơn rất nhiều!
grs

3
Cập nhật: các thử nghiệm mới của tôi đã chứng minh sự khác biệt đáng kể về tốc độ đồng bộ hóa so với tùy chọn xuất NFS không đồng bộ. Với NFS được gắn với async và rsync -av dir.tar.gz /nfs_mount/TEST/tôi có cùng tốc độ truyền như với rsync -av dir nfs_server-eth1:/nfs_mount/TEST/. Tôi sẽ đánh dấu câu trả lời này là đúng, nhưng tôi tò mò liệu tôi có thể cải thiện thiết lập hơn nữa không. Cảm ơn bạn! Làm tốt lắm
grs

22

NFS là một giao thức chia sẻ, trong khi Rupync được tối ưu hóa để truyền tệp; có rất nhiều tối ưu hóa có thể được thực hiện khi bạn biết một tiên nghiệm rằng mục tiêu của bạn là sao chép các tệp xung quanh nhanh nhất có thể thay vì cung cấp quyền truy cập chung vào chúng.

Điều này sẽ giúp: http://en.wikipedia.org/wiki/Rsync


2
Nếu bạn biết dữ liệu trước khi sử dụng (mà bạn thường làm), bạn có thể tắt tính năng nén một cách chọn lọc với tùy chọn -e "ssh Compression=no"để có được tốc độ truyền nhanh hơn. Điều này sẽ giữ cho nó khỏi nén các tập tin có thể đã được nén. Tôi đã nhận thấy một tốc độ tăng lên rất nhiều lần.
lsd

5
@lsd - nén ssh thường bị tắt theo mặc định và không được khuyến nghị cho rsync. Cho phép rsync để nén dữ liệu với các tùy chọn -z, --compress-level--skip-compresssẽ có được hiệu suất tha tốt hơn với một phương tiện giao thông nén.
JimB

5

Rsync là một giao thức tệp chỉ chuyển các bit đã thay đổi giữa các tệp. NFS là một giao thức tệp thư mục từ xa xử lý mọi thứ mọi lúc ... giống như một SMB theo một cách nào đó. Hai là khác nhau và cho các mục đích khác nhau. Bạn có thể sử dụng Rsync để chuyển giữa hai cổ phiếu NFS.


6
Tôi cảm thấy hơi thất vọng khi bầu bạn vì bạn không nói gì về mặt kỹ thuật, nhưng có vẻ như bạn không thêm bất cứ điều gì vào cuộc thảo luận, và bạn đã tham gia sau khi có nhiều thông tin cụ thể hơn. Ngoài ra, từ bài đăng của mình, có vẻ như tác giả đã nhận thức được những điều này.
Slartibartfast

Tôi nghĩ rằng tôi là bài viết thứ hai và là người đầu tiên đề cập rằng cả hai đều là các giao thức với các mục tiêu khác nhau trong tâm trí. Không sao, tôi nghĩ rằng chỉnh sửa đầu tiên của câu hỏi là một chút ngu ngốc.
pcunite

3

Hay đấy. Một khả năng mà bạn có thể không xem xét là nội dung / loại tệp bạn đang truyền.

Nếu bạn có các tệp nhỏ (ví dụ: email trong các tệp riêng lẻ), hiệu quả NFS có thể tăng lên do không sử dụng MTU đầy đủ (có thể điều này ít xảy ra với TCP hơn UDP).

Ngoài ra, nếu bạn có các tệp / dữ liệu có khả năng nén cao, CPU nhanh và mạng không có tốc độ của CPU (*), bạn có thể tăng tốc chỉ từ việc nén ngầm qua liên kết ssh.

Khả năng thứ ba là các tệp (hoặc một phiên bản của chúng) đã tồn tại ở đích. Trong trường hợp này, việc tăng tốc sẽ là do giao thức rsync giúp bạn chuyển các tập tin.

(*) Trong trường hợp này là 'tốc độ', tôi đang đề cập đến tốc độ CPU có thể nén dữ liệu so với tốc độ mà mạng có thể truyền dữ liệu, ví dụ: phải mất 5 giây để gửi 5 MB qua dây, nhưng CPU có thể nén 5MB thành 1MB trong 1 giây. Trong trường hợp này, thời gian truyền dữ liệu nén của bạn sẽ chỉ hơn 1 giây, trong khi dữ liệu không nén là 5 giây.


Rất tốt! Các tập tin tôi kiểm tra với nhiều hình ảnh nhỏ. Chúng khác nhau về kích thước. Tôi phải kiểm tra lại nếu tôi có thể nén chúng thêm nữa. Các tập tin chắc chắn không tồn tại ở đích, vì tôi bắt đầu từ đầu mỗi lần. Ngày mai, tôi sẽ thực hiện các thử nghiệm với đơn giản cp -rso với rsyncsau đó tôi sẽ nén các tệp để có các tệp lớn hơn để hưởng lợi từ MTU. Cảm ơn!
grs

1

Tôi cũng sử dụng -e "ssh Ciphers = arcfour" để tăng thông lượng.


1
Cần một "-o". tức là: "rsync -va -e" ssh -o Ciphers = arcfour "nguồn đích: / Destination /"
Pete Ashdown

1

Nếu mục tiêu của bạn là chỉ sao chép tất cả các tệp từ nơi này sang nơi khác, thì tar / netcat sẽ là lựa chọn nhanh nhất. nếu bạn biết rằng bạn có nhiều khoảng trắng trong tệp (số không) thì hãy sử dụng tùy chọn -i.

NGUỒN: tar cvif - / path / to / source | nc DESTINATION PORTNUM DESTINATION: cd / path / to / source && nc -l PORTNUM | tar xvif -

nếu bạn biết dữ liệu của mình có thể nén được, thì hãy sử dụng nén trên các lệnh tar của bạn -z -j -Ipixz

Tôi là một fan hâm mộ của pixz .. song song xz, nó cung cấp khả năng nén tuyệt vời và tôi có thể điều chỉnh số lượng cpu tôi có cho băng thông mạng. Nếu tôi có băng thông chậm hơn, tôi sẽ sử dụng nén cao hơn vì vậy tôi đang chờ trên cpu nhiều hơn mạng .. nếu tôi có mạng nhanh, tôi sẽ sử dụng mức nén rất thấp:

NGUỒN: tar cvif - / path / to / source | pixz -2 -p12 | nc DESTINATION PORTNUM # tar, bỏ qua các số không, nén pixz cấp 2 bằng cách sử dụng 12 lõi cpu DESTINATION: nc -l PORTNUM | tar -Ipixz -xvif

Nếu bạn điều chỉnh mức độ nén và lõi đúng, tùy thuộc vào tập dữ liệu của bạn, bạn sẽ có thể giữ cho mạng gần bão hòa và thực hiện đủ nén mà bạn bị tắc nghẽn trở thành đĩa (thường là phía ghi nếu hệ thống đĩa đọc và ghi giống nhau).

đối với rsync, tôi tin rằng nó bỏ qua các số 0 tương tự như cách tar thực hiện với tùy chọn đó, vì vậy nó truyền ít dữ liệu hơn NFS. NFS không thể đưa ra các giả định về dữ liệu nên phải truyền từng byte cùng với chi phí giao thức NFS. rsync có một số chi phí ..

netcat về cơ bản là không có .. nó sẽ gửi các gói TCP đầy đủ không chứa gì ngoài dữ liệu bạn quan tâm.

với netcat, như với scp, bạn phải gửi tất cả dữ liệu nguồn mọi lúc, bạn không thể chọn lọc như với rsync để không phù hợp với các bản sao lưu gia tăng hoặc loại đó, nhưng tốt cho việc sao chép dữ liệu hoặc lưu trữ.


0

Bạn có thiết lập khóa tập tin trên nfsshare? Bạn có thể nhận được nhiều khuôn mẫu hơn nếu điều đó bị vô hiệu hóa.


Làm thế nào tôi có thể tìm ra nếu nó được kích hoạt hay không? Cái này ở đây: docstore.mik.ua/orelly/networking_2ndEd/nfs/ch11_02.htm gợi ý rằng NFS v3 không có khả năng khóa tệp.
grs

-1

Tôi giả sử tốc độ tăng ít nhất một phần là do "rsync src host: / path" tạo ra một quy trình cục bộ trên máy từ xa để gửi / nhận, cắt giảm một nửa hiệu quả I / O 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.