Hi Tao Liu,

-----Original Message-----
> Hello Kazu,
> 
> Sorry for the late reply.
> 
> On Fri, Sep 17, 2021 at 07:03:50AM +0000, HAGIO KAZUHITO(萩尾 一仁) wrote:
> > -----Original Message-----
> > > -----Original Message-----
> > > > > > > This patch set adds ZSTD compression support to makedumpfile. 
> > > > > > > With ZSTD compression
> > > > > > > support, the vmcore dump size and time consumption can have a 
> > > > > > > better balance than
> > > > > > > zlib/lzo/snappy.
> > > > > > >
> > > > > > > How to build:
> > > > > > >
> > > > > > >   Build using make:
> > > > > > >     $ make USEZSTD=on
> > > > > > >
> > > > > > > Performance Comparison:
> > > > > > >
> > > > > > >   How to measure
> > > > > > >
> > > > > > >     I took a x86_64 machine which had 4T memory, and the 
> > > > > > > compression level
> > > > > > >     range from (-3 to 4) for ZSTD, as well as zlib/lzo/snappy 
> > > > > > > compression.
> > > > > > >     All testing was done by makedumpfile single thread mode.
> > > > > > >
> > > > > > >     As for compression performance testing, in order to avoid the 
> > > > > > > performance
> > > > > > >     bottle neck of disk I/O, I used the following makedumpfile 
> > > > > > > cmd, which took
> > > > > > >     lzo compression as an example. "--dry-run" will not write any 
> > > > > > > data to disk,
> > > > > > >     "--show-stat" will output the vmcore size after compression, 
> > > > > > > and the time
> > > > > > >     consumption can be collected from the output logs.
> > > > > > >
> > > > > > >     $ makedumpfile -d 0 -l /proc/kcore vmcore --dry-run 
> > > > > > > --show-stat
> > > > > > >
> > > > > > >
> > > > > > >     As for decompression performance testing, I only tested the 
> > > > > > > (-d 31) case,
> > > > > > >     because the vmcore size of (-d 0) case is too big to fit in 
> > > > > > > the disk, in
> > > > > > >     addtion, to read a oversized file from disk will encounter 
> > > > > > > the disk I/O
> > > > > > >     bottle neck.
> > > > > > >
> > > > > > >     I triggered a kernel crash and collected a vmcore. Then I 
> > > > > > > converted the
> > > > > > >     vmcore into specific compression format using the following 
> > > > > > > makedumpfile
> > > > > > >     cmd, which would get a lzo format vmcore as an example:
> > > > > > >
> > > > > > >     $ makedumpfile -l vmcore vmcore.lzo
> > > > > > >
> > > > > > >     After all vmcores were ready, I used the following cmd to 
> > > > > > > perform the
> > > > > > >     decompression, the time consumption can be collected from the 
> > > > > > > logs.
> > > > > > >
> > > > > > >     $ makedumpfile -F vmcore.lzo --dry-run --show-stat
> > > > > > >
> > > > > > >
> > > > > > >   Result charts
> > > > > > >
> > > > > > >     For compression:
> > > > > > >
> > > > > > >             makedumpfile -d31                     |  makedumpfile 
> > > > > > > -d0
> > > > > > >             Compression time      vmcore size     |  Compression 
> > > > > > > time  vmcore size
> > > > > > >     zstd-3  325.516446            5285179595      |  8205.452248  
> > > > > > >      51715430204
> > > > > > >     zstd-2  332.069432            5319726604      |  8057.381371  
> > > > > > >      51732062793
> > > > > > >     zstd-1  309.942773            5730516274      |  8138.060786  
> > > > > > >      52136191571
> > > > > > >     zstd0   439.773076            4673859661      |  8873.059963  
> > > > > > >      50993669657
> > > > > > >     zstd1   406.68036             4700959521      |  8259.417132  
> > > > > > >      51036900055
> > > > > > >     zstd2   397.195643            4699263608      |  8230.308291  
> > > > > > >      51030410942
> > > > > > >     zstd3   436.491632            4673306398      |  8803.970103  
> > > > > > >      51043393637
> > > > > > >     zstd4   543.363928            4668419304      |  8991.240244  
> > > > > > >      51058088514
> > > > > > >     zlib    561.217381            8514803195      | 14381.755611  
> > > > > > >      78199283893
> > > > > > >     lzo       248.175953         16696411879      |  6057.528781  
> > > > > > >      90020895741
> > > > > > >     snappy  231.868312           11782236674      |  5290.919894  
> > > > > > >     245661288355
> > > > > > >
> > > > > > >     For decompression:
> > > > > > >
> > > > > > >             makedumpfile -d31
> > > > > > >             decompress time          vmcore size
> > > > > > >     zstd-3        477.543396             5289373448
> > > > > > >     zstd-2        478.034534             5327454123
> > > > > > >     zstd-1        459.066807             5748037931
> > > > > > >     zstd0 561.687525             4680009013
> > > > > > >     zstd1 547.248917             4706358547
> > > > > > >     zstd2 544.219758             4704780719
> > > > > > >     zstd3 555.726343             4680009013
> > > > > > >     zstd4 558.031721             4675545933
> > > > > > >     zlib  630.965426             8555376229
> > > > > > >     lzo           427.292107            16849457649
> > > > > > >     snappy        446.542806            11841407957
> > > > > > >
> > > > > > >   Discussion
> > > > > > >
> > > > > > >     For zstd range from -3 to 4, compression level 2 (ZSTD_dfast) 
> > > > > > > has
> > > > > > >     the best time consumption and vmcore dump size balance.
> > > > > >
> > > > > > Do you have a result of -d 1 compression test?  I think -d 0 is not
> > > > > > practical, I would like to see a -d 1 result of such a large vmcore.
> > > > > >
> > > > >
> > > > > No, I haven't tested the -d 1 case. I have returned the machine which 
> > > > > used
> > > > > for performance testing, I will borrow and test on it again, please 
> > > > > wait for
> > > > > a while...
> > > >
> > > > Thanks, it would be helpful.
> > > >
> > > > >
> > > > > > And just out of curiosity, what version of zstd are you using?
> > > > > > When I tested zstd last time, compression level 1 was faster than 
> > > > > > 2, iirc.
> > > > > >
> > > > >
> > > > > The OS running on the machine is fedora34, I used its default zstd 
> > > > > package, whose
> > > > > version is v1.4.9.
> > > >
> > > > Thanks for the info.
> > > >
> > > > >
> > > > > > btw, ZSTD_dfast is an enum of ZSTD_strategy, not for compression 
> > > > > > level?
> > > > >
> > > > > Yes, it's enum of ZSTD_strategy [1].
> > > >
> > > > ok, so it'll have to be replaced with "2" to avoid confusion.
> > > >
> > > > >
> > > > > [1]: 
> > > > > https://zstd.docsforge.com/dev/api-documentation/#advanced-compression-api-requires-v140
> > > > >
> > > > > Thanks,
> > > > > Tao Liu
> > > > >
> > > > > > (no need to update for now, I will review later)
> > > >
> > > > The series almost looks good to me (though I will merge those into a 
> > > > patch),
> > > > just two questions are:
> > > > - whether 2 is the best balanced compression level,
> >
> > As far as I've tested on two machines this time, compression level 1 was 
> > faster
> > than 2.  There is no large difference between them, but generally 1 should 
> > be
> > faster than 2 according to the zstd manual:
> >   "The lower the level, the faster the speed (at the cost of compression)."
> > And as you know, level 0 is unstable, that was the same when I tested 
> > before.
> >
> > So currently I would prefer 1 rather than 2, what do you think?
> 
> As we mentioned before, I have tested the -d 1 compression measurement on
> the same x86_64 machine with 4T memory:
> 
>        compression time| vmcore size
> zstd-3  4620.795194   31720632985
> zstd-2  4545.636437   31716847503
> zstd-1  4516.076298   32113300399
> zstd0   4663.17618    30967496299
> zstd1   4618.386313   31010305809
> zstd2   4633.535771   31005073344
> zstd3   4673.240663   30967855841
> zstd4   4771.1416     30965914853
> lzo     4801.958368   34920417584
> zlib    4442.257105   43482765168
> snappy  4433.957005   38594790371
> 
> As for the decompression, I didn't get a meaningful value, because the vmcore 
> size
> were too large, and the most time was spent on disk I/O, thus the 
> decompression time
> measurement didn't show an obvious difference.
> 
> I agree the compression level 1 and 2 don't have a big difference. I'm OK with
> your preference.

