Puppet 文件传输缓慢

Puppet 文件传输缓慢

我在不同的数据中心有一个 Puppet Master 和多个 Slave。它们之间的延迟约为 40 毫秒。当我在 Slave 上运行“puppet agent --test”以应用最新清单时,需要大约 360 秒才能完成。

经过一番调查,我发现导致速度变慢的主要原因是文件传输。传输每个文件似乎需要大约 10 秒钟。这些文件很小(配置文件),所以我不明白为什么它们会花这么长时间。

这是我的清单中的一个文件示例:

file { "/etc/rsyncd.conf" :
    owner       => "root",
    group       => "root",
    mode        => 644,
    source  => "puppet:///files/rsyncd/rsyncd.conf"
}

运行 puppet-profiler 我看到了这个:

10.21s - File[/etc/rsyncd.conf]

似乎我无法使用 puppet 同时更新多个服务器。如果我同时运行两个服务器,那么 puppet 需要两倍的时间。

我已经将 puppet master 从使用 webrick 改为使用 mongrel,但这似乎没有帮助。这使得部署更改变得很痛苦。一个简单的配置更改可能需要一个小时才能推广到所有服务器。

答案1

免责声明:我是 Puppet 开发人员之一。

当您使用puppet://URL 获取文件时,Puppet 将与文件服务器建立两个 SSL 连接 - 一个用于元数据(包括校验和),另一个用于内容。希望如预期的那样,只有当磁盘上的内容过期时才会建立第二个连接。

传输本身是标准 HTTPS,没有任何花哨的功能,因此除了 SSL 开销和两个连接的延迟成本之外,Puppet 没有理由这么慢。

在检查文件是否最新时,Puppet 还会在客户端和服务器端对文件进行校验。如果您的备份存储也很慢,那么这可能会很慢。

最后,您应该检查您的网络链接是否因为饱和或类似原因而变慢。这不是第一次大缓冲区导致糟糕的网络性能 - 有人在中间放置了一个流量整形器,使 ping 速度超快。;)

除此之外,我建议你提交错误报告。包括详细信息和网络跟踪,将对我们解决这个问题有很大帮助。

您所描述的情况肯定是不正常的,而且这也不是我们期望看到的,因为在一个相当快的网络上,小型配置文件会出现这种情况。(而且,这也不是其他人看到的,所以很明显您的设置中发生了一些不寻常的事情。)

答案2

根据我的经验,旧版本的 puppet 会在来回传输文件数据时对所有文件数据进行序列化和反序列化。在传输大型(数兆字节)二进制文件时,这种情况尤其糟糕。

皮特曼先生在上面指出,情况可能不再如此,但您可能需要深入挖掘,看看您正在运行的 Puppet 版本是否进行了这种优化。

看起来这个变化发生在 puppet 0.25 中 - 参见 bug 583 (http://projects.puppetlabs.com/issues/583) 当他们从 xlrpc 转换为 rest 时。

我当时的解决方案是使用 puppet 推送 rsync 预共享密钥,并使用 rsync 守护进程向最终客户端提供文件(只读)。Rsync 非常高效,可以传输和更新大量二进制数据。

因此请检查你的 puppet 版本,同时也看看 rsync 是否可以为你提供性能比较。

答案3

我找到了问题。虽然我设置了 Apache 以通过 Passenger 运行 puppetmaster,但配置文件从未包含在我的 httpd.conf 中。我的 puppetmaster 仍在运行默认设置。(netstat -anp | grep 8140 显示 apache 没有使用此端口)。

修复这些问题并确保 Apache 在 8140 上监听后,我的 puppet 客户端现在运行时间从 380 秒减少到 8 秒。

答案4

查看我留下的评论http://projects.puppetlabs.com/issues/3365关于在目标目录中拥有更多文件。

问候!

相关内容