[Devel] [PATCH rh7] memcg: ignore memory.low for cgroups w/o tasks

Konstantin Khorenko khorenko at virtuozzo.com
Fri Feb 26 02:09:04 PST 2016


Kirill, please review the patch.

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team

On 02/26/2016 12:53 PM, Vladimir Davydov wrote:
> It's OK to set memory.low for a cgroup to infinity. This might be useful
> if no tasks are supposed to run inside the cgroup itself, but only in
> its sub-cgroups (e.g. /machine.slice). In this case protection against
> memory pressure originating on upper levels will be guarded solely by
> memory.low configuration in sub-cgroups.
>
> However, in the current implementation, in contrast to mainstream,
> charges can appear in a cgroup even if there's no tasks in it - they can
> be reparented from a dead sub-cgroup. If the cgroup has memory.low set
> to inf, such reparented charges will not get reclaimed normally on
> memory pressure, resulting in performance degradation in other cgroups.
> To avoid that, let's ignore memory.low for cgroups w/o tasks.
>
> https://jira.sw.ru/browse/PSBM-44192
>
> Signed-off-by: Vladimir Davydov <vdavydov at virtuozzo.com>
> ---
>   mm/memcontrol.c | 18 ++++++++++++++++++
>   1 file changed, 18 insertions(+)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index ddd162ae4b3f..6009ff5d1903 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1607,6 +1607,24 @@ bool mem_cgroup_low(struct mem_cgroup *root, struct mem_cgroup *memcg)
>   	if (res_counter_read_u64(&memcg->res, RES_USAGE) >= memcg->low)
>   		return false;
>
> +	/*
> +	 * XXX: It's OK to set memory.low for a cgroup to infinity. This might
> +	 * be useful if no tasks are supposed to run inside the cgroup itself,
> +	 * but only in its sub-cgroups (e.g. /machine.slice). In this case
> +	 * protection against memory pressure originating on upper levels will
> +	 * be guarded solely by memory.low configuration in sub-cgroups.
> +	 *
> +	 * However, in the current implementation, in contrast to mainstream,
> +	 * charges can appear in a cgroup even if there's no tasks in it - they
> +	 * can be reparented from a dead sub-cgroup. If the cgroup has
> +	 * memory.low set to inf, such reparented charges will not get
> +	 * reclaimed normally on memory pressure, resulting in performance
> +	 * degradation in other cgroups. To avoid that, let's ignore memory.low
> +	 * for cgroups w/o tasks.
> +	 */
> +	if (cgroup_task_count(memcg->css.cgroup) == 0)
> +		return false;
> +
>   	while (memcg != root) {
>   		memcg = parent_mem_cgroup(memcg);
>   		if (!memcg)
>


More information about the Devel mailing list