如何限制進程使用的頻寬?

如何限制進程使用的頻寬?

我有一台 CentOS 5.7 伺服器,每晚都會備份其檔案。我擔心在透過網路傳輸備份時,伺服器託管的各個網站的訪客會遇到效能下降的情況。

是否可以限制進程到網路介面的最大允許吞吐量?我想將基於 SSH 的檔案傳輸限制為可用頻寬的一半。這可以在伺服器端或客戶端;也就是說,我很樂意在發起連線的用戶端或接收連線的伺服器上執行此操作。

(不幸的是,我無法添加專用於備份的介面。我可以增加可用吞吐量,但這僅僅意味著網路傳輸會更快完成,但在執行此操作時仍然會最大化連接的總容量。)


一些背景

也許有一些背景是合理的。退一步來說,我遇到的問題是沒有足夠的本地空間來創建備份本身。輸入 SSHFS!備份被保存到表面上是本機磁碟機的地方,這樣網路伺服器本身就不會存在任何備份位元。

為什麼這很重要?因為這似乎會使尊者的使用無效rsync --bwlimitrsync實際上並沒有進行轉移,也沒有因為我甚至無法騰出空間來保存備份檔案。

我可以聽到您問:“等等,為什麼您甚至需要製作備份文件?為什麼不只是rsync源文件和資料夾?”因為其中混雜著一個名為「Plesk」的煩人的東西!這是我面向客戶的 Web 主機,為了方便起見,它使用 Plesk。因此,我使用 Plesk 來啟動備份,因為 Plesk 為備份添加了各種額外的魔力,使得在復原過程中使用它非常安全。

悲傷的臉

答案1

我剛剛發現的一個選擇是使用trickle

trickle是一個便攜式輕量級用戶空間頻寬整形器。它可以以協作模式(與 一起trickled)或獨立模式運作。

trickle透過利用 Unix 載入器預先載入來運作。本質上,它為應用程式提供了透過套接字發送和接收資料所需的新版本功能。然後,它透過延遲透過套接字發送和接收資料來限制流量。trickle完全在使用者空間中運行,不需要 root 權限。

對於 Ubuntu 用戶,透過運行安裝它

sudo apt install trickle

舉個例子,執行maven build時間將下載速率限制為 20kB/s,上傳速率限制為 111kB/s:

trickle -sd 20 -u 111 mvn build

答案2

您可以用於iptables標記資料包(--pid-owner ...),然後用於tc調整流量。此外,「--sid-owner」可用來包含該行程的執行緒和子程序。

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

匹配 --pid-所有者
核心2.3、2.4、2.5 和 2.6
例子 iptables -A 輸出 -m 所有者 --pid-所有者 78
解釋 此匹配用於根據負責資料包的進程 ID (PID) 來匹配資料包。此匹配有點難以使用,但一個範例是僅允許 PID 94 從 HTTP 連接埠發送封包(當然,如果 HTTP 進程不是線程化的)。或者,我們可以編寫一個小腳本,從特定守護程式的 ps 輸出中取得 PID,然後為其新增規則。例如,您可以擁有 Pid-owner.txt 範例中所示的規則

答案3

如果您可以寫入管道(或標準輸出),則可以安裝pv(管道檢視器)命令。它最初是為了顯示透過管道傳輸的資料的進度而編寫的。

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.

答案4

您如何傳輸資料? (透過 ssh 進行 rsync?scp?sftp?還有其他嗎?)

rsync 將允許您限制頻寬(請參閱選項 --bwlimit=KBPS)。 rsync -e ssh --bwlimit ..

或者,您可以設定一個 qdisc 或等效的東西來進行奇特的速率限制,但我懷疑在您的情況下這將是嚴重的矯枉過正。有關此內容的文​​件可在以下位置找到:Linux 進階路由與流量控制 HOWTO

相關內容