OK, thank you for the testing!  As we have tested, the compression level 1
and 2 often change places each other, let's choose 1 for general speed.

I will merge the series with some adjustments, please wait for a while.

> 
> >
> > Results:
> > * RHEL8.4 with libzstd-1.4.4 / 64GB filled with QEMU memory/images mainly
> > # free
> >               total        used        free      shared  buff/cache   
> > available
> > Mem:       65599824    21768028      549364        4668    43282432    
> > 43078828
> > Swap:      32964604     4827916    28136688
> >
> >        makedumpfile -d 1           makedumpfile -d 31
> >        copy sec.   write bytes     copy sec.  write bytes
> > zstd1  220.979689  26456659213     9.014176   558845000
> > zstd2  227.774602  26402437190     9.078599   560681256
> > lzo     83.406291  33078995065     3.603778   810219860
> >
> > * RHEL with libzstd-1.5.0 / 64GB filled with kernel source code mainly
> > # free
> >                total        used        free      shared  buff/cache   
> > available
> > Mem:        65329632     9925536      456020    53086068    54948076     
> > 1549088
> > Swap:       32866300     1607424    31258876
> >
> >        makedumpfile -d 1           makedumpfile -d 31
> > zstd1  520.844189  15537080819     53.494782  1200754023
> > zstd2  533.912451  15469575651     53.641510  1199561609
> > lzo    233.370800  20780821165     23.281374  1740041245
> >
> > (Used /proc/kcore, so not stable memory, but measured zstd 3 times and
> > picked the middle elapsed time.)
> >
> 
> Thanks for sharing the results. Just for curiosity, can you share your way
> of testing as well? I can improve mine for later use.

I did these:
(1) fill memory
- the former case: on a KVM host running over 100 days with 8 guests
  $ cat guest.img > /dev/null  for some images until swap is used.
- the latter case: tar xf linux-5.14.tar.xz and copy multiple times
  into /dev/shm until swap is used.

(2) run makedumpfile for /proc/kcore
I also used the command you used and picked up the elapsed time of
"Copying data", to measure only the compression time, and size of
"Write bytes".

# makedumpfile -z -d 1 --dry-run --show-stat /proc/kcore vmcore
...
...[Copying data               ] : 9.463352 seconds
...
Write bytes     : 535151008

Thanks,
Kazu

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to