如何限制进程使用的带宽?

如何限制进程使用的带宽?

我有一台 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

相关内容