[bitbake-devel] [PATCH] build/utils: Add BB_TASK_IONICE_LEVEL support

Scott Rifenbark srifenbark at gmail.com
Tue Oct 27 15:09:38 UTC 2015


On Tue, Oct 27, 2015 at 7:59 AM, Avery, Brian <brian.avery at intel.com> wrote:

> Hi,
>
> It mostly appears as CFQ scheduler (Completely Fair Queuing).  Since we
> tell them to set it to cfq, it might be nice to tell them to do this by
> doing sudo sh -c “echo cfq > /sys/block/<device>/queu/scheduler; where
> device is the backing block device e.g. sda,sdb,…
>

Brian - I updated that note accordingly.  Is "queu" correct?  Or should it
be "queue"?

Thanks

>
> -b
>
> From: Scott Rifenbark <srifenbark at gmail.com>
> Date: Tuesday, October 27, 2015 at 6:34 AM
> To: Richard Purdie <richard.purdie at linuxfoundation.org>
> Cc: bitbake-devel <bitbake-devel at lists.openembedded.org>, Brian Avery <
> brian.avery at intel.com>, "Witt, Randy E" <randy.e.witt at intel.com>,
> "Flanagan, Elizabeth" <elizabeth.flanagan at intel.com>, "Graydon, Tracy" <
> tracy.graydon at intel.com>, Michael Halstead <michael at yoctoproject.org>
> Subject: Re: [PATCH] build/utils: Add BB_TASK_IONICE_LEVEL support
>
> Hi,
>
> See
> http://www.yoctoproject.org/docs/2.0/bitbake-user-manual/bitbake-user-manual.html#var-BB_TASK_IONICE_LEVEL
> for the new variable description in the BitBake User Manual.  Note that I
> did not include the future implementation information at the bottom of
> Richard's explanation.  Also, there is a bit about the 'cfq scheduler' near
> the end.  I did not know how to properly format this string (e.g. CFG
> Scheduler).
>
> Let me know of any changes or fixes.
>
> Thanks,
> Scott
>
> On Sat, Oct 24, 2015 at 3:19 AM, Richard Purdie <
> richard.purdie at linuxfoundation.org> wrote:
>
>> Similarly to BB_TASK_NICE_LEVEL, add BB_TASK_IONICE_LEVEL which allows
>> the ioprio
>> of tasks to be adjusted. This is in response to various qemu runtime
>> timeouts
>> which have been witnessed on the autobuilder, seemingly due to IO
>> starvation (we
>> already use NICE_LEVEL to adjust tasks). This has a fairly urgent need to
>> deal
>> with certain 'random' failures we're seeing on the autobuilders in
>> testing.
>>
>> The format of the data in the variable is BB_TASK_IONICE_LEVEL =
>> "<class>.<prio>".
>>
>> For <class>, 2 is best effort (the default), 1 is real time and 3 is
>> idle. You'd
>> need superuser privileges to use realtime. The <prio> value is a default
>> of 4,
>> and can be set between 0 and 7 with 7 being lowest priority and 0 the
>> highest.
>> The user can set this freely with normal privileges
>>
>> Note that in order for this to take effect, you need the cfq scheduler
>> selected
>> for the backing block device.
>>
>> We could use nice wrapper functions for ioprio from modules like psutil
>> however
>> that would complicate bitbake dependencies. This version has some magic
>> numbers
>> but works on the main 32 and 64 bit x86 build architectures and can
>> easily be
>> extended if ever needed. When we move to python 3.x, we can likely
>> replace this
>> with standard calls.
>>
>> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
>>
>> diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
>> index 948c395..22428a6 100644
>> --- a/bitbake/lib/bb/build.py
>> +++ b/bitbake/lib/bb/build.py
>> @@ -413,6 +413,13 @@ def _exec_task(fn, task, d, quieterr):
>>          nice = int(nice) - curnice
>>          newnice = os.nice(nice)
>>          logger.debug(1, "Renice to %s " % newnice)
>> +    ionice = localdata.getVar("BB_TASK_IONICE_LEVEL", True)
>> +    if ionice:
>> +        try:
>> +            cls, prio = ionice.split(".", 1)
>> +            bb.utils.ioprio_set(os.getpid(), int(cls), int(prio))
>> +        except:
>> +            bb.warn("Invalid ionice level %s" % ionice)
>>
>>      bb.utils.mkdirhier(tempdir)
>>
>> diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
>> index eb219c1..86a5328 100644
>> --- a/bitbake/lib/bb/utils.py
>> +++ b/bitbake/lib/bb/utils.py
>> @@ -1310,3 +1310,27 @@ def signal_on_parent_exit(signame):
>>      result = cdll['libc.so.6'].prctl(PR_SET_PDEATHSIG, signum)
>>      if result != 0:
>>          raise PrCtlError('prctl failed with error code %s' % result)
>> +
>> +#
>> +# Manually call the ioprio syscall. We could depend on other libs like
>> psutil
>> +# however this gets us enough of what we need to bitbake for now without
>> the
>> +# dependency
>> +#
>> +_unamearch = os.uname()[4]
>> +IOPRIO_WHO_PROCESS = 1
>> +IOPRIO_CLASS_SHIFT = 13
>> +
>> +def ioprio_set(who, cls, value):
>> +    NR_ioprio_set = None
>> +    if _unamearch == "x86_64":
>> +      NR_ioprio_set = 251
>> +    elif _unamearch[0] == "i" and _unamearch[2:3] == "86":
>> +      NR_ioprio_set = 289
>> +
>> +    if NR_ioprio_set:
>> +        ioprio = value | (cls << IOPRIO_CLASS_SHIFT)
>> +        rc = cdll['libc.so.6'].syscall(NR_ioprio_set,
>> IOPRIO_WHO_PROCESS, who, ioprio)
>> +        if rc != 0:
>> +            raise ValueError("Unable to set ioprio, syscall returned %s"
>> % rc)
>> +    else:
>> +        bb.warn("Unable to set IO Prio for arch %s" % _unamearch)
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/bitbake-devel/attachments/20151027/5507d557/attachment-0002.html>


More information about the bitbake-devel mailing list