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
watch cat /proc/sys/kernel/random/entropy_avail
mentre 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.
ansible -i all all -m ping
contro 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.
ANSIBLE_CALLBACK_WHITELIST=profile_tasks
e per un debug più approfondito conANSIBLE_DEBUG=1
. Prestare anche molta attenzione alla velocità iniziale della connessione ssh.