summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/server/process.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2013-08-31 23:40:55 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-09-01 15:51:10 +0100
commitb306d7d9a4dd5dec0ed1ca91b50569f078ac103e (patch)
tree7c76ce19c1a731316ae58f1c2b270389673f2a55 /bitbake/lib/bb/server/process.py
parentd63e6a925a78f0f5fb7e7329b5cc2993f1ec9b14 (diff)
downloadpoky-b306d7d9a4dd5dec0ed1ca91b50569f078ac103e.tar.gz
bitbake: server/process, server/xmlrpc, runqueue: Use select.select() on fds, not time.sleep()
The existing backend server implementations were inefficient since they were sleeping for the full length of the timeouts rather than being woken when there was data ready for them. It was assumed they would wake and perhaps did when we forked processes directory but that is no longer the case. This updates both the process and xmlrpc backends to wait using select(). This does mean we need to pass the file descriptors to wait on from the internals who know which these file descriptors are but this is a logical improvement. Tests of a pathaolgical load on the process server of ~420 rapid tasks executed on a server with BB_NUMBER_THREAD=48 went from a wall clock measurement of the overall command execution time of 75s to a much more reasonable 24s. (Bitbake rev: 9bee497960889d9baa0a4284d79a384b18a8e826) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
-rw-r--r--bitbake/lib/bb/server/process.py11
1 files changed, 6 insertions, 5 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index e2cec49b74..c0af052ebd 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -29,6 +29,7 @@ import os
29import signal 29import signal
30import sys 30import sys
31import time 31import time
32import select
32from Queue import Empty 33from Queue import Empty
33from multiprocessing import Event, Process, util, Queue, Pipe, queues 34from multiprocessing import Event, Process, util, Queue, Pipe, queues
34 35
@@ -105,7 +106,7 @@ class ProcessServer(Process, BaseImplServer):
105 command = self.command_channel.recv() 106 command = self.command_channel.recv()
106 self.runCommand(command) 107 self.runCommand(command)
107 108
108 self.idle_commands(.1) 109 self.idle_commands(.1, [self.event_queue._reader, self.command_channel])
109 except Exception: 110 except Exception:
110 logger.exception('Running command %s', command) 111 logger.exception('Running command %s', command)
111 112
@@ -115,7 +116,7 @@ class ProcessServer(Process, BaseImplServer):
115 self.cooker.stop() 116 self.cooker.stop()
116 self.idle_commands(.1) 117 self.idle_commands(.1)
117 118
118 def idle_commands(self, delay): 119 def idle_commands(self, delay, fds = []):
119 nextsleep = delay 120 nextsleep = delay
120 121
121 for function, data in self._idlefuns.items(): 122 for function, data in self._idlefuns.items():
@@ -127,15 +128,15 @@ class ProcessServer(Process, BaseImplServer):
127 nextsleep = None 128 nextsleep = None
128 elif nextsleep is None: 129 elif nextsleep is None:
129 continue 130 continue
130 elif retval < nextsleep: 131 else:
131 nextsleep = retval 132 fds = fds + retval
132 except SystemExit: 133 except SystemExit:
133 raise 134 raise
134 except Exception: 135 except Exception:
135 logger.exception('Running idle function') 136 logger.exception('Running idle function')
136 137
137 if nextsleep is not None: 138 if nextsleep is not None:
138 time.sleep(nextsleep) 139 select.select(fds,[],[],nextsleep)
139 140
140 def runCommand(self, command): 141 def runCommand(self, command):
141 """ 142 """