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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to