[rh7,v2] mm/memcg: fix cache growth above cache.limit_in_bytes

Submitted by Andrey Ryabinin on July 30, 2020, 1:58 p.m.

Details

Message ID 20200730135847.20101-1-aryabinin@virtuozzo.com
State New
Series "mm/memcg: fix cache growth above cache.limit_in_bytes"
Headers show

Commit Message

Andrey Ryabinin July 30, 2020, 1:58 p.m.
Exceeding cache above cache.limit_in_bytes schedules high_work_func()
which tries to reclaim 32 pages. If cache generated fast enough or it allows
cgroup to steadily grow above cache.limit_in_bytes because we don't reclaim
enough. Try to reclaim exceeded amount of cache instead.

https://jira.sw.ru/browse/PSBM-106384
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---

Changes since v1: add bug link to changelog

 mm/memcontrol.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 3cf200f506c3..e5adb0e81cbb 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3080,12 +3080,16 @@  static void reclaim_high(struct mem_cgroup *memcg,
 {
 
 	do {
+		unsigned long cache_overused;
+
 		if (page_counter_read(&memcg->memory) > memcg->high)
 			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, 0);
 
-		if (page_counter_read(&memcg->cache) > memcg->cache.limit)
-			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask,
-						MEM_CGROUP_RECLAIM_NOSWAP);
+		cache_overused = page_counter_read(&memcg->cache) -
+			memcg->cache.limit;
+		if (cache_overused)
+			try_to_free_mem_cgroup_pages(memcg, cache_overused,
+					gfp_mask, MEM_CGROUP_RECLAIM_NOSWAP);
 
 	} while ((memcg = parent_mem_cgroup(memcg)));
 }

Comments

Denis V. Lunev July 30, 2020, 2 p.m.
On 7/30/20 4:58 PM, Andrey Ryabinin wrote:
> Exceeding cache above cache.limit_in_bytes schedules high_work_func()
> which tries to reclaim 32 pages. If cache generated fast enough or it allows
> cgroup to steadily grow above cache.limit_in_bytes because we don't reclaim
> enough. Try to reclaim exceeded amount of cache instead.
>
> https://jira.sw.ru/browse/PSBM-106384
> Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
> ---
>
> Changes since v1: add bug link to changelog
>
>  mm/memcontrol.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 3cf200f506c3..e5adb0e81cbb 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -3080,12 +3080,16 @@ static void reclaim_high(struct mem_cgroup *memcg,
>  {
>  
>  	do {
> +		unsigned long cache_overused;
> +
>  		if (page_counter_read(&memcg->memory) > memcg->high)
>  			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, 0);
>  
> -		if (page_counter_read(&memcg->cache) > memcg->cache.limit)
> -			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask,
> -						MEM_CGROUP_RECLAIM_NOSWAP);
> +		cache_overused = page_counter_read(&memcg->cache) -
> +			memcg->cache.limit;
> +		if (cache_overused)
> +			try_to_free_mem_cgroup_pages(memcg, cache_overused,
> +					gfp_mask, MEM_CGROUP_RECLAIM_NOSWAP);
>  
>  	} while ((memcg = parent_mem_cgroup(memcg)));
>  }
can we run some testing and after that create custom RK to make check with
HostEurope on Monday?
Evgenii Shatokhin July 30, 2020, 3:57 p.m.
On 30.07.2020 17:00, Denis V. Lunev wrote:
> On 7/30/20 4:58 PM, Andrey Ryabinin wrote:
>> Exceeding cache above cache.limit_in_bytes schedules high_work_func()
>> which tries to reclaim 32 pages. If cache generated fast enough or it allows
>> cgroup to steadily grow above cache.limit_in_bytes because we don't reclaim
>> enough. Try to reclaim exceeded amount of cache instead.
>>
>> https://jira.sw.ru/browse/PSBM-106384
>> Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
>> ---
>>
>> Changes since v1: add bug link to changelog
>>
>>   mm/memcontrol.c | 10 +++++++---
>>   1 file changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>> index 3cf200f506c3..e5adb0e81cbb 100644
>> --- a/mm/memcontrol.c
>> +++ b/mm/memcontrol.c
>> @@ -3080,12 +3080,16 @@ static void reclaim_high(struct mem_cgroup *memcg,
>>   {
>>   
>>   	do {
>> +		unsigned long cache_overused;
>> +
>>   		if (page_counter_read(&memcg->memory) > memcg->high)
>>   			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask, 0);
>>   
>> -		if (page_counter_read(&memcg->cache) > memcg->cache.limit)
>> -			try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask,
>> -						MEM_CGROUP_RECLAIM_NOSWAP);
>> +		cache_overused = page_counter_read(&memcg->cache) -
>> +			memcg->cache.limit;
>> +		if (cache_overused)
>> +			try_to_free_mem_cgroup_pages(memcg, cache_overused,
>> +					gfp_mask, MEM_CGROUP_RECLAIM_NOSWAP);
>>   
>>   	} while ((memcg = parent_mem_cgroup(memcg)));
>>   }
> can we run some testing and after that create custom RK to make check with
> HostEurope on Monday?

