All of lore.kernel.org
 help / color / mirror / Atom feed
* [bitbake][styhead][2.10][PATCH 0/3] Patch review
@ 2024-12-04 20:41 Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap Steve Sakoman
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Steve Sakoman @ 2024-12-04 20:41 UTC (permalink / raw)
  To: bitbake-devel

Please review this set of changes for styhead/2.10 and have comments back
by end of day Friday. December 6

Passed a-full on autobuilder:

https://valkyrie.yoctoproject.org/#/builders/29/builds/583

The following changes since commit 9602a684568910fd333ffce907fa020ad3661c26:

  fetch2: use persist_data context managers (2024-11-28 13:59:46 +0000)

are available in the Git repository at:

  https://git.openembedded.org/bitbake-contrib stable/2.10-nut
  https://git.openembedded.org/bitbake-contrib/log/?h=stable/2.10-nut

Richard Purdie (3):
  runqueue: Fix performance of multiconfigs with large overlap
  runqueue: Optimise setscene loop processing
  runqueue: Fix scenetask processing performance issue

 lib/bb/runqueue.py | 22 +++++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

-- 
2.34.1



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [bitbake][styhead][2.10][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap
  2024-12-04 20:41 [bitbake][styhead][2.10][PATCH 0/3] Patch review Steve Sakoman
@ 2024-12-04 20:41 ` Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 2/3] runqueue: Optimise setscene loop processing Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 3/3] runqueue: Fix scenetask processing performance issue Steve Sakoman
  2 siblings, 0 replies; 4+ messages in thread
From: Steve Sakoman @ 2024-12-04 20:41 UTC (permalink / raw)
  To: bitbake-devel

From: Richard Purdie <richard.purdie@linuxfoundation.org>

There have been complaints about the performance of large multiconfig builds
for a while. The key missing data point was that the builds needed to have large
overlaps in sstate objects. This can be simulated by building the same things with
just different TMPDIRs. In runqueue/bitbake terms this equates to large numbers of
deferred tasks.

The issue is that the expensive checks in the setscene loop were hit every time
through runqueue's execute function before the check on deferred tasks. This leads
to task execution starvation as that only happens once per iteration.

Move the skip check earlier in the function which speeds things up enormously
and should improve performance of such builds for users.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 9c6c506757f2b3e28c8b20513b45da6b4659c95f)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
---
 lib/bb/runqueue.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index 3462ed445..9f3abff85 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -2195,6 +2195,9 @@ class RunQueueExecute:
             # Find the next setscene to run
             for nexttask in self.sorted_setscene_tids:
                 if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred:
+                    if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete:
+                        # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds
+                        continue
                     if nexttask not in self.sqdata.unskippable and self.sqdata.sq_revdeps[nexttask] and \
                             nexttask not in self.sq_needed_harddeps and \
                             self.sqdata.sq_revdeps[nexttask].issubset(self.scenequeue_covered) and \
@@ -2224,8 +2227,7 @@ class RunQueueExecute:
                         if t in self.runq_running and t not in self.runq_complete:
                             continue
                     if nexttask in self.sq_deferred:
-                        if self.sq_deferred[nexttask] not in self.runq_complete:
-                            continue
+                        # Deferred tasks that were still deferred were skipped above so we now need to process
                         logger.debug("Task %s no longer deferred" % nexttask)
                         del self.sq_deferred[nexttask]
                         valid = self.rq.validate_hashes(set([nexttask]), self.cooker.data, 0, False, summary=False)
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [bitbake][styhead][2.10][PATCH 2/3] runqueue: Optimise setscene loop processing
  2024-12-04 20:41 [bitbake][styhead][2.10][PATCH 0/3] Patch review Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap Steve Sakoman
@ 2024-12-04 20:41 ` Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 3/3] runqueue: Fix scenetask processing performance issue Steve Sakoman
  2 siblings, 0 replies; 4+ messages in thread
From: Steve Sakoman @ 2024-12-04 20:41 UTC (permalink / raw)
  To: bitbake-devel

