
我有一台 CentOS 5.7 伺服器,每晚都會備份其檔案。我擔心在透過網路傳輸備份時,伺服器託管的各個網站的訪客會遇到效能下降的情況。
是否可以限制進程到網路介面的最大允許吞吐量?我想將基於 SSH 的檔案傳輸限制為可用頻寬的一半。這可以在伺服器端或客戶端;也就是說,我很樂意在發起連線的用戶端或接收連線的伺服器上執行此操作。
(不幸的是,我無法添加專用於備份的介面。我可以增加可用吞吐量,但這僅僅意味著網路傳輸會更快完成,但在執行此操作時仍然會最大化連接的總容量。)
一些背景
也許有一些背景是合理的。退一步來說,我遇到的問題是沒有足夠的本地空間來創建備份本身。輸入 SSHFS!備份被保存到表面上是本機磁碟機的地方,這樣網路伺服器本身就不會存在任何備份位元。
為什麼這很重要?因為這似乎會使尊者的使用無效rsync --bwlimit
。rsync
實際上並沒有進行轉移,也沒有能因為我甚至無法騰出空間來保存備份檔案。
我可以聽到您問:“等等,為什麼您甚至需要製作備份文件?為什麼不只是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