Làm cho Linux ghi vào hệ thống tệp mạng đồng thời với các lần đọc đĩa cục bộ


17

Tóm lược

Làm thế nào bạn có thể cấu hình Linux để đọc cả từ đĩa / hệ thống tệp cục bộ và ghi vào chia sẻ mạng cùng một lúc, trái ngược với việc đọc trong khi không có dữ liệu nào đi qua mạng, sau đó gửi dữ liệu đó qua mạng trong khi đĩa cục bộ nhàn rỗi?

Nó nhanh hơn nhiều để đọc và viết cùng một lúc thay vì chỉ thực hiện một thao tác và sau đó là một thao tác xen kẽ.

Chi tiết

Tôi đang chuyển một lượng lớn dữ liệu từ các đĩa cục bộ trên máy Linux sang thiết bị NAS.

Tôi đang sử dụng rsyncđể sao chép cơ bản /srv/datavào /mnt/nas, đó là một mount CIFS.

Nó khởi đầu tốt, đọc ở tốc độ 100MB / giây và ghi vào NAS với tốc độ 100MB / giây (giới hạn của mạng gigabit), với cả việc đọc và viết xảy ra đồng thời.

Tuy nhiên, bây giờ, vài giờ sau, tôi thấy rằng nó đang đọc từ đĩa cục bộ, sau đó dừng đọc trong khi ghi vào NAS, sau đó khi không còn dữ liệu để ghi vào NAS, nó tiếp tục đọc từ đĩa lần nữa. Mạng không hoạt động trong khi đĩa đang được đọc và đĩa không hoạt động trong khi mạng đang được sử dụng.

Không cần phải nói, đọc 200 MB sau đó viết 200 MB mất nhiều thời gian hơn đọc và viết 200 MB đó cùng một lúc.

Làm cách nào tôi có thể định cấu hình kernel sao cho nó dính vào hành vi đọc và viết trước đó cùng lúc, thay vì xen kẽ giữa đọc rồi viết, chỉ thực hiện một thao tác tại một thời điểm?

Một số quan sát: Khi đĩa cục bộ đọc ở tốc độ 100 + MB / giây, mọi thứ dường như xảy ra song song tốt, nhưng một khi đĩa chậm lại (dường như chỉ ở mức 20MB / giây vì một số lý do) đó là khi đọc / ghi chuyển đổi dường như xảy ra.

Tôi cũng có thể chạy syncbằng tay mỗi vài giây để có được ghi xảy ra song song với việc đọc (mặc dù rõ ràng là ở tốc độ giảm) tuy nhiên đặt synctrong một whilevòng lặp để nó chạy năm giây không có vẻ như là giải pháp đúng ...

Hạt nhân dường như lưu trữ khoảng 1GB dữ liệu và sau đó ghi nó ra mạng càng nhanh càng tốt - điều đó tốt - tôi không hiểu tại sao đĩa chậm cần dừng đọc trong khi dữ liệu được gửi qua mạng.


1
Hầu hết các công cụ unix hoàn toàn không được tối ưu hóa cho băng thông theo nghĩa này, không phải rsync, thậm chí không phải là một cp đơn giản. Chúng là các ứng dụng đơn luồng sử dụng chặn IO.
peterh - Phục hồi Monica

1
Đâu đó khoảng 100 MB / s cũng là những gì bạn có thể thấy trên các ổ cứng xoay 7200 vòng / phút hiện đại trong khối lượng công việc tuần tự hoàn toàn. Nó sẽ ngừng hoạt động khi bạn bắt đầu tìm kiếm, chẳng hạn như để cập nhật siêu dữ liệu hoặc nếu hệ thống tệp bị phân mảnh, vì sau đó bạn bị ràng buộc IOPS.
một CVn

bạn có thể cài đặt rsync trên NAS không?
Jasen

Câu trả lời:


27

Sau một số điều tra thêm, có vẻ như vấn đề này ít liên quan đến hạt nhân hơn và nhiều hơn về cách thức rsyncvà CIFS tương tác.

Theo như tôi có thể nhận ra, điều đang xảy ra là khi rsyncđóng tệp đích, CIFS (và có lẽ là bất kỳ hệ thống tệp mạng nào) đảm bảo tệp được xóa hoàn toàn và ghi vào đĩa từ xa trước khi tòa nhà closequay trở lại. Điều này là để đảm bảo bất kỳ ứng dụng nào khi hoạt động đóng hoàn thành thành công, tệp đã được lưu hoàn toàn và không có bất kỳ lỗi nào có thể gây mất dữ liệu.

Nếu điều này không được thực hiện, thì ứng dụng có thể đóng tệp, thoát khỏi suy nghĩ rằng thao tác lưu đã thành công, sau đó (có lẽ do sự cố mạng), dữ liệu không thể được ghi lại, nhưng sau đó quá muộn để ứng dụng làm bất cứ điều gì về nó, chẳng hạn như hỏi người dùng xem họ có muốn lưu tệp ở nơi khác không.

Yêu cầu này có nghĩa là mỗi lần rsynchoàn thành sao chép một tệp, toàn bộ bộ đệm đĩa phải trống hết trên mạng trước khi rsyncđược phép tiếp tục đọc tệp tiếp theo.

Cách giải quyết là gắn kết chia sẻ CIFS với tùy chọn cache=nonevô hiệu hóa tính năng này và khiến tất cả I / O chuyển trực tiếp đến máy chủ. Điều này giúp loại bỏ vấn đề và cho phép đọc và ghi thực thi song song, tuy nhiên một nhược điểm của giải pháp này là hiệu suất có phần thấp hơn. Trong trường hợp của tôi, tốc độ truyền mạng giảm từ 110MB / giây xuống 80MB / giây.

Điều này có thể có nghĩa là nếu bạn đang sao chép các tệp lớn, hiệu suất có thể tốt hơn với hành vi đọc / ghi xen kẽ. Với nhiều tệp nhỏ hơn, việc vô hiệu hóa bộ đệm sẽ dẫn đến việc xóa bộ nhớ cache ít hơn mỗi lần đóng tệp để hiệu suất có thể tăng lên ở đó.

Có vẻ như rsynccần một tùy chọn để đóng tay cầm tệp của nó trong một luồng khác, vì vậy nó có thể bắt đầu đọc tệp tiếp theo trong khi tệp cuối cùng vẫn đang bị xóa.

EDIT: Tôi đã xác nhận rằng cache=nonechắc chắn sẽ giúp khi chuyển nhiều tệp nhỏ (mang lại từ 10MB / giây lên đến 80MB / giây) nhưng khi chuyển các tệp lớn (1GB +) cache=nonesẽ giảm tốc độ truyền từ 110MB / giây xuống cùng 80MB / giây. Điều này cho thấy rằng việc truyền chậm từ nhiều tệp nhỏ ít hơn về việc tìm kiếm đĩa nguồn và nhiều hơn về việc có quá nhiều lần xóa bộ đệm từ tất cả các tệp nhỏ.


2
Đó là một vấn đề rất thú vị, và cảm ơn vì đã đăng lời giải thích. rsynckhông đọc tệp trong một luồng khác nhau (thực ra là quá trình khác nhau) vì nó được thiết kế sao cho một bản sao rsyncđang chạy ở mỗi bên của mạng, mặc dù trong trường hợp của bạn, cả hai bản sao đều ở cùng một phía (và hệ thống tệp đang ẩn Thực tế là có một mạng lưới). Tôi đoán nó không có ích gì, bởi vì trình đọc xử lý rất nhanh chóng lấp đầy đường ống trong khi quá trình nhà văn đang chặn trên a close(). rsyncsẽ hoạt động tốt hơn nếu bạn đang sử dụng rsynctrên dây chứ không phải CIFS.
Celada

1
Tôi sẽ tưởng tượng rằng một giải pháp khác là bạn không thể chạy rsynctrên NAS sẽ sử dụng rsyncqua mạng (như rsync -a files localhost:/dest/path) trong khi bằng cách nào đó giới thiệu một cách giả tạo một bộ đệm khổng lồ (như, nhiều megabyte, ít nhất) vào các kết nối mạng. Không chắc chắn cách hack tốt nhất để làm điều đó sẽ như thế nào.
Celada

@Celada: Cảm ơn! Có, tôi tưởng tượng việc chạy rsynctrên hộp NAS cũng sẽ giải quyết vấn đề này. Mặc dù phức tạp hơn một chút (quyền NAS kỳ lạ, phải bỏ liên kết tượng trưng, ​​v.v.) nhưng nếu tôi có thêm một chút dữ liệu để sao chép thì sẽ đáng để đầu tư thời gian để làm điều đó tôi nghĩ.
Malvineous

2
Có thể không liên quan đến trường hợp của bạn: Tôi đã gặp một vấn đề tương tự vài năm trước khi viết kết quả đầu ra của dump(8)một NAS gắn trên NFS. Tại thời điểm đó, tôi đã chẩn đoán sự cố là tối đa hóa CPU trên NAS, do hiệu ứng kết hợp của máy chủ NFS và tường lửa chạy trên NAS (hộp không được root và tường lửa không thể bị tắt hoàn toàn giao diện web). Vấn đề đã biến mất khi chúng tôi thay thế NAS bằng một PC cũ. FWIW.
Satō Katsura

@SatoKatsura: Chắc chắn là một khả năng cho các thiết bị NAS cũ hơn, mặc dù trong trường hợp đó tôi tưởng tượng bạn sẽ thấy một sự chuyển giao tổng thể chậm hơn là một vụ nổ như thế này? NAS của tôi là một lõi kép (~ 2GHz), sử dụng CPU khoảng 30% khi sử dụng tối đa một gigabit NIC mà không có khung jumbo nên sẽ ổn ở đó.
Malvineous
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.