Qual è la prestazione ragionevole per un semplice playbook Ansible contro ~ 100 host?


11

Stiamo iniziando a esaminare Ansible per sostituire una vecchia installazione di cfengine2. Ho un semplice playbook che:

  • copia un file sudoers
  • copia un resolv.conf con template (alimentato con i dati group_vars e host_vars)
  • controlla un paio di servizi in esecuzione
  • verifica la presenza di un utente locale

Il playbook impiega oltre 4 minuti di wallclock per funzionare su 97 macchine (tutte connesse su reti veloci da 1gig o 10gig, con latenza LAN inferiore a 1ms) e consuma oltre il 50% della CPU sulla VM con memoria 4G a 2 core quando sono eseguendolo.

Sono necessari circa 11 secondi per l'esecuzione su una singola macchina, con circa 4 secondi di tempo CPU utente + sys consumato, che TBH sembra ancora un po 'eccessivo per la quantità di lavoro coinvolto.

I bit ovvi:

  • Ho il pipeline esplicitamente abilitato in una directory di playbook-ans local.cfg
  • Ho infatti abilitato la memorizzazione nella cache di jsonfile, lo stesso ansible.cfg locale
  • Ho le forche impostate su 50, uguale (ho provato altri valori)
  • Sono sicuro che Ansible sta usando SSH non Paramiko e sta usando il socket di controllo persistente: vedo che i processi SSH vengono avviati e persistono durante l'esecuzione.

Questo livello di prestazioni è normale o c'è qualcosa che non va nella mia configurazione? Come posso fare per determinare cosa, in caso affermativo?

Modifica: da agosto 2017, stiamo ancora riscontrando questo problema. La versione di Ansible è 2.2.1 e la dimensione del playbook è cresciuta ora. Numeri aggiornati:

  • 98 host
  • ansible -m ping all richiede 4.6s reali, 3.2s user, 2.5s sys volte
  • l'esecuzione di un playbook completo richiede 4 minuti, utilizzando 100% utente e ~ 35% CPU di sistema mentre lo fa (su un server di distribuzione VM a 2 core, il 100% è una CPU completa)
  • il sistema operativo di destinazione è in gran parte CentOS 7, alcuni CentOS 6
  • la profilazione non rivela alcun hotspot specifico dell'attività AFAICT

Sebbene il playbook sia ora molto più grande, non penso ancora che ci sia qualcosa per giustificare quel livello di carico della CPU sul server del playbook - forse il tempo di wallclock, ma il server di distribuzione dovrebbe essere in gran parte inattivo per la maggior parte della corsa, per quanto posso vedere, sono principalmente copie di file e alcune espansioni di modelli.

Nota che stiamo facendo un uso piuttosto esteso di host / groupvars

Diverse persone hanno chiesto informazioni sulla profilazione, coda di una corsa con profilazione:

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

4
Crea un profilo con ANSIBLE_CALLBACK_WHITELIST=profile_taskse per un debug più approfondito con ANSIBLE_DEBUG=1. Prestare anche molta attenzione alla velocità iniziale della connessione ssh.
Konstantin Suvorov,

Concordo con il commento di @KonstantinSuvorov: potrebbe esserci un singolo host nel lotto che sta impiegando molto tempo su un determinato compito. Dopo aver isolato l'attività con profile_tasks, puoi esaminare l'esecuzione di quelle attività sui tuoi host e vedere quale delle attività è la più lunga. Puoi anche eseguire un'attività banale, come "command: w" contro tutti gli host per vedere che ci vuole un tempo previsto.
Andyhky,

1
Controlla la fame entropica. watch cat /proc/sys/kernel/random/entropy_availmentre il playbook è in esecuzione. Se è inferiore a dire 1000 hai un potenziale problema; se è inferiore a 64 e non si ripristina, allora hai un problema di fame nell'entropia definito. (comune in alcuni ambienti VM). Questo vale per il tuo server di gestione e anche per i nodi che gestisci.
Cameron Kerr,

Nella mia VM di gestione con 4 GB di RAM, ho forchette = 20 e pipelining = True. ansible -i all all -m pingcontro oltre 300 host (principalmente macchine virtuali) ha impiegato meno di 1 minuto. Il tuo playbook sta facendo qualcosa per cambiare utente (diventare / sudo / ecc.). Come si comporta '-m ping'? Direi, in base all'esperienza, dire che vuoi avere più memoria per 50 forchette.
Cameron Kerr,

qual è il tuo sistema operativo di destinazione?
xddsg,

Risposte:


1

nel tuo ansible.cfgset quanto segue:

[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

Inoltre, nel tuo playbook, imposta la strategia come "gratuita"

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

Infine, disabilita la raccolta dei fatti sul tuo gioco: gather_facts: false

Se, dopo la profilazione, stai vedendo molto di questo:

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)

schiaccia quelle azioni in ansible.cfg[default]:

per esempio squash_actions = yum,pip,bar


Grazie per la risposta. Stiamo già usando la strategia: la raccolta dei fatti gratuita e temo sia qualcosa che i playbook richiedono, quindi non funziona davvero. Come notato nella mia risposta, sto già facendo pipeline.
user53814,

@ user53814 con la profilazione attivata, che cosa richiede più tempo? puoi aggiornare la tua domanda con la versione di ansible che stai utilizzando?
xddsg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.