我有一台服务器,我想开始每天备份某些文件。由于服务器正在生产中,最好限制网络带宽,我以为 trickle 可以完成这项工作,但它似乎没有任何效果,我不明白为什么。
服务器 A 有我想要存档的文件。我在其上创建了一个 NFS 共享,并授予了挂载文件的服务器 B 的访问权限。在服务器 BI 上运行以下命令:
trickle -s -u 20000 -d 20000 find /mnt/ServerA/log/ -newermt 20181001 -not -newermt 20181002 -type f -print0 | xargs -0 tar -cvzf /tmp/archive.tar.gz
当我使用 iptraf-ng 工具观察服务器 B 的网络流量时,我发现两台服务器都充分利用了它们的 1 Gigabit 带宽(它们位于同一个局域网)。trickle 并没有像我在上面的命令中指定的那样将其限制为 20Mbps。
这是我在 iptraf-ng 中看到的内容:命令运行时,速度为 846.68 Mbps(服务器 A 和 B)。
为什么 trickle 命令不起作用以及我可以用什么来代替,这相对简单。
答案1
我对 trickle 不是很熟悉,但在我看来,在您的命令中,trickle 是在“find”命令上运行,而不是 tar 命令,后者是使用带宽的地方。
我会考虑重新调整命令以使用 PV 来限制流的速度。我还没有尝试过,但我想这样的方法会有效:
find /mnt/ServerA/log/ -newermt 20181001 -not -newermt 20181002 -type f -print0 | tar -c --files-from - | pv --rate-limit 2m | gzip > /tmp/archive.tar.gz
分解一下,find 命令会像以前一样查找文件。--files-from 允许 tar 将文件读入流中(未压缩)。pv 命令充当流的中断 - 2m 为 2 兆字节,因此略大于 20 兆比特。然后,此 tar 流被压缩为 gzip 文件。
我在这里指出,在流式传输和压缩文件的过程中进行了大量额外的工作 - 这是因为我理解源是远程系统。如果源是本地系统,而文件被写入远程系统,则可以使用更简单的变体,使用 tar 对流进行 gzip 压缩,然后通过 pv 进行管道传输并将其写出 - 但这会限制压缩流的速度。