From: Richard Purdie <richard.purdie@linuxfoundation.org>

Rather than looping through things we looped through on the previous execution,
start looping where we left off for setscene processing. This gives speed
improvements depending on the kind of build being executed.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 00f4d932e3af0eeb333339cbe942010fc76dee0f)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
---
 lib/bb/runqueue.py | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index 9f3abff85..b34e2d560 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -14,6 +14,7 @@ import os
 import sys
 import stat
 import errno
+import itertools
 import logging
 import re
 import bb
@@ -2189,11 +2190,16 @@ class RunQueueExecute:
         if not hasattr(self, "sorted_setscene_tids"):
             # Don't want to sort this set every execution
             self.sorted_setscene_tids = sorted(self.rqdata.runq_setscene_tids)
+            # Resume looping where we left off when we returned to feed the mainloop
+            self.setscene_tids_generator = itertools.cycle(self.rqdata.runq_setscene_tids)
 
         task = None
         if not self.sqdone and self.can_start_task():
-            # Find the next setscene to run
-            for nexttask in self.sorted_setscene_tids:
+            loopcount = 0
+            # Find the next setscene to run, exit the loop when we've processed all tids or found something to execute
+            while loopcount < len(self.rqdata.runq_setscene_tids):
+                loopcount += 1
+                nexttask = next(self.setscene_tids_generator)
                 if nexttask in self.sq_buildable and nexttask not in self.sq_running and self.sqdata.stamps[nexttask] not in self.build_stamps.values() and nexttask not in self.sq_harddep_deferred:
                     if nexttask in self.sq_deferred and self.sq_deferred[nexttask] not in self.runq_complete:
                         # Skip deferred tasks quickly before the 'expensive' tests below - this is key to performant multiconfig builds
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [bitbake][styhead][2.10][PATCH 3/3] runqueue: Fix scenetask processing performance issue
  2024-12-04 20:41 [bitbake][styhead][2.10][PATCH 0/3] Patch review Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap Steve Sakoman
  2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 2/3] runqueue: Optimise setscene loop processing Steve Sakoman
@ 2024-12-04 20:41 ` Steve Sakoman
  2 siblings, 0 replies; 4+ messages in thread
From: Steve Sakoman @ 2024-12-04 20:41 UTC (permalink / raw)
  To: bitbake-devel

From: Richard Purdie <richard.purdie@linuxfoundation.org>

Analysis shows that "bitbake core-image-ptest-all" spends a lot of
time in scenequeue_updatecounters and much of it is rebuilding a set
which doens't change. Reorder the code to avoid that performance
glitch.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 923c19b9713e398d8e66e6d4422dfd4c18a03486)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
---
 lib/bb/runqueue.py | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index b34e2d560..7f95140c4 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -2756,8 +2756,12 @@ class RunQueueExecute:
                 logger.debug2("%s was unavailable and is a hard dependency of %s so skipping" % (task, dep))
                 self.sq_task_failoutright(dep)
                 continue
+
+        # For performance, only compute allcovered once if needed
+        if self.sqdata.sq_deps[task]:
+            allcovered = self.scenequeue_covered | self.scenequeue_notcovered
         for dep in sorted(self.sqdata.sq_deps[task]):
-            if self.sqdata.sq_revdeps[dep].issubset(self.scenequeue_covered | self.scenequeue_notcovered):
+            if self.sqdata.sq_revdeps[dep].issubset(allcovered):
                 if dep not in self.sq_buildable:
                     self.sq_buildable.add(dep)
 
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-12-04 20:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-04 20:41 [bitbake][styhead][2.10][PATCH 0/3] Patch review Steve Sakoman
2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 1/3] runqueue: Fix performance of multiconfigs with large overlap Steve Sakoman
2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 2/3] runqueue: Optimise setscene loop processing Steve Sakoman
2024-12-04 20:41 ` [bitbake][styhead][2.10][PATCH 3/3] runqueue: Fix scenetask processing performance issue Steve Sakoman

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.