做运维的同学很多都用过ansible吧,开源批量部署工具排名前三的:puppet, saltstack, ansible。

ansible的特点是没有agent,采用ssh协议来通讯,轻量级,采用python编写,既可以写playbook,也可以做一些ad-hoc的批量命令执行操作。

最近在两台ansible主机上执行ansible命令时发现对同样的客户机执行同样的命令,所用的时间相差却很大,两台ansible主机配置性能都一样。我感到很奇怪,于是想一探究竟。

当然首先是用time命令来查看准确的时间消耗。

Result: on host1 
real 150.42 
user 27.80 
sys 11.97

Result on host2
real 59.40
user 31.80 
sys 12.96

从real time可以看出,差了将近3倍。

用top看机器的cpu和memory都比较空,于是想到有没有可能是IO的问题,用如下命令查看

iostat -x 5 3 

发现IO占用也很小,于是又想会不会是谁调整了系统参数导致的问题,于是用time命令输出很多详细参数

/usr/bin/time -f 'Number of waits %w \nNumber of file system inputs by the process %I \nNumber of file system outputs by the process %O \nNumber of socket messages received by the process %r \nNumber of socket messages sent by the process %s \nSystem’s page size %Z \nPercentage of the CPU that this job got %P \nAverage total (data+stack+text) memory use of the process, in Kbytes %K \nMaximum resident set size of the process during its lifetime, in Kbytes %M \nNumber of major page faults that occurred while the process was running %F \nNumber of times the process was swapped out of main memory %W \nreal %e \nuser %U \nsys %S \n'  ansible -i hosts/cluster regionservers -kK -U root -u username -m command -a "uptime" -f 100


对比之后发现也没有大问题,最后把目光聚焦到ansible本身身上。

查看ansible配置文件/etc/ansible/ansible.cfg,对比后发现有一行被注视掉了

host_key_checking = False

修改后,在跑ansible命令,速度起来了!

至此问题解决。

本文提供一个解决问题的一般性思路,当然,这里面还有可能是网络,一步一步的排查。

大家有什么问题可以留言讨论。