我在不同的数据中心有一个 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关于在目标目录中拥有更多文件。
问候!