From 46c1b6eaee4ca00c256c5c403c6d6bfeaf3b63f8 Mon Sep 17 00:00:00 2001 From: Johannes Erdfelt Date: Sun, 25 Mar 2012 02:06:01 +0800 Subject: Add multi-process support for API services Implements blueprint multi-process-api-service This is based on Huang Zhiteng's patch. This patch adds support for running services as multiple processes. This is primarily intended to be used with the API service as a way to provide more concurrency than eventlet can sometimes provide. A SIGTERM or SIGINT signal will cause the parent process to gracefully terminate the child processes, allowing them to finish processing the requests currently being processed. The parent will wait for the children to finish before exiting. Change-Id: Ie6d6802626eb42d5e64c4167be363fbf6cea2a1b --- bin/nova-all | 15 ++++++++------- bin/nova-api | 10 +++++----- bin/nova-api-ec2 | 4 ++-- bin/nova-api-metadata | 4 ++-- bin/nova-api-os-compute | 4 ++-- bin/nova-api-os-volume | 4 ++-- 6 files changed, 21 insertions(+), 20 deletions(-) (limited to 'bin') diff --git a/bin/nova-all b/bin/nova-all index 5c0644b8c..6aee87805 100755 --- a/bin/nova-all +++ b/bin/nova-all @@ -28,7 +28,7 @@ continue attempting to launch the rest of the services. """ import eventlet -eventlet.monkey_patch() +eventlet.monkey_patch(os=False) import os import sys @@ -54,25 +54,26 @@ if __name__ == '__main__': flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() - servers = [] + launcher = service.ProcessLauncher() + # nova-api for api in flags.FLAGS.enabled_apis: try: - servers.append(service.WSGIService(api)) + server = service.WSGIService(api) + launcher.launch_server(server, workers=server.workers or 1) except (Exception, SystemExit): LOG.exception(_('Failed to load %s') % '%s-api' % api) for mod in [s3server, xvp_proxy]: try: - servers.append(mod.get_wsgi_server()) + launcher.launch_server(mod.get_wsgi_server()) except (Exception, SystemExit): LOG.exception(_('Failed to load %s') % mod.__name__) for binary in ['nova-compute', 'nova-volume', 'nova-network', 'nova-scheduler', 'nova-cert']: try: - servers.append(service.Service.create(binary=binary)) + launcher.launch_server(service.Service.create(binary=binary)) except (Exception, SystemExit): LOG.exception(_('Failed to load %s'), binary) - service.serve(*servers) - service.wait() + launcher.wait() diff --git a/bin/nova-api b/bin/nova-api index e6779df4f..b778854f0 100755 --- a/bin/nova-api +++ b/bin/nova-api @@ -24,7 +24,7 @@ Starts both the EC2 and OpenStack APIs in separate greenthreads. """ import eventlet -eventlet.monkey_patch() +eventlet.monkey_patch(os=False) import os import sys @@ -45,8 +45,8 @@ if __name__ == '__main__': flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() - servers = [] + launcher = service.ProcessLauncher() for api in flags.FLAGS.enabled_apis: - servers.append(service.WSGIService(api)) - service.serve(*servers) - service.wait() + server = service.WSGIService(api) + launcher.launch_server(server, workers=server.workers or 1) + launcher.wait() diff --git a/bin/nova-api-ec2 b/bin/nova-api-ec2 index b53c9158a..f76f3dd7e 100755 --- a/bin/nova-api-ec2 +++ b/bin/nova-api-ec2 @@ -20,7 +20,7 @@ """Starter script for Nova EC2 API.""" import eventlet -eventlet.monkey_patch() +eventlet.monkey_patch(os=False) import os import sys @@ -42,5 +42,5 @@ if __name__ == '__main__': logging.setup() utils.monkey_patch() server = service.WSGIService('ec2') - service.serve(server) + service.serve(server, workers=server.workers) service.wait() diff --git a/bin/nova-api-metadata b/bin/nova-api-metadata index 2f2ef9454..2aad93453 100755 --- a/bin/nova-api-metadata +++ b/bin/nova-api-metadata @@ -20,7 +20,7 @@ """Starter script for Nova Metadata API.""" import eventlet -eventlet.monkey_patch() +eventlet.monkey_patch(os=False) import os import sys @@ -42,5 +42,5 @@ if __name__ == '__main__': logging.setup() utils.monkey_patch() server = service.WSGIService('metadata') - service.serve(server) + service.serve(server, workers=server.workers) service.wait() diff --git a/bin/nova-api-os-compute b/bin/nova-api-os-compute index 75c921943..c83855254 100755 --- a/bin/nova-api-os-compute +++ b/bin/nova-api-os-compute @@ -20,7 +20,7 @@ """Starter script for Nova OS API.""" import eventlet -eventlet.monkey_patch() +eventlet.monkey_patch(os=False) import os import sys @@ -42,5 +42,5 @@ if __name__ == '__main__': logging.setup() utils.monkey_patch() server = service.WSGIService('osapi_compute') - service.serve(server) + service.serve(server, workers=server.workers) service.wait() diff --git a/bin/nova-api-os-volume b/bin/nova-api-os-volume index b93fd51ae..f08c69384 100755 --- a/bin/nova-api-os-volume +++ b/bin/nova-api-os-volume @@ -20,7 +20,7 @@ """Starter script for Nova OS API.""" import eventlet -eventlet.monkey_patch() +eventlet.monkey_patch(os=False) import os import sys @@ -42,5 +42,5 @@ if __name__ == '__main__': logging.setup() utils.monkey_patch() server = service.WSGIService('osapi_volume') - service.serve(server) + service.serve(server, workers=server.workers) service.wait() -- cgit