mbox series

[0/5,v3] ext4: Fix performance regression with mballoc

Message ID 20220908091301.147-1-jack@suse.cz
Headers show
Series ext4: Fix performance regression with mballoc | expand

Message

Jan Kara Sept. 8, 2022, 9:21 a.m. UTC
Hello,

Here is the third version of my mballoc improvements to avoid spreading
allocations with mb_optimize_scan=1. Since v2 there are only small changes and
fixes found during review and testing. Overall the series looks mostly ready to
go, I just didn't see any comments regarding patch 3 - a fix of metabg handling
in the Orlov allocator which is kind of independent, I've just found it when
reading the code. Also patch 5 needs final review after all the fixes.

Changes since v1:
- reworked data structure for CR 1 scan
- make small closed files use locality group preallocation
- fix metabg handling in the Orlov allocator

Changes since v2:
- whitespace fixes
- fix outdated comment
- fix handling of mb_structs_summary procfs file
- fix bad unlock on error recovery path

Original cover letter:

The patches fix the performance regression I was able to reproduce with reaim
on my test machine:

                     mb_optimize_scan=0     mb_optimize_scan=1     patched
Hmean     disk-1       2076.12 (   0.00%)     2099.37 (   1.12%)     2032.52 (  -2.10%)
Hmean     disk-41     92481.20 (   0.00%)    83787.47 *  -9.40%*    90308.37 (  -2.35%)
Hmean     disk-81    155073.39 (   0.00%)   135527.05 * -12.60%*   154285.71 (  -0.51%)
Hmean     disk-121   185109.64 (   0.00%)   166284.93 * -10.17%*   185298.62 (   0.10%)
Hmean     disk-161   229890.53 (   0.00%)   207563.39 *  -9.71%*   232883.32 *   1.30%*
Hmean     disk-201   223333.33 (   0.00%)   203235.59 *  -9.00%*   221446.93 (  -0.84%)
Hmean     disk-241   235735.25 (   0.00%)   217705.51 *  -7.65%*   239483.27 *   1.59%*
Hmean     disk-281   266772.15 (   0.00%)   241132.72 *  -9.61%*   263108.62 (  -1.37%)
Hmean     disk-321   265435.50 (   0.00%)   245412.84 *  -7.54%*   267277.27 (   0.69%)

The changes also significanly reduce spreading of allocations for small /
moderately sized files. I'm not able to measure a performance difference
resulting from this but on eMMC storage this seems to be the main culprit
of reduced performance. Untarring of raspberry-pi archive touches following
numbers of groups:

	mb_optimize_scan=0	mb_optimize_scan=1	patched
groups	4			22			7

To achieve this I have added two more changes on top of v1 - patches 4 and 5.
Patch 4 makes sure we use locality group preallocation even for files that are
not likely to grow anymore (previously we have disabled all preallocations for
such files, however locality group preallocation still makes a lot of sense for
such files). This patch reduced spread of a small file allocations but larger
file allocations were still spread significantly because they avoid locality
group preallocation and as they are not power-of-two in size, they also
immediately start with cr=1 scan. To address that I've changed the data
structure for looking up the best block group to allocate from (see patch 5
for details).

								Honza
Previous versions:
Link: http://lore.kernel.org/r/20220823134508.27854-1-jack@suse.cz # v1
Link: http://lore.kernel.org/r/20220906150803.375-1-jack@suse.cz # v2

Comments

Stefan Wahren Sept. 8, 2022, 10:36 a.m. UTC | #1
Hi Jan,

Am 08.09.22 um 11:21 schrieb Jan Kara:
> Hello,
>
> Here is the third version of my mballoc improvements to avoid spreading
> allocations with mb_optimize_scan=1. Since v2 there are only small changes and
> fixes found during review and testing. Overall the series looks mostly ready to
> go, I just didn't see any comments regarding patch 3 - a fix of metabg handling
> in the Orlov allocator which is kind of independent, I've just found it when
> reading the code. Also patch 5 needs final review after all the fixes.
>
> Changes since v1:
> - reworked data structure for CR 1 scan
> - make small closed files use locality group preallocation
> - fix metabg handling in the Orlov allocator
>
> Changes since v2:
> - whitespace fixes
> - fix outdated comment
> - fix handling of mb_structs_summary procfs file
> - fix bad unlock on error recovery path

unfortunately the real patches doesn't have v3 which leads to confusion.

Just a note: in case this series cannot be applied for stable (5.15), we 
need a second solution to fix the regression there.
Jan Kara Sept. 9, 2022, 10:40 a.m. UTC | #2
On Thu 08-09-22 12:36:10, Stefan Wahren wrote:
> Hi Jan,
> 
> Am 08.09.22 um 11:21 schrieb Jan Kara:
> > Hello,
> > 
> > Here is the third version of my mballoc improvements to avoid spreading
> > allocations with mb_optimize_scan=1. Since v2 there are only small changes and
> > fixes found during review and testing. Overall the series looks mostly ready to
> > go, I just didn't see any comments regarding patch 3 - a fix of metabg handling
> > in the Orlov allocator which is kind of independent, I've just found it when
> > reading the code. Also patch 5 needs final review after all the fixes.
> > 
> > Changes since v1:
> > - reworked data structure for CR 1 scan
> > - make small closed files use locality group preallocation
> > - fix metabg handling in the Orlov allocator
> > 
> > Changes since v2:
> > - whitespace fixes
> > - fix outdated comment
> > - fix handling of mb_structs_summary procfs file
> > - fix bad unlock on error recovery path
> 
> unfortunately the real patches doesn't have v3 which leads to confusion.

Yeah, OK, I've updated my scripting for posting patches to include version
in each posted patch :)

> Just a note: in case this series cannot be applied for stable (5.15), we
> need a second solution to fix the regression there.

My plan is to backport the current series. It is not that invasive so it
should be doable...

								Honza
Stefan Wahren Sept. 11, 2022, 12:32 p.m. UTC | #3
Hi Jan,

Am 09.09.22 um 12:40 schrieb Jan Kara:
> On Thu 08-09-22 12:36:10, Stefan Wahren wrote:
>> Hi Jan,
>>
>> Am 08.09.22 um 11:21 schrieb Jan Kara:
>>> Hello,
>>>
>>> Here is the third version of my mballoc improvements to avoid spreading
>>> allocations with mb_optimize_scan=1. Since v2 there are only small changes and
>>> fixes found during review and testing. Overall the series looks mostly ready to
>>> go, I just didn't see any comments regarding patch 3 - a fix of metabg handling
>>> in the Orlov allocator which is kind of independent, I've just found it when
>>> reading the code. Also patch 5 needs final review after all the fixes.
>>>
>>> Changes since v1:
>>> - reworked data structure for CR 1 scan
>>> - make small closed files use locality group preallocation
>>> - fix metabg handling in the Orlov allocator
>>>
>>> Changes since v2:
>>> - whitespace fixes
>>> - fix outdated comment
>>> - fix handling of mb_structs_summary procfs file
>>> - fix bad unlock on error recovery path
>> unfortunately the real patches doesn't have v3 which leads to confusion.
> Yeah, OK, I've updated my scripting for posting patches to include version
> in each posted patch :)
>
>> Just a note: in case this series cannot be applied for stable (5.15), we
>> need a second solution to fix the regression there.
> My plan is to backport the current series. It is not that invasive so it
> should be doable...

This would be great.

Btw i retested this version and i can confirm the procfs crash is fixed.

>
> 								Honza