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


42

我有一台CentOS 5.7服务器,它将每晚备份其文件。我担心在通过网络传输备份时,服务器托管的各个站点的访问者的性能都会下降。

是否可以将进程的最大允许吞吐量限制为网络接口?我想将基于SSH的文件传输限制为仅可用带宽的一半。它可以在服务器或客户端。也就是说,我很乐意在发起连接的客户端或接收连接的服务器上执行此操作。

(不幸的是,我无法添加专用于备份的接口。我可以增加可用的吞吐量,但这仅意味着网络传输将更快地完成,但在执行连接时仍会最大化连接的总容量。)


一些背景

也许是有一些背景知识的。退一步,我遇到了一个问题,就是没有足够的本地空间来创建备份本身。输入SSHFS!备份被保存到表面上是本地驱动器的位置,因此Web服务器本身上没有备份位。

为什么这么重要?因为那似乎会使尊者的使用无效rsync --bwlimitrsync实际上并没有进行传输,也无法进行传输,因为我什至都无法腾出空间来保存备份文件。

我听到您问:“等等,为什么您甚至需要制作一个备份文件?为什么不只是rsync源文件和文件夹?” 因为令人讨厌的东西叫做“ Plesk”!这是我面向客户的Web主机,使用Plesk为方便起见。因此,我使用Plesk来启动备份,因为Plesk向备份添加了各种额外的魔术,这使得在还原过程中使用它非常安全。

悲伤的脸



1
对于我的情况,另一种可能无法准确回答特定问题的可能性是,使用它ionice来限制进程可以进行的写入。由于我正在写SSHFS文件系统,因此我可以将备份进程的类降至3,以使其完全让位给任何其他要编写的进程。通过这种方式,我得到了我想要的效果,即永远不会由于备份占用带宽而降低站点访问者的体验。
韦斯利2012年

一个问题,您的ssh使用压缩吗?“压缩是”到您的.ssh / config?
Zlatko

Answers:


25

您可以使用iptables标记数据包(--pid-owner ...),然后使用tc以调整流量。同样,“-sid-owner”可用于包括该进程的线程和子进程。

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

匹配 --pid-owner
内核 2.3、2.4、2.5 和2.6
示例 iptables -A OUTPUT -m owner --pid-owner 78
说明 此匹配用于根据负责数据包的进程ID(PID)来匹配数据包。这种匹配有点难用,但是一个例子只是允许PID 94从HTTP端口发送数据包(当然,如果HTTP进程没有线程化)。或者,我们可以编写一个小脚本,该脚本从特定守护程序的ps输出中获取PID,然后为其添加规则。例如,您可能有一个规则,如Pid-owner.txt示例所示


我认为这与实现最佳方法的解决方案有关。--pid-owner实际上不是基于进程选择,而是基于进程所有者。我必须创建一个特殊的用户以启动该流程,然后根据该所有者进行过滤,这样我才能确定我只是在从该特定流程中进行流量整形,而不是从多个后台驻留程序中启动流量普通用户。
韦斯利

@Wesley手册页没有这样说:“ --pid-owner processid如果数据包是由具有给定进程ID的进程创建的,则匹配。” linux.die.net/man/8/iptables
Ajedi32 '16

如果它包含如何为此目的使用iptables和tc的示例,则此答案会更好。给定的iptables -A OUTPUT -m owner --pid-owner 78示例似乎并不完整(因为它仅匹配数据包,没有说明如何“标记”它们),tc也没有进行任何解释。
Ajedi32 '16

要标记数据包,您需要添加-j MARK --set-mark 1。有关详细信息,请参阅:wiki.archlinux.org/index.php/...
米尔恰Vutcovici

40

我刚刚发现的一种选择是使用细

细流是便携式轻量级用户空间带宽整形器。它可以以协作模式(与点滴模式结合)或独立模式运行。

细流通过利用unix加载程序的预加载来工作。从本质上讲,它为应用程序提供了通过套接字发送和接收数据所需的功能的新版本。然后,它基于延迟通过套接字发送和接收数据来限制流量。细流完全在用户空间中运行,并且不需要root特权。


1
这是解决我的问题的那个。当客户确定我是他们应该从中下载整个区块链的人时,我的比特币守护程序出现问题,随机地吸了我所有的bandwdith。
2012年

trickle链接你给了通向404
Geremia

我修复了损坏的链接(通过将其替换为Wayback Machine链接)。
G-Man说'Resstate Monica''De​​c

3
细流似乎现在在github上:github.com/mariusae/trickle
猎豹

sudo apt-get install trickle
ggll

22

如果可以写入管道(或标准输出),则可以安装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.

这实际上是我想使用的答案!但是,这并不是我最初提出的特定问题的答案。las,这个问题变了,但仍然集中在限制进程的网络速度上。但是,您可以对我提出的这个新问题做出贡献:unix.stackexchange.com/q/34174/4232
Wesley

谢谢!我当时在做类似的事情,但最终却做了ssh my-remote-server bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
clacke 2012年

1
也可以将它与ionice结合使用,但是在该特定服务器上是不允许的。ssh my-remote-server ionice -c3 bash -c "'find / -xdev|cpio -o|gzip -c1'"|pv --rate-limit 1M > my-remote-root.cpio.gz
clacke 2012年

6

出于相同的原因,我将rsync与--bwlimit = KBPS选项一起使用。

我们的1 Gbit以太网很容易使我们的旧SCSI320 DAS RAID陷入沼泽,而从本质上来说,DOS就是我们的NFS存储所依赖的一些旧生产盒。


4

您如何传输数据?(通过ssh的rsync?scp?sftp?其他?)

rsync将允许您限制带宽(请参阅选项--bwlimit = KBPS)。rsync -e ssh --bwlimit ..

或者,您可以设置一个qdisc或等效的磁盘来限制幻想速率,但是我怀疑在您的情况下,这将是严重的过度杀伤力。有关此问题的文档,请参见Linux高级路由和流量控制HOWTO。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.