From 3c9966d6fca902baa1fbccd02f99f3e6a156ed05 Mon Sep 17 00:00:00 2001 From: Pavlo Shchelokovskyy Date: Thu, 6 Oct 2016 22:30:20 +0300 Subject: [PATCH] Make interprocess polling interval configurable (#16560) As recently there was back-and-forth with this hardcoded value (0.001 -> 0.01 -> 0.005), obviousely the optimal value for it depends on Ansible usage scanario and is better to be configurable. This patch adds a new config option in DEFAULT section, `internal_poll_interval`, with default of 0.001 corresponding to the value hardcoded in Ansible v2.1. This config option is then used instead of hardcoded values where needed. Related GH issue: 14219 (cherry picked from commit aa1ec8af17dc90f20079252010d6a4f93fde4b35) --- docsite/rst/intro_configuration.rst | 14 ++++++++++++++ lib/ansible/constants.py | 3 ++- lib/ansible/plugins/strategy/__init__.py | 3 ++- lib/ansible/plugins/strategy/free.py | 3 ++- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/docsite/rst/intro_configuration.rst b/docsite/rst/intro_configuration.rst index 68a92abed52..e719337f2a1 100644 --- a/docsite/rst/intro_configuration.rst +++ b/docsite/rst/intro_configuration.rst @@ -443,6 +443,20 @@ implications and wish to disable it, you may do so here by setting the value to host_key_checking=True +.. _internal_poll_interval: + +internal_poll_interval +====================== + +.. versionadded:: 2.2 + +This sets the interval (in seconds) of Ansible internal processes polling each other. +Lower values improve performance with large playbooks at the expense of extra CPU load. +Higher values are more suitable for Ansible usage in automation scenarios, when UI responsiveness is not required but CPU usage might be a concern. +Default corresponds to the value hardcoded in Ansible ≤ 2.1:: + + internal_poll_interval=0.001 + .. _inventory_file: inventory diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py index 9a7971dbd70..58c281bbc90 100644 --- a/lib/ansible/constants.py +++ b/lib/ansible/constants.py @@ -146,7 +146,7 @@ DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'd DEFAULTS='defaults' # FIXME: add deprecation warning when these get set -#### DEPRECATED VARS #### +#### DEPRECATED VARS #### # use more sanely named 'inventory' DEPRECATED_HOST_LIST = get_config(p, DEFAULTS, 'hostfile', 'ANSIBLE_HOSTS', '/etc/ansible/hosts', ispath=True) # this is not used since 0.5 but people might still have in config @@ -190,6 +190,7 @@ DEFAULT_LOG_PATH = get_config(p, DEFAULTS, 'log_path', 'ANSIB DEFAULT_FORCE_HANDLERS = get_config(p, DEFAULTS, 'force_handlers', 'ANSIBLE_FORCE_HANDLERS', False, boolean=True) DEFAULT_INVENTORY_IGNORE = get_config(p, DEFAULTS, 'inventory_ignore_extensions', 'ANSIBLE_INVENTORY_IGNORE', ["~", ".orig", ".bak", ".ini", ".cfg", ".retry", ".pyc", ".pyo"], islist=True) DEFAULT_VAR_COMPRESSION_LEVEL = get_config(p, DEFAULTS, 'var_compression_level', 'ANSIBLE_VAR_COMPRESSION_LEVEL', 0, integer=True) +DEFAULT_INTERNAL_POLL_INTERVAL = get_config(p, DEFAULTS, 'internal_poll_interval', None, 0.001, floating=True) # static includes DEFAULT_TASK_INCLUDES_STATIC = get_config(p, DEFAULTS, 'task_includes_static', 'ANSIBLE_TASK_INCLUDES_STATIC', False, boolean=True) diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py index 5944e5bc034..79c0ccf16f0 100644 --- a/lib/ansible/plugins/strategy/__init__.py +++ b/lib/ansible/plugins/strategy/__init__.py @@ -26,6 +26,7 @@ from collections import deque from multiprocessing import Lock from jinja2.exceptions import UndefinedError +from ansible import constants as C from ansible.compat.six.moves import queue as Queue from ansible.compat.six import iteritems, string_types from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable @@ -530,7 +531,7 @@ class StrategyBase: results = self._process_pending_results(iterator) ret_results.extend(results) if self._pending_results > 0: - time.sleep(0.001) + time.sleep(C.DEFAULT_INTERNAL_POLL_INTERVAL) display.debug("no more pending results, returning what we have") diff --git a/lib/ansible/plugins/strategy/free.py b/lib/ansible/plugins/strategy/free.py index 7f92de60ac1..45e417a23ec 100644 --- a/lib/ansible/plugins/strategy/free.py +++ b/lib/ansible/plugins/strategy/free.py @@ -21,6 +21,7 @@ __metaclass__ = type import time +from ansible import constants as C from ansible.errors import AnsibleError from ansible.playbook.included_file import IncludedFile from ansible.plugins import action_loader @@ -202,7 +203,7 @@ class StrategyModule(StrategyBase): display.debug("done adding collected blocks to iterator") # pause briefly so we don't spin lock - time.sleep(0.001) + time.sleep(C.DEFAULT_INTERNAL_POLL_INTERVAL) # collect all the final results results = self._wait_on_pending_results(iterator)