对于大约 100 个主机来说,简单的 Ansible 剧本的合理性能是什么?

对于大约 100 个主机来说,简单的 Ansible 剧本的合理性能是什么?

我们开始考虑使用 Ansible 来替换旧的 cfengine2 安装。我有一个简单的剧本:

  • 复制 sudoers 文件
  • 复制模板化的 resolv.conf(包含 group_vars 和 host_vars 数据)
  • 检查一些服务是否正在运行
  • 检查本地用户是否存在

该剧本花费了超过 4 分钟的挂钟时间在 97 台机器上运行(所有机器都通过快速的 1gig 或 10gig 网络连接,LAN 延迟低于 1ms),并且在我运行它时消耗了 2 核 4G 内存虚拟机上超过 50% 的 CPU。

在单台机器上运行大约需要 11 秒,其中消耗用户+系统 CPU 时间大约为 4 秒,老实说,这对于所涉及的工作量来说似乎还是有点过多。

显而易见的是:

  • 我在 playbook-dir local ansible.cfg 中明确启用了管道
  • 我已启用事实缓存到 jsonfile,相同的本地 ansible.cfg
  • 我将 forks 设置为 50,同样(我尝试过其他值)
  • 我确信 Ansible 使用的是 SSH 而不是 Paramiko,并且它使用的是持久控制套接字——我可以看到 SSH 进程在运行期间启动并持续存在。

这种性能水平是否正常,还是我的设置有问题?如果是,我该如何确定?

编辑:截至 2017 年 8 月,我们仍然看到这个问题。Ansible 版本是 2.2.1,剧本大小现在已经增加。最新数字:

  • 98 位主机
  • ansible -m ping all实际耗时 4.6 秒,用户耗时 3.2 秒,系统耗时 2.5 秒
  • 完整的剧本运行需要 4 分钟,同时使用 100% 的用户 CPU 和约 35% 的系统 CPU(在 2 核 VM 部署服务器上,100% 表示一个完整的 CPU)
  • 目标操作系统主要是 CentOS 7,一些 CentOS 6
  • 据我所知,分析并未揭示任何特定的任务热点

尽管剧本现在大得多,但我仍然认为其中没有任何东西可以证明剧本服务器上的 CPU 负载水平是合理的 - 也许是挂钟时间,但部署服务器在运行的大部分时间内应该处于空闲状态,据我所知,它主要是文件复制和一些模板扩展。

请注意,我们大量使用了 host/groupvars

有几个人询问有关性能分析以及运行结束时的性能分析的问题:

Tuesday 01 August 2017  16:02:24 +0100 (0:00:00.539)       0:06:22.991 ******** 
=============================================================================== 
yumrepo : centos repos -------------------------------------------------- 9.77s
sshd : copy CentOS 6 sshd config ---------------------------------------- 7.41s
sshd : copy CentOS 7 sshd config ---------------------------------------- 6.94s
core : ensure core packages are present --------------------------------- 6.28s
core : remove packages on VM guests ------------------------------------- 5.39s
resolv : stop NetworkManager changing resolv.conf ----------------------- 5.25s
yumrepo : epel6 gpg key ------------------------------------------------- 3.94s
yumrepo : epel7 gpg key ------------------------------------------------- 3.71s
yumrepo : nsg gpg key --------------------------------------------------- 3.57s
resolv : build resolv.conf ---------------------------------------------- 3.30s
yumrepo : nsg repo ------------------------------------------------------ 2.66s
resolv : check NetworkManager running ----------------------------------- 2.63s
yumrepo : psp repo ------------------------------------------------------ 2.62s
yumrepo : ucs repo ------------------------------------------------------ 2.44s
yumrepo : epel repo ----------------------------------------------------- 2.27s
resolv : check for nmcli ------------------------------------------------ 2.08s
core : remove various unwanted files ------------------------------------ 1.42s
telegraf : write telegraf.conf file ------------------------------------- 1.13s
core : copy sudoers in place -------------------------------------------- 0.94s
core : ensure sshd is running ------------------------------------------- 0.90s

答案1

在您的ansible.cfg设置中:

[defaults]

# profile each task
callback_whitelist = profile_tasks

# [don't validate host keys](http://docs.ansible.com/ansible/intro_configuration.html#host-key-checking)
host_key_checking = False

[ssh_connection]
pipelining = True

另外,在你的剧本中,将策略设置为“免费”

- hosts: all
  strategy: free
  tasks: [...]

最后,禁用游戏中的事实收集:gather_facts: false

如果在分析之后,你看到很多这样的情况:

TASK [pip foo]
ok: [10.192.197.252] => (item=ansible)
ok: [10.192.197.252] => (item=boto)
ok: [10.192.197.252] => (item=boto3)
ok: [10.192.197.252] => (item=passlib)
ok: [10.192.197.252] => (item=cryptography)

ansible.cfg在[默认值]下压缩这些操作:

例如squash_actions = yum,pip,bar

相关内容