1

正如标题所说,我想要完成的是给定一个包(通常大小可能在 500Mb 和 1Gb 之间变化),我想同时复制大约 40 台服务器(同时),我一直在使用当时运行副本的脚本,因此我正在考虑以下可能性:

1-多进程库并为每个复制函数创建一个进程,以便它们可以同时运行;- 虽然我认为我最终可能会遇到 I/O 瓶颈,并且进程不能共享相同的数据。

2-我没有使用单一的互联网连接,而是使用一个巨大的公司广域网。

谁能告诉我是否有其他更有效的方法(更快)来实现同样的目标?或其他解决方法?(我可以从 2 核工作站运行此任务)。

4

2 回答 2

1

1)我没有这方面的经验,但它看起来适合您的用例:

sendfile(2) 是一个系统调用,它提供了一种将数据从一个文件描述符复制到另一个文件描述符(套接字)的“零复制”方式。短语“零复制”指的是两个描述符之间的所有数据复制完全由内核完成,没有将数据复制到用户空间缓冲区中。这在通过套接字(例如 FTP)发送文件时特别有用。

你想什么时候使用它? 基本上任何通过网络发送文件的应用程序都可以利用 sendfile(2)。

2)另一种选择是使用一些 种子库。我最近了解到(关于 torrent 的内容,跳到 31:00)facebook 通过 torrent 分发他们的日常软件更新(并在 15 分钟左右用 1.5GB 二进制文件更新了 1000 台服务器)。

于 2012-04-16T22:38:14.477 回答
0

假设您的机器有 1Gbit 连接。如果你幸运/工作,你将获得 800Mbit/s,复制每个 1GByte 需要大约 10 秒,更新这些机器需要 6-7 分钟。如果这足够好,您唯一需要做的就是有效地使用 1Gbit 来达到该目标(您从当前脚本中看到了什么?好吧 1Gbit 在 WAN 上可能是雄心勃勃的,但您可以进行类似的分析)。多处理在这里可能有帮助,也可能没有帮助……但它不会神奇地为您带来更多带宽。

如果还不够好,我会考虑:

  • 去 P2P(见 miku;s answer),所以只要一台机器有一点数据,它就可以使用它自己的带宽与其他机器共享。这在某种程度上有多大帮助取决于您的网络拓扑(是否存在其他瓶颈点)。

  • 查看多播,如果网络足够在您的控制之下,您可以适当地路由这些东西(这对于 WAN 来说似乎不太可能,但也许有一天在 IPv6 仙境中......)。无需将相同的数据复制 40 次(假设每次都相同),您只需广播一次,然后所有接收器同时接收它。多播 UDP 不可靠(我认为更多用于 IPTV),但已经尝试使用多播技术构建可靠的文件传输工具,例如OpenPGMMS 自己的实现

于 2012-04-18T22:27:46.010 回答