Jaka jest rozsądna wydajność dla prostego poradnika Ansible na ~ 100 hostach?

11

Zaczynamy patrzeć na Ansible, aby zastąpić starą instalację cfengine2. Mam prosty podręcznik, który:

  • kopiuje plik sudoers
  • kopiuje szablon resolv.conf (zasilany danymi group_vars i host_vars)
  • sprawdza, czy działa kilka usług
  • sprawdza obecność lokalnego użytkownika

Playbook zajmuje ponad 4 minuty czasu pracy przy ścianie na 97 maszynach (wszystkie połączone szybką siecią 1 gig lub 10 gig, z opóźnieniem LAN poniżej 1 ms) i zużywa ponad 50% procesora na 2-rdzeniowej pamięci VM 4G, gdy jestem uruchomić to.

Uruchomienie na pojedynczej maszynie zajmuje około 11 sekund, a procesor użytkownika + sys zajmuje około 4 sekund, co nadal wydaje się nieco nadmierne w stosunku do nakładu pracy.

Oczywiste fragmenty:

  • Mam jawnie włączone potokowanie w lokalnym playible-dir lokalnym ansible.cfg
  • Mam włączone buforowanie do pliku json, ten sam lokalny ansible.cfg
  • Mam widelce ustawione na 50, to samo (próbowałem innych wartości)
  • Jestem pewien, że Ansible używa SSH, a nie Paramiko i korzysta z trwałego gniazda kontrolnego - widzę, że procesy SSH są uruchamiane i trwają podczas uruchamiania.

Czy ten poziom wydajności jest normalny, czy coś jest nie tak z moją konfiguracją? Jak mogę ustalić, co jeśli tak?

Edycja: od sierpnia 2017 r. Nadal występuje ten problem. Wersja Ansible to 2.2.1, a rozmiar podręcznika urósł. Aktualne numery:

  • 98 hostów
  • ansible -m ping all trwa 4,6 s, użytkownik 3,2 s, 2,5 s s razy
  • pełne uruchomienie playbooka zajmuje 4 minuty, przy użyciu 100% procesora użytkownika i ~ 35% procesora systemowego (w przypadku 2-rdzeniowego serwera wdrażania VM, 100% to jeden pełny procesor)
  • docelowym systemem operacyjnym jest głównie CentOS 7, niektóre CentOS 6
  • profilowanie nie ujawnia żadnych konkretnych punktów aktywnych zadań AFAICT

Chociaż playbook jest teraz znacznie większy, nadal nie sądzę, aby było w nim coś, co usprawiedliwiałoby ten poziom obciążenia procesora na serwerze playbook - być może czas na wallclock, ale serwer wdrażania powinien być w dużej mierze bezczynny przez większość czasu, o ile widzę, to głównie kopie plików i niektóre rozszerzenia szablonów.

Uwaga: dość szeroko wykorzystujemy zmienne hosta / grupy

Kilka osób pytało o profilowanie, ogon z profilowaniem:

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
użytkownik53814
źródło
4
Wykonaj profilowanie ANSIBLE_CALLBACK_WHITELIST=profile_tasksi do dokładniejszego debugowania za pomocą ANSIBLE_DEBUG=1. Należy również zwrócić szczególną uwagę na początkową szybkość połączenia ssh.
Konstantin Suworow
Zgadzam się z komentarzem @KonstantinSuvorov - w partii może być jeden host, który zajmuje sporo czasu na pewne zadanie. Po wyodrębnieniu zadania za pomocą profile_tasks możesz sprawdzić, czy na hostach wykonujesz tylko te zadania i widzisz, które z nich są najdłuższe. Możesz także uruchomić trywialne zadanie, takie jak „polecenie: w” na wszystkich hostach, aby zobaczyć, że zajmie to oczekiwany czas.
andyhky
1
Sprawdź głód entropii. watch cat /proc/sys/kernel/random/entropy_availpodczas gdy playbook jest uruchomiony. Jeśli jest mniej niż 1000, masz potencjalny problem; jeśli jest mniejsza niż 64 i nie wyzdrowieje, oznacza to, że masz problem z głodem entropijnym. (powszechne w niektórych środowiskach maszyn wirtualnych). Dotyczy to serwera zarządzania, a także zarządzanych węzłów.
Cameron Kerr
Na mojej maszynie zarządzającej z 4 GB pamięci RAM mam widelce = 20, a potokowanie = prawda. ansible -i all all -m pingprzeciwko ponad 300 hostom (głównie maszynom wirtualnym) zajęło mniej niż 1 minutę. Czy Twój poradnik robi coś, aby zmienić użytkownika (zostać / sudo / itp.). Jak działa „-m ping”? Na podstawie doświadczenia powiedziałbym, że chcesz mieć więcej pamięci na 50 widelców.
Cameron Kerr
jaki jest twój docelowy system operacyjny?
xddsg

Odpowiedzi:

1

w twoim ansible.cfgzestawie następujące:

[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

Ponadto w swoim poradniku ustaw strategię jako „bezpłatną”

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

Na koniec wyłącz zbieranie faktów w swojej grze: gather_facts: false

Jeśli po profilowaniu widzisz wiele z nich:

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)

squash te akcje w ansible.cfgramach [defaults]:

na przykład squash_actions = yum,pip,bar

xddsg
źródło
Dziękuję za odpowiedź. Już używamy strategii: bezpłatne i zbieranie faktów Obawiam się, że jest to coś, czego wymagają podręczniki, więc to naprawdę nie działa. Jak zauważono w mojej odpowiedzi, już robię potokowanie.
user53814
@ user53814 przy włączonym profilowaniu, co zajmuje najwięcej czasu? czy możesz zaktualizować swoje pytanie za pomocą wersji ansible, której używasz?
xddsg