¿Cuál es el rendimiento razonable para un simple libro de jugadas Ansible contra ~ 100 hosts?

11

Estamos comenzando a mirar Ansible para reemplazar una instalación antigua de cfengine2. Tengo un libro de jugadas simple que:

  • copia un archivo de sudoers
  • copia un resolv.conf con plantilla (alimentado con datos group_vars y host_vars)
  • comprueba que se están ejecutando un par de servicios
  • comprueba la presencia de un usuario local

El libro de jugadas toma más de 4 minutos de tiempo de reloj de pared para ejecutarse contra 97 máquinas (todas conectadas a través de redes rápidas de 1 o 10 gigas, con latencia LAN inferior a 1 ms) y consume más del 50% de la CPU en la VM de memoria 4G de 2 núcleos cuando estoy ejecutándolo

Se tarda unos 11 segundos en ejecutarse en una sola máquina, con aproximadamente 4 segundos de tiempo de CPU de usuario + sys consumido, lo que TBH todavía parece un poco excesivo para la cantidad de trabajo involucrado.

Los bits obvios:

  • Tengo la canalización explícitamente habilitada en un playbook-dir local ansible.cfg
  • Tengo hecho el almacenamiento en caché a jsonfile habilitado, el mismo ansible.cfg local
  • Tengo tenedores establecidos en 50, igual (he intentado con otros valores)
  • Estoy seguro de que Ansible está usando SSH, no Paramiko, y está usando el zócalo de control persistente: puedo ver que los procesos SSH se inician y persisten durante la ejecución.

¿Es normal este nivel de rendimiento o hay algún problema con mi configuración? ¿Cómo puedo determinar qué, si es así?

Editar: a partir de agosto de 2017, todavía estamos viendo este problema. La versión de Ansible es 2.2.1 y el tamaño del libro de jugadas ha crecido ahora. Números actualizados:

  • 98 anfitriones
  • ansible -m ping all toma 4.6s real, 3.2s usuario, 2.5s sys veces
  • una ejecución completa del libro de jugadas dura 4 minutos, utilizando 100% de usuario y ~ 35% de CPU del sistema mientras lo hace (en un servidor de implementación de VM de 2 núcleos, el 100% es una CPU completa)
  • El sistema operativo objetivo es principalmente CentOS 7, algunos CentOS 6
  • la creación de perfiles no revela ningún hotspots de tareas específicas AFAICT

Aunque el libro de jugadas ahora es mucho más grande, todavía no creo que haya nada allí para justificar ese nivel de carga de la CPU en el servidor del libro de jugadas, tal vez el tiempo de reloj de pared, pero el servidor de implementación debería estar inactivo durante la mayor parte de la ejecución, Por lo que puedo ver, se trata principalmente de copias de archivos y algunas expansiones de plantillas.

Tenga en cuenta que estamos haciendo un uso bastante extenso de host / groupvars

Varias personas han preguntado sobre la creación de perfiles, la cola de una carrera con perfiles:

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
usuario53814
fuente
44
Realice algunos perfiles con ANSIBLE_CALLBACK_WHITELIST=profile_tasksy para una depuración más completa con ANSIBLE_DEBUG=1. También preste mucha atención a la velocidad de conexión ssh inicial.
Konstantin Suvorov
De acuerdo con el comentario de @KonstantinSuvorov: podría haber un solo host en el lote que está tomando un tiempo considerable en una tarea determinada. Una vez que aísle la tarea con profile_tasks, puede examinar la ejecución de esas tareas en sus hosts y ver cuál es la tarea más larga. También puede ejecutar una tarea trivial, como "command: w" contra todos los hosts para ver que lleva una cantidad de tiempo esperada.
andyhky
1
Comprobar el hambre de entropía. watch cat /proc/sys/kernel/random/entropy_availmientras se ejecuta el libro de jugadas. Si es menos de 1000, tienes un problema potencial; si es menor que 64 y no se recupera, entonces tiene un problema definido de inanición por entropía. (Común en algunos entornos de VM). Esto se aplica a su servidor de administración y también a los nodos que está administrando.
Cameron Kerr
En mi VM de gestión con 4 GB de RAM, tengo tenedores = 20 y canalización = Verdadero. ansible -i all all -m pingcontra más de 300 hosts (en su mayoría máquinas virtuales) tardó menos de 1 minuto. ¿Su libro de jugadas está haciendo algo para cambiar de usuario (convertirse en / sudo / etc.). ¿Cómo funciona '-m ping'? Según la experiencia, diría que desea tener más memoria para 50 tenedores.
Cameron Kerr
¿Cuál es su sistema operativo de destino?
xddsg

Respuestas:

1

en su ansible.cfgconjunto lo siguiente:

[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

Además, en su libro de jugadas, establezca la estrategia como 'gratuita'

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

Finalmente, deshabilita la recopilación de datos en tu juego: gather_facts: false

Si, después del perfil, está viendo mucho de esto:

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)

aplastar esas acciones en ansible.cfg[valores predeterminados]:

p.ej squash_actions = yum,pip,bar

xddsg
fuente
Gracias por la respuesta. Ya estamos usando la estrategia: me temo que la recopilación de datos y gratuita es algo que requieren los libros de jugadas, por lo que realmente no funciona. Como se señaló en mi respuesta, ya estoy haciendo ductos.
user53814
@ user53814 con la creación de perfiles activada, ¿qué demora más? ¿Puedes actualizar tu pregunta con la versión de ansible que estás usando?
xddsg