1. Which kernel version(s)?

2. Would it be enough to prepare the live patch as .ko file and load it 
manually ('kpatch load') or RPM package is preferable?

If you plan to use the fix on more than one node, I think, an RPM 
package is easier to use. For a single node, *.ko file would be enough.

> .
>
Denis V. Lunev July 30, 2020, 5:45 p.m.
On 7/30/20 6:57 PM, Evgenii Shatokhin wrote:
> On 30.07.2020 17:00, Denis V. Lunev wrote:
>> On 7/30/20 4:58 PM, Andrey Ryabinin wrote:
>>> Exceeding cache above cache.limit_in_bytes schedules high_work_func()
>>> which tries to reclaim 32 pages. If cache generated fast enough or
>>> it allows
>>> cgroup to steadily grow above cache.limit_in_bytes because we don't
>>> reclaim
>>> enough. Try to reclaim exceeded amount of cache instead.
>>>
>>> https://jira.sw.ru/browse/PSBM-106384
>>> Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
>>> ---
>>>
>>> Changes since v1: add bug link to changelog
>>>
>>>   mm/memcontrol.c | 10 +++++++---
>>>   1 file changed, 7 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>>> index 3cf200f506c3..e5adb0e81cbb 100644
>>> --- a/mm/memcontrol.c
>>> +++ b/mm/memcontrol.c
>>> @@ -3080,12 +3080,16 @@ static void reclaim_high(struct mem_cgroup
>>> *memcg,
>>>   {
>>>         do {
>>> +        unsigned long cache_overused;
>>> +
>>>           if (page_counter_read(&memcg->memory) > memcg->high)
>>>               try_to_free_mem_cgroup_pages(memcg, nr_pages,
>>> gfp_mask, 0);
>>>   -        if (page_counter_read(&memcg->cache) > memcg->cache.limit)
>>> -            try_to_free_mem_cgroup_pages(memcg, nr_pages, gfp_mask,
>>> -                        MEM_CGROUP_RECLAIM_NOSWAP);
>>> +        cache_overused = page_counter_read(&memcg->cache) -
>>> +            memcg->cache.limit;
>>> +        if (cache_overused)
>>> +            try_to_free_mem_cgroup_pages(memcg, cache_overused,
>>> +                    gfp_mask, MEM_CGROUP_RECLAIM_NOSWAP);
>>>         } while ((memcg = parent_mem_cgroup(memcg)));
>>>   }
>> can we run some testing and after that create custom RK to make check
>> with
>> HostEurope on Monday?
>
> 1. Which kernel version(s)?

151.14

>
> 2. Would it be enough to prepare the live patch as .ko file and load
> it manually ('kpatch load') or RPM package is preferable?
>

sure

> If you plan to use the fix on more than one node, I think, an RPM
> package is easier to use. For a single node, *.ko file would be enough.
>
one node - for test purposes

Den