Prevent CPU spinning when there are no children

If you deploy an object server but have no rings at all (and are using
servers-per-port), then the CPU will spin as it checks for child
processes since there are actually no child processes to check.

This patch adds a sleep so that the CPU doesn't spin.

Change-Id: Iece62367aa2481a21752144b1f4477a3713282fe
This commit is contained in:
John Dickinson 2016-07-20 11:09:35 -07:00
parent d9b765320d
commit 8733311857

View File

@ -951,6 +951,7 @@ def run_wsgi(conf_path, app_section, *args, **kwargs):
loop_timeout = strategy.loop_timeout() loop_timeout = strategy.loop_timeout()
with Timeout(loop_timeout, exception=False): with Timeout(loop_timeout, exception=False):
try:
try: try:
pid, status = green_os.wait() pid, status = green_os.wait()
if os.WIFEXITED(status) or os.WIFSIGNALED(status): if os.WIFEXITED(status) or os.WIFSIGNALED(status):
@ -958,6 +959,14 @@ def run_wsgi(conf_path, app_section, *args, **kwargs):
except OSError as err: except OSError as err:
if err.errno not in (errno.EINTR, errno.ECHILD): if err.errno not in (errno.EINTR, errno.ECHILD):
raise raise
if err.errno == errno.ECHILD:
# If there are no children at all (ECHILD), then
# there's nothing to actually wait on. We sleep
# for a little bit to avoid a tight CPU spin
# and still are able to catch any KeyboardInterrupt
# events that happen. The value of 0.01 matches the
# value in eventlet's waitpid().
sleep(0.01)
except KeyboardInterrupt: except KeyboardInterrupt:
logger.notice('User quit') logger.notice('User quit')
running[0] = False running[0] = False