From 7b93d6e31b8c0e322f1efa35c4be30137834212a Mon Sep 17 00:00:00 2001 From: Jordan Borean Date: Tue, 9 Oct 2018 12:18:49 +1000 Subject: [PATCH] ansible-test: set ulimit to enforce consistent test environment (#46652) * ansible-test: set ulimit to enforce consistent test environment * fixed santiy issue (cherry picked from commit 7b774117ab7504c72a583b3aae576933c78411d7) --- test/runner/injector/injector.py | 12 ++++++++++++ test/runner/lib/cli.py | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/test/runner/injector/injector.py b/test/runner/injector/injector.py index b78f13b06d7..65e8e1e219b 100755 --- a/test/runner/injector/injector.py +++ b/test/runner/injector/injector.py @@ -32,6 +32,7 @@ import sys import pipes import logging import getpass +import resource logger = logging.getLogger('injector') # pylint: disable=locally-disabled, invalid-name # pylint: disable=locally-disabled, invalid-name @@ -90,6 +91,17 @@ def main(): try: logger.debug('Self: %s', __file__) + # to achieve a consistent nofile ulimit, set to 16k here, this can affect performance in subprocess.Popen when + # being called with close_fds=True on Python (8x the time on some environments) + nofile_limit = 16 * 1024 + current_limit = resource.getrlimit(resource.RLIMIT_NOFILE) + new_limit = (nofile_limit, nofile_limit) + if current_limit > new_limit: + logger.debug('RLIMIT_NOFILE: %s -> %s', current_limit, new_limit) + resource.setrlimit(resource.RLIMIT_NOFILE, (nofile_limit, nofile_limit)) + else: + logger.debug('RLIMIT_NOFILE: %s', current_limit) + config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'injector.json') try: diff --git a/test/runner/lib/cli.py b/test/runner/lib/cli.py index b77e1af10c6..3d23a1673f6 100644 --- a/test/runner/lib/cli.py +++ b/test/runner/lib/cli.py @@ -4,6 +4,7 @@ from __future__ import absolute_import, print_function import errno import os +import resource import sys from lib.util import ( @@ -84,6 +85,17 @@ def main(): display.info_stderr = (isinstance(config, SanityConfig) and config.lint) or (isinstance(config, IntegrationConfig) and config.list_targets) check_startup() + # to achieve a consistent nofile ulimit, set to 16k here, this can affect performance in subprocess.Popen when + # being called with close_fds=True on Python (8x the time on some environments) + nofile_limit = 16 * 1024 + current_limit = resource.getrlimit(resource.RLIMIT_NOFILE) + new_limit = (nofile_limit, nofile_limit) + if current_limit > new_limit: + display.info('RLIMIT_NOFILE: %s -> %s' % (current_limit, new_limit), verbosity=2) + resource.setrlimit(resource.RLIMIT_NOFILE, (nofile_limit, nofile_limit)) + else: + display.info('RLIMIT_NOFILE: %s' % (current_limit, ), verbosity=2) + try: args.func(config) except Delegate as ex: