zstd has better compression ratio and time consumption balance than zlib/lzo/snappy. When no customized compression method specified in kdump.conf, we will use zstd as the default compression method.
**The test method:
I installed kexec-tools with and without the patch, executing the following command for 4 times, and calculate the averange time:
$ rm -f /boot/initramfs-*kdump.img && time kdumpctl rebuild && \ ls -ail /boot/initramfs-*kdump.img
**The test result:
Bare metal x86_64 machine: dracut with squash module | dracut without sqaush module zlib zstd | zlib zstd real 10.6282 10.1676 | 9.509 10.267 user 9.8932 8.6468 | 10.6028 9.0936 sys 3.523 3.4942 | 2.942 3.0662 | size of | kdump.img 30575616 29236224 | 19247949 17007764
PowerVM hosted ppc64le VM: dracut with squash module | dracut without sqaush module zlib zstd | zlib zstd real 10.6742 10.7572 | 9.7676 10.5722 user 18.754 19.8338 | 20.7932 13.179 sys 1.8358 1.864 | 1.637 1.663 | size of | kdump.img 36917248 35467264 | 21441323 19007108
**discussion
As for the file size of kdump.img, zstd makes a smaller size, which is benificial for kdump kernel limited memory.
As for the time consumption for compression when making kdump.img, zstd doesn't show a clear advance than zlib.
v1 -> v2: Use kdump_get_conf_val() to get dracut_args values of kdump.conf
v2 -> v3: Attached testing benchmark
v3 -> v4: Re-measured and re-attached the testing benchmark of x86_64 and ppc64le. Changed regex '.*[[:space:]]' to '(^|[[:space:]])'
As for the time consumption differences between v3 and v4, I think it is due to v3 was measured on a ppc64le VM. There were I/O performance downgration when other VMs were accessing I/O device at the same time, which I didn't get repetted in v4.
Signed-off-by: Tao Liu ltao@redhat.com --- kdump-lib.sh | 6 ++++++ mkdumprd | 4 ++++ mkfadumprd | 4 ++++ 3 files changed, 14 insertions(+)
diff --git a/kdump-lib.sh b/kdump-lib.sh index e435498..6d668a5 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -443,6 +443,12 @@ is_wdt_active() return 1 }
+have_compression_in_dracut_args() +{ + [[ "$(kdump_get_conf_val dracut_args)" =~ \ + (^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress)([[:space:]]|$) ]] +} + # If "dracut_args" contains "--mount" information, use it # directly without any check(users are expected to ensure # its correctness). diff --git a/mkdumprd b/mkdumprd index d87d588..9c26ecc 100644 --- a/mkdumprd +++ b/mkdumprd @@ -431,6 +431,10 @@ done <<< "$(kdump_read_conf)"
handle_default_dump_target
+if ! have_compression_in_dracut_args; then + add_dracut_arg "--compress" "zstd" +fi + if [[ -n $extra_modules ]]; then add_dracut_arg "--add-drivers" "$extra_modules" fi diff --git a/mkfadumprd b/mkfadumprd index b890f83..16fdacc 100644 --- a/mkfadumprd +++ b/mkfadumprd @@ -62,6 +62,10 @@ if is_squash_available; then _dracut_isolate_args+=(--add squash) fi
+if ! have_compression_in_dracut_args; then + _dracut_isolate_args+=(--compress zstd) +fi + if ! dracut --force --quiet "${_dracut_isolate_args[@]}" "$@" "$TARGET_INITRD"; then perror_exit "mkfadumprd: failed to setup '$TARGET_INITRD' with dump capture capability" fi