From ba2c44ef000221f8a18274a9569838d8c26014c0 Mon Sep 17 00:00:00 2001 From: armando-migliaccio Date: Fri, 12 Jun 2015 08:58:05 -0700 Subject: [PATCH] Revert "Revert "Set default of api_workers to number of CPUs"" This reverts commit 12a564cf03e612dda36df26df8d28dfc75f1af6e. We should re-enable this feature on a controlled basis so that we can flush out any outstanding issue we may have. Related-bug: #1432189 Change-Id: I2cfd93fdb032b461022b729347390ff8636ccdeb --- etc/neutron.conf | 8 +++--- neutron/service.py | 15 +++++++++--- neutron/tests/functional/test_service.py | 31 ++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 neutron/tests/functional/test_service.py diff --git a/etc/neutron.conf b/etc/neutron.conf index 7a11b939fb5..f5a6da62767 100755 --- a/etc/neutron.conf +++ b/etc/neutron.conf @@ -287,10 +287,12 @@ # ========== end of items for VLAN trunking networks ========== # =========== WSGI parameters related to the API server ============== -# Number of separate worker processes to spawn. The default, 0, runs the +# Number of separate worker processes to spawn. A value of 0 runs the # worker thread in the current process. Greater than 0 launches that number of -# child processes as workers. The parent process manages them. -# api_workers = 0 +# child processes as workers. The parent process manages them. If not +# specified, the default value is equal to the number of CPUs available to +# achieve best performance. +# api_workers = # Number of separate RPC worker processes to spawn. The default, 0, runs the # worker thread in the current process. Greater than 0 launches that number of diff --git a/neutron/service.py b/neutron/service.py index e27dd5cdc2f..76b0fd90d2e 100644 --- a/neutron/service.py +++ b/neutron/service.py @@ -18,6 +18,7 @@ import logging as std_logging import os import random +from oslo_concurrency import processutils from oslo_config import cfg from oslo_log import log as logging from oslo_messaging import server as rpc_server @@ -40,8 +41,9 @@ service_opts = [ default=40, help=_('Seconds between running periodic tasks')), cfg.IntOpt('api_workers', - default=0, - help=_('Number of separate API worker processes for service')), + help=_('Number of separate API worker processes for service. ' + 'If not specified, the default is equal to the number ' + 'of CPUs available for best performance.')), cfg.IntOpt('rpc_workers', default=0, help=_('Number of RPC worker processes for service')), @@ -168,6 +170,13 @@ def serve_rpc(): 'details.')) +def _get_api_workers(): + workers = cfg.CONF.api_workers + if workers is None: + workers = processutils.get_worker_count() + return workers + + def _run_wsgi(app_name): app = config.load_paste_app(app_name) if not app: @@ -175,7 +184,7 @@ def _run_wsgi(app_name): return server = wsgi.Server("Neutron") server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host, - workers=cfg.CONF.api_workers) + workers=_get_api_workers()) # Dump all option values here after all options are parsed cfg.CONF.log_opt_values(LOG, std_logging.DEBUG) LOG.info(_LI("Neutron service started, listening on %(host)s:%(port)s"), diff --git a/neutron/tests/functional/test_service.py b/neutron/tests/functional/test_service.py new file mode 100644 index 00000000000..d3bed3ee048 --- /dev/null +++ b/neutron/tests/functional/test_service.py @@ -0,0 +1,31 @@ +# Copyright 2014 Red Hat, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_concurrency import processutils +from oslo_config import cfg + +from neutron import service +from neutron.tests import base + + +class TestService(base.BaseTestCase): + + def test_api_workers_default(self): + self.assertEqual(processutils.get_worker_count(), + service._get_api_workers()) + + def test_api_workers_from_config(self): + cfg.CONF.set_override('api_workers', 1234) + self.assertEqual(1234, + service._get_api_workers())