From b306d7d9a4dd5dec0ed1ca91b50569f078ac103e Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Sat, 31 Aug 2013 23:40:55 +0100 Subject: 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 --- bitbake/lib/bb/runqueue.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'bitbake/lib/bb/runqueue.py') diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 075c84985a..197308fd9d 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -895,6 +895,14 @@ class RunQueue: if self.fakeworkerpipe: self.fakeworkerpipe.read() + def active_fds(self): + fds = [] + if self.workerpipe: + fds.append(self.workerpipe.input) + if self.fakeworkerpipe: + fds.append(self.fakeworkerpipe.input) + return fds + def check_stamp_task(self, task, taskname = None, recurse = False, cache = None): def get_timestamp(f): try: @@ -972,7 +980,7 @@ class RunQueue: (if the abort on failure configuration option isn't set) """ - retval = 0.5 + retval = True if self.state is runQueuePrepare: self.rqexe = RunQueueExecuteDummy(self) @@ -1375,7 +1383,7 @@ class RunQueueExecuteTasks(RunQueueExecute): if self.stats.active > 0: self.rq.read_workers() - return 0.5 + return self.rq.active_fds() if len(self.failed_fnids) != 0: self.rq.state = runQueueFailed -- cgit v1.2.3-54-g00ecf