Làm thế nào tôi có thể giới hạn băng thông được sử dụng bởi một quá trình?


42

Tôi có một máy chủ CentOS 5.7 sẽ sao lưu các tệp của nó hàng đêm. Tôi lo ngại rằng khách truy cập vào các trang web khác nhau mà máy chủ lưu trữ sẽ bị giảm hiệu suất trong khi bản sao lưu được truyền qua mạng.

Có thể giới hạn thông lượng tối đa được phép của quy trình đối với giao diện mạng không? Tôi muốn giới hạn chuyển tập tin dựa trên SSH chỉ bằng một nửa băng thông có sẵn của tôi. Điều này có thể ở phía máy chủ hoặc máy khách; nghĩa là, tôi rất vui khi thực hiện việc này trên máy khách khởi tạo kết nối hoặc máy chủ nhận kết nối.

(Thật không may, tôi không thể thêm giao diện để dành cho các bản sao lưu. Tôi có thể tăng thông lượng khả dụng của mình, nhưng điều đó chỉ có nghĩa là việc chuyển mạng sẽ hoàn thành nhanh hơn, nhưng vẫn tăng tối đa tổng dung lượng của kết nối trong khi thực hiện.)


Một số nền tảng

Có lẽ một số nền tảng là theo thứ tự. Bước lùi lại, tôi gặp vấn đề với việc không có đủ không gian cục bộ để tự tạo bản sao lưu. Nhập SSHFS! Bản sao lưu được lưu vào ổ đĩa cục bộ để không có bit sao lưu nào trên máy chủ web.

Tại sao điều đó quan trọng? Bởi vì điều đó dường như sẽ làm mất hiệu lực việc sử dụng của người đáng kính rsync --bwlimit. rsyncthực tế không thực hiện chuyển khoản cũng không thể vì tôi thậm chí không thể dành dung lượng để lưu tệp sao lưu.

Tôi có thể nghe bạn hỏi: "Vậy chờ đã, tại sao bạn thậm chí cần tạo một tệp sao lưu? Tại sao không chỉ là rsynccác tệp và thư mục nguồn?" Bởi vì một thứ gây phiền nhiễu có tên "Plesk" nằm trong hỗn hợp! Đây là máy chủ web hướng tới khách hàng của tôi sử dụng Plesk để thuận tiện. Do đó, tôi sử dụng Plesk để khởi tạo các bản sao lưu vì Plesk bổ sung tất cả các loại phép thuật bổ sung vào bản sao lưu khiến việc tiêu thụ nó trong một quy trình phục hồi rất an toàn.

gương mặt buồn



1
Một khả năng khác cho tình huống của tôi, tình cờ không trả lời chính xác câu hỏi cụ thể, là sử dụng ioniceđể điều tiết các bài viết mà một quá trình có thể thực hiện. Vì tôi đang viết cho một hệ thống tập tin SSHFS, tôi có thể bỏ lớp của quá trình sao lưu xuống còn 3 để làm cho nó hoàn toàn nhường chỗ cho bất kỳ quy trình nào khác muốn viết. Bằng cách đó, tôi có được hiệu ứng mà tôi muốn đó là không bao giờ làm giảm trải nghiệm của khách truy cập trang web do băng thông dự phòng.
Wesley

Một câu hỏi, ssh của bạn sử dụng nén? "Nén có" vào .ssh / config của bạn?
Zlatko

Câu trả lời:


25

Bạn có thể sử dụng iptablesđể đánh dấu một gói (--pid-own ...), sau đó sử dụng tcđể định hình lưu lượng. Ngoài ra "--sid-own" có thể được sử dụng để bao gồm các luồng và con của quá trình đó.

http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH

Đối sánh --pid-own
Kernel 2.3, 2.4, 2.5 và 2.6
Ví dụ iptables -A OUTPUT -m own --pid-own 78
Giải thích Trận đấu này được sử dụng để khớp các gói dựa trên ID tiến trình (PID) chịu trách nhiệm về chúng. Trận đấu này khó sử dụng hơn một chút, nhưng một ví dụ sẽ chỉ cho phép PID 94 gửi các gói từ cổng HTTP (tất nhiên nếu quá trình HTTP không được xâu chuỗi). Ngoài ra, chúng ta có thể viết một tập lệnh nhỏ lấy PID từ đầu ra ps cho một trình nền cụ thể và sau đó thêm quy tắc cho nó. Ví dụ: bạn có thể có một quy tắc như trong ví dụ Pid-own.txt


Tôi nghĩ rằng mối quan hệ này với giải pháp của tôi cho cách tốt nhất để làm điều này. --pid-own không thực sự chọn dựa trên quy trình, mà là chủ sở hữu quy trình. Tôi phải tạo một người dùng đặc biệt để khởi chạy quy trình và sau đó lọc dựa trên chủ sở hữu đó để tôi có thể chắc chắn rằng tôi đang định hình lưu lượng truy cập từ quy trình cụ thể đó và không, giả sử, nhiều trình nền có thể đã được khởi chạy từ một người dùng chung.
Wesley

