Какова разумная производительность для простого плейбука Ansible против ~100 хостов?
Мы начинаем смотреть на Ansible, чтобы заменить старую установку cfengine2. У меня есть простая пьеса, которая:
- копирует файл sudoers
- копирует шаблонный resolv.conf (снабженный данными group_vars и host_vars)
- проверяет пару сервисов работает
- проверяет наличие локального пользователя
Воспроизведение книги занимает более 4 минут в режиме настенного часового времени, чтобы работать с 97 компьютерами (все подключены через быструю 1-гигабитную или 10-гигабитную сеть, с задержкой локальной сети менее 1 мс) и потребляет более 50% ЦП на двухъядерной виртуальной памяти 4G с памятью, когда я запустить его.
Работа с одной машиной занимает около 11 секунд, при этом около 4 секунд затрачивается ЦП user+sys, что TBH все равно кажется чрезмерным для объема выполняемой работы.
Очевидные биты:
- У меня явно включен конвейер в playbook-dir local ansible.cfg
- У меня есть факт кэширования в jsonfile, тот же локальный ansible.cfg
- У меня есть вилки 50, то же самое (я пробовал другие значения)
- Я уверен, что Ansible использует SSH, а не Paramiko, и использует постоянный сокет управления - я вижу, как SSH-процессы запускаются и сохраняются во время выполнения.
Этот уровень производительности нормальный или что-то не так с моими настройками? Как я могу определить, что, если так?
Изменить: По состоянию на август 2017 года, мы все еще видим эту проблему. Ansible версия 2.2.1 и размер playbook выросла. Современные номера:
- 98 хозяев
ansible -m ping all
занимает 4,6 с реальным, 3, 2 с пользователем, 2,5 с системным разом- полный запуск playbook занимает 4 минуты, используя при этом 100% пользовательский и ~35% системный процессор (на сервере развертывания 2-ядерных виртуальных машин, 100% - один полный процессор)
- Целевая ОС в основном CentOS 7, некоторые CentOS 6
- профилирование не выявляет какие-либо специфические горячие точки задачи AFAICT
Хотя playbook теперь намного больше, я все еще не думаю, что есть что-то, что могло бы оправдать такой уровень загрузки процессора на сервере playbook - возможно, время настенного таймера, но сервер развертывания должен быть в основном простаивающим для большей части запуска, насколько я вижу, это в основном копии файлов и некоторые расширения шаблонов.
Обратите внимание, что мы довольно широко используем host / groupvars
Несколько человек спрашивали о профилировании, хвосте пробега с профилированием:
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
1 ответ
В вашем ansible.cfg
установить следующее:
[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
Кроме того, в вашей игровой книге, установите стратегию "бесплатно"
- hosts: all
strategy: free
tasks: [...]
Наконец, отключите сбор фактов в вашей игре: gather_facts: false
Если после профилирования вы видите многое из этого:
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)
раздавить эти действия в ansible.cfg
ниже [по умолчанию]:
например squash_actions = yum,pip,bar