Hi Aryaman, Aryaman Gupta <aryaman.gu...@windriver.com> escreveu no dia quarta, 29/06/2022 à(s) 21:10:
> Stop the scheduler from starting new tasks if the > current cpu or io pressure is above a certain threshold, specified > through the "BB_MAX_{CPU|IO}_SOME_PRESSURE" variables in conf/local.conf. > > If the thresholds aren't specified, the default values are 100 for both > CPU and IO, which will have no impact on build times. > Arbitary lower limit of 1.0 results in a fatal error to avoid extremely > long builds. If the percentage limits are higher than 100, then the default > values are used and warnings are issued to inform users that the > specified limit is out of bounds. > > Signed-off-by: Aryaman Gupta <aryaman.gu...@windriver.com> > Signed-off-by: Randy Macleod <randy.macl...@windriver.com> > --- > bitbake/lib/bb/runqueue.py | 39 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 39 insertions(+) > > diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py > index 1e47fe70ef..9667acc11c 100644 > --- a/bitbake/lib/bb/runqueue.py > +++ b/bitbake/lib/bb/runqueue.py > @@ -159,6 +159,27 @@ class RunQueueScheduler(object): > self.buildable.append(tid) > > self.rev_prio_map = None > + # Some hosts like openSUSE have readable /proc/pressure files > + # but throw errors when these files are opened. > + try: > + subprocess.check_output(["cat", "/proc/pressure/cpu", > "/proc/pressure/io"], \ > + universal_newlines=True, > stderr=subprocess.DEVNULL) > + self.readable_pressure_files = True > + except: > + if self.rq.max_cpu_pressure!=100 or > self.rq.max_io_pressure!=100: > + bb.warn("The /proc/pressure files can't be read. > Continuing build without monitoring pressure") > + self.readable_pressure_files = False > + > + def exceeds_max_pressure(self): > + if self.readable_pressure_files: > We can jump when the user does not provide any default values or if they provide the maximum if self.readable_pressure_files and (self.rq.max_cpu_pressure < 100 or self.rq.max_io_pressure < 100): Jose + # extract avg10 from /proc/pressure/{cpu|io} > + curr_pressure_sample = subprocess.check_output(["cat", > "/proc/pressure/cpu", "/proc/pressure/io"], \ > + universal_newlines=True, > stderr=subprocess.DEVNULL) > + curr_cpu_pressure = > curr_pressure_sample.split('\n')[0].split()[1].split("=")[1] > + curr_io_pressure = > curr_pressure_sample.split('\n')[2].split()[1].split("=")[1] > + > + return float(curr_cpu_pressure) > self.rq.max_cpu_pressure or > float(curr_io_pressure) > self.rq.max_io_pressure > + return False > > def next_buildable_task(self): > """ > @@ -171,6 +192,8 @@ class RunQueueScheduler(object): > buildable.intersection_update(self.rq.tasks_covered | > self.rq.tasks_notcovered) > if not buildable: > return None > + if self.exceeds_max_pressure(): > + return None > > # Filter out tasks that have a max number of threads that have > been exceeded > skip_buildable = {} > @@ -1699,6 +1722,8 @@ class RunQueueExecute: > > self.number_tasks = int(self.cfgData.getVar("BB_NUMBER_THREADS") > or 1) > self.scheduler = self.cfgData.getVar("BB_SCHEDULER") or "speed" > + self.max_cpu_pressure = > float(self.cfgData.getVar("BB_MAX_CPU_SOME_PRESSURE") or 100.0) > + self.max_io_pressure = > float(self.cfgData.getVar("BB_MAX_IO_SOME_PRESSURE") or 100.0) > > self.sq_buildable = set() > self.sq_running = set() > @@ -1733,6 +1758,20 @@ class RunQueueExecute: > if self.number_tasks <= 0: > bb.fatal("Invalid BB_NUMBER_THREADS %s" % self.number_tasks) > > + lower_limit = 1.0 > + upper_limit = 100.0 > + if self.max_cpu_pressure < lower_limit: > + bb.fatal("Invalid BB_MAX_CPU_SOME_PRESSURE %s, minimum value > is %s" % (self.max_cpu_pressure, lower_limit)) > + if self.max_cpu_pressure > upper_limit: > + bb.warn("Percentage value of BB_MAX_CPU_SOME_PRESSURE %s > rounded down to %s" % (self.max_cpu_pressure, upper_limit)) > + self.max_cpu_pressure = upper_limit > + > + if self.max_io_pressure < lower_limit: > + bb.fatal("Invalid BB_MAX_IO_SOME_PRESSURE %s, minimum value > is %s" % (self.max_io_pressure, lower_limit)) > + if self.max_io_pressure > upper_limit: > + bb.warn("Percentage value of BB_MAX_IO_SOME_PRESSURE %s > rounded down to %s" % (self.max_io_pressure, upper_limit)) > + self.max_io_pressure = upper_limit > + > # List of setscene tasks which we've covered > self.scenequeue_covered = set() > # List of tasks which are covered (including setscene ones) > -- > 2.35.1 > > > > > -- Best regards, José Quaresma
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#167403): https://lists.openembedded.org/g/openembedded-core/message/167403 Mute This Topic: https://lists.openembedded.org/mt/92073312/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-