我们开始考虑用Ansible替换旧的cfengine2安装。我有一本简单的剧本:
- 复制一个sudoers文件
- 复制模板化的resolv.conf(由group_vars和host_vars数据提供)
- 检查几个服务是否正在运行
- 检查本地用户的存在
该剧本需要4分钟的挂钟时间才能在97台计算机上运行(所有设备都通过1gig或10gig快速网络连接,LAN延迟不到1ms),并且在使用2核4G内存VM时消耗了50%以上的CPU运行它。
在单台计算机上运行大约需要11秒钟,而用户+系统的CPU时间消耗了大约4秒钟,对于所涉及的工作量来说,TBH似乎仍然有些多余。
明显的位:
- 我在playbook-dir本地ansible.cfg中显式启用了管道
- 我实际上已启用对jsonfile的缓存,相同的本地ansible.cfg
- 我将叉子设置为50,相同(我尝试了其他值)
- 我确定Ansible使用的是SSH,而不是Paramiko,并且使用的是持久控制套接字-我可以看到SSH进程正在启动并在运行过程中持久存在。
这种性能水平正常吗?或者我的设置有问题吗?如果可以,我该如何确定呢?
编辑:截至2017年8月,我们仍然看到此问题。Ansible版本为2.2.1,并且剧本的大小现已增加。最新数字:
- 98位房东
ansible -m ping all
实际需要4.6秒,用户需要3.2秒,系统时间为2.5秒- 完整的剧本运行需要4分钟,同时使用100%的用户和约35%的系统CPU(在2核VM部署服务器上,其中100%是一个完整的CPU)
- 目标操作系统主要是CentOS 7,有些是CentOS 6
- 分析没有显示任何特定的任务热点AFAICT
尽管剧本现在更大了,但我仍然认为其中没有任何东西可以证明剧本服务器上的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
同意@KonstantinSuvorov的评论-可能有很多主机在某个任务上花费大量时间。使用profile_tasks隔离任务后,您可以检查在主机上仅运行那些任务,并查看最长的任务。您还可以对所有主机运行一个琐碎的任务,例如“ command:w”,以查看它花费了预期的时间。
—
andyhky
检查熵饥饿。
—
卡梅隆·克尔
watch cat /proc/sys/kernel/random/entropy_avail
当剧本正在运行时。如果小于1000,则可能存在问题。如果它的值小于64并且无法恢复,则说明您存在绝对的饥饿问题。(在某些VM环境中很常见)。这适用于您的管理服务器以及您要管理的节点。
在具有4GB RAM的管理VM上,我的forks = 20,流水线设置为True。
—
卡梅隆·克尔
ansible -i all all -m ping
针对300多个主机(主要是VM)进行的操作不到1分钟。您的剧本是否正在做任何更改用户的操作(变成/ sudo /等等)。“ -m ping”的性能如何?根据经验,我想说您希望有更多的存储空间来存储50个分叉。
您的目标操作系统是什么?
—
xddsg
ANSIBLE_CALLBACK_WHITELIST=profile_tasks
进行概要分析,并进行更彻底的调试ANSIBLE_DEBUG=1
。还要注意初始的ssh连接速度。