@Wesley Đó không phải là những gì trang man nói: " --pid-owner processidKhớp nếu gói được tạo bởi một quy trình với id quy trình đã cho ." linux.die.net/man/8/iptables
Ajedi32

Câu trả lời này sẽ tốt hơn nhiều nếu nó bao gồm một ví dụ về cách sử dụng iptables và tc cho mục đích này. iptables -A OUTPUT -m owner --pid-owner 78Ví dụ đã cho dường như không hoàn chỉnh (vì nó chỉ khớp với các gói, nó không nói cách "đánh dấu" chúng) và tckhông được giải thích gì cả.
Ajedi32

Để đánh dấu một gói bạn cần thêm một cái gì đó như -j MARK --set-mark 1. Để biết thêm chi tiết, xem: wiki.archlinux.org/index.php/ Kẻ
Mircea Vutcovici

40

Một lựa chọn mà tôi vừa phát hiện ra là sử dụng nhỏ giọt .

nhỏ giọt là một máy ép băng thông không gian người dùng nhẹ di động. Nó có thể chạy ở chế độ cộng tác (cùng với bị lừa) hoặc ở chế độ độc lập.

nhỏ giọt hoạt động bằng cách tận dụng tải trước unix loader. Về cơ bản, nó cung cấp cho ứng dụng một phiên bản mới của chức năng được yêu cầu để gửi và nhận dữ liệu qua các ổ cắm. Sau đó, nó giới hạn lưu lượng dựa trên việc trì hoãn việc gửi và nhận dữ liệu qua một ổ cắm. nhỏ giọt chạy hoàn toàn trong không gian người dùng và không yêu cầu quyền root.


1
Đây là một trong những giải quyết vấn đề của tôi. Tôi đã gặp vấn đề với daemon bitcoin, ngẫu nhiên hút tất cả các bandwdith của mình khi một khách hàng quyết định rằng tôi là người họ nên tải xuống toàn bộ blockchain từ đó.
Omnifarious

Các trickleliên kết mà bạn đã dẫn đến một 404.
Geremia

Tôi đã sửa liên kết bị hỏng (bằng cách thay thế bằng liên kết Wayback Machine).
G-Man nói 'Tái lập Monica'

3
Trickle dường như đã có trên github ngay bây giờ: github.com/mariusae/trickle
Cheetah

hoặcsudo apt-get install trickle
ggll

22

Nếu bạn có thể ghi vào một đường ống (hoặc thiết bị xuất chuẩn), bạn có thể cài đặt lệnh pv(trình xem đường ống). Ban đầu nó được viết để hiển thị tiến trình dữ liệu được truyền qua một đường ống.

tar cvf - /files/to/backup | pv -L 512k > /your/file/on/sshfs

   -L RATE, --rate-limit RATE
          Limit the transfer to a maximum of RATE  bytes  per  second.   A
          suffix of "k", "m", "g", or "t" can be added to denote kilobytes
          (*1024), megabytes, and so on.

Đây thực sự là câu trả lời tôi nghĩ tôi sẽ sử dụng! Tuy nhiên, đó không chính xác là một câu trả lời cho câu hỏi cụ thể mà tôi đã hỏi ban đầu. Than ôi, loại câu hỏi biến hình nhưng vẫn tập trung vào việc giới hạn tốc độ mạng của một quá trình. Tuy nhiên, bạn có thể đóng góp cho câu hỏi mới này mà tôi đã hỏi: unix.stackexchange.com/q 432174/4232
Wesley

Cảm ơn! Tôi đã làm một điều tương tự và cuối cùng đã làm ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz.
clacke

1
Cũng có thể kết hợp nó với ionice, nhưng nó không được phép trên máy chủ cụ thể đó. ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
clacke

6

Tôi sử dụng rsync với tùy chọn --bwlimit = KBPS vì lý do tương tự.

Ethernet 1 Gbit của chúng tôi có thể dễ dàng quét qua RAID SCAS320 DAS cũ của chúng tôi và về cơ bản là một số hộp sản xuất cũ của chúng tôi dựa vào nó cho các cửa hàng NFS của nó.


4

Làm thế nào bạn chuyển dữ liệu? (rsync trên ssh? scp? sftp? cái gì khác?)

rsync sẽ cho phép bạn giới hạn băng thông (xem tùy chọn --bwlimit = KBPS). rsync -e ssh --bwlimit ..

Ngoài ra, bạn có thể thiết lập một qdisc hoặc tương đương để thực hiện giới hạn tỷ lệ ưa thích, nhưng tôi nghi ngờ rằng trong trường hợp của bạn, điều này sẽ là quá mức cần thiết. Tài liệu về điều này có sẵn tại Linux Advanced Routing and Control Control

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.