Как сократить время на настройку производительности playbook
Я работаю над настройкой производительности ANSIB со следующей записью.
---
# simplespeedtest.yml
- hosts: localhost
connection: local
gather_facts: false
tasks:
- command: echo 1
- command: echo 2
- command: echo 30
Я протестировал время выполнения playbook и каждую задачу в playbook с помощью модулей tasts_profile, результат следующий:
# time $ANSIBLE_HOME/bin/ansible-playbook -i hosts simplespeed_localhost.yml
PLAY [localhost] ********************************************************************************
TASK [command] ********************************************************************************
Thursday 11 January 2018 15:29:45 +0800 (0:00:00.091) 0:00:00.091 ******
changed: [localhost]
TASK [command] ********************************************************************************
Thursday 11 January 2018 15:29:45 +0800 (0:00:00.316) 0:00:00.407 ******
changed: [localhost]
TASK [command] ********************************************************************************
Thursday 11 January 2018 15:29:46 +0800 (0:00:00.205) 0:00:00.613 ******
changed: [localhost]
PLAY RECAP ********************************************************************************
localhost : ok=3 changed=3 unreachable=0 failed=0
Thursday 11 January 2018 15:29:46 +0800 (0:00:00.187) 0:00:00.800 ******
===============================================================================
command ---------------------------------- 0.32s
command ----------------------------------- 0.21s
command ----------------------------------- 0.19s
Playbook run took 0 days, 0 hours, 0 minutes, 0 seconds
real 0m1.894s
user 0m1.652s
sys 0m0.220s
и общее время выполнения задачи составляет 0,72 с, но общее время выполнения книги воспроизведения составляет 1,889 с, что больше общего времени выполнения задачи. Я хочу знать, как сократить это время. Запустив следующую команду:
time python -m cProfile -o test1.out -s time $ANSIBLE_HOME/bin/ansible-playbook -i hosts simplespeed_localhost.yml
Я получил файл python cprofile
ncalls tottime percall cumtime percall filename:lineno(function)
633 0.673 0.001 0.673 0.001 {time.sleep}
34730 0.072 0.000 0.076 0.000 /usr/local/lib/python2.7/dist-packages/yaml/reader.py:99(forward)
3597 0.069 0.000 0.213 0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:1272(scan_plain)
63467 0.058 0.000 0.128 0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:142(need_more_tokens)
38543 0.051 0.000 0.585 0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:113(check_token)
66812 0.046 0.000 0.055 0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:276(stale_possible_simple_keys)
153 0.042 0.000 0.093 0.001 /usr/lib/python2.7/ConfigParser.py:464(_read)
46 0.040 0.001 0.040 0.001 {compile}
162917 0.039 0.000 0.040 0.000 /usr/local/lib/python2.7/dist-packages/yaml/reader.py:87(peek)
22624 0.032 0.000 0.032 0.000 /usr/local/lib/python2.7/dist-packages/yaml/error.py:6(__init__)
4981 0.031 0.000 0.150 0.000 /usr/local/lib/python2.7/dist-packages/yaml/parser.py:273(parse_node)
967/207 0.030 0.000 0.089 0.000 /usr/lib/python2.7/sre_parse.py:379(_parse)
7649 0.028 0.000 0.428 0.000 /usr/local/lib/python2.7/dist-packages/yaml/scanner.py:153(fetch_more_tokens)
101 0.026 0.000 0.026 0.000 {method 'read' of 'file' objects}
22624 0.026 0.000 0.058 0.000 /usr/local/lib/python2.7/dist-packages/yaml/reader.py:114(get_mark)
100506 0.025 0.000 0.029 0.000 {isinstance}
и вызов времени {time.sleep} равен 0,673 с, и я хочу знать, какой процесс ansible будет вызывать {time.sleep}, и как его уменьшить
PS: я получил 3 позы вызова {time.sleep} из ANSIBLE исходного кода в./lib/ansible/executor/task_executor.py и изменить аргумент, но, кажется, не работают
1 ответ
Вам нужно более тщательно продумать задачу, которую вы пытаетесь выполнить. Простая книга с простыми задачами и без SSH-соединений не будет представлять реальную производительность реальной сборочной книги, поэтому любые результаты профилирования, которые вы можете получить, будут довольно бессмысленными.
Кроме того, задачи Ansible выполняются удаленно на целевом компьютере (или для локальных задач, выполняемых в дочернем процессе). Это означает, что профиль не сможет измерить фактический исполняемый код модуля. Так просто работает ansible-playbook
через профилировщик не собирается показывать полную историю.
С учетом сказанного, давайте попробуем получить больше информации от профилировщика. Вы можете сгенерировать граф вызовов из вывода профиля, используя gprof2dot
, как подробно здесь. График будет раскрашен в зависимости от времени, потраченного на каждую функцию.
Вот как выглядит этот график, когда я запустил книгу на своем компьютере. Это может выглядеть по-разному в зависимости от характеристик вашей системы:
Глядя на график, мы видим, что time.sleep()
вызывается из ansible.plugins.strategy.__init__.py
модуль. Из кода видно, что спящий режим происходит, пока ansible ожидает выполнения задач. Вы можете изменить интервал опроса в файле конфигурации, но по умолчанию это 0,001 секунды, что уже довольно быстро. Вряд ли изменение этого будет иметь существенное значение.
Подвести итоги:
- Вам нужен более реалистичный учебник для эффективного бенчмаркинга
- Данные профилировщика ограничены из-за удаленного выполнения задачи
- Изменение интервала сна не приведет к значительному улучшению производительности
Вот некоторые предложения, связанные с производительностью от команды Ansible, которые могут быть полезны: