On Tue, 2021-08-24 at 17:40 +0800, Changqing Li wrote:
> From: Changqing Li <changqing...@windriver.com>
> 
> Update way of setting XZ_MEMLIMIT, considering scenario that
> running bitbake in container, to avoid OOM Killer of xz.
> 
> For example:
> Container has memory limit of 30G, and host memory is 300G.  'xz
> --memlimit=50% ...' will get host memory, so the limit for xz is 150G.
> And because of the container memory limit is 30G, xz can use nearly up
> to 30G memory, which may cause oom kill of xz.
> 
> Signed-off-by: Changqing Li <changqing...@windriver.com>
> ---
>  meta/conf/bitbake.conf |  3 ++-
>  meta/lib/oe/utils.py   | 12 ++++++++++++
>  2 files changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
> index f6fb2aa698..2b36e083ca 100644
> --- a/meta/conf/bitbake.conf
> +++ b/meta/conf/bitbake.conf
> @@ -809,7 +809,8 @@ BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
>  PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
>  
>  # Default parallelism and resource usage for xz
> -XZ_MEMLIMIT ?= "50%"
> +CONTAINER_MEM_LIMIT = "${@oe.utils.container_mem_limit()}"
> +XZ_MEMLIMIT ?= "${@ '%d' % (int(d.getVar('CONTAINER_MEM_LIMIT'))/2) if 
> d.getVar('CONTAINER_MEM_LIMIT') != '0' else '50%'}"
>  XZ_THREADS ?= "${@oe.utils.cpu_count(at_least=2)}"
>  XZ_DEFAULTS ?= "--memlimit=${XZ_MEMLIMIT} --threads=${XZ_THREADS}"
>  XZ_DEFAULTS[vardepsexclude] += "XZ_MEMLIMIT XZ_THREADS"
> diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py
> index a84039f585..581072ac0d 100644
> --- a/meta/lib/oe/utils.py
> +++ b/meta/lib/oe/utils.py
> @@ -252,6 +252,18 @@ def cpu_count(at_least=1):
>      cpus = len(os.sched_getaffinity(0))
>      return max(cpus, at_least)
>  
> +def container_mem_limit():
> +    limit_in_bytes = '0'
> +    proc_sched = '/proc/1/sched'
> +    if os.path.exists(proc_sched):
> +        with open(proc_sched, 'r') as fp:
> +            initinfo = fp.readline().strip()
> +            cgroup_limit_in_bytes = 
> '/sys/fs/cgroup/memory/memory.limit_in_bytes'
> +            if initinfo.split(' ')[0] not in ('systemd', 'init',) and 
> os.path.exists(cgroup_limit_in_bytes):
> +                with open(cgroup_limit_in_bytes) as fpc:
> +                    limit_in_bytes=fpc.readline().strip()
> +    return limit_in_bytes
> +

Whilst I understand the idea here, this is an awful lot of hardcoded values and
"magic". I'm not sure we want all bitbake processes to be making these kinds of
queries/decisions every time the config is parsed...

Adding the function to oe/utils may be ok but I'm not keen on making it the
default.

Cheers,

Richard



-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#155220): 
https://lists.openembedded.org/g/openembedded-core/message/155220
Mute This Topic: https://lists.openembedded.org/mt/85107112/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