[Crash-utility] [PATCH v2] diskdump: use mmap/madvise to improve the start-up
HAGIO KAZUHITO(萩尾 一仁)
k-hagio-ab at nec.com
Wed Apr 6 02:07:47 UTC 2022
-----Original Message-----
> 1.) The bitmap of vmcore file can be very big in the server kernel panic,
> such as over 256M.
>
> This patch uses mmap/madvise to improve the read speed
> of the bitmap in the non-FLAT_FORMAT code path.
>
> Use MADV_WILLNEED for madvise, it will trigger read ahead for
> reading the bitmap.
Thanks for the update.
With removing the unused variables (will be fixed when merging),
Acked-by: Kazuhito Hagio <k-hagio-ab at nec.com>
$ make clean ; make warn
diskdump.c: In function ‘read_dump_header’:
diskdump.c:543:10: warning: unused variable ‘bytes_read’ [-Wunused-variable]
ssize_t bytes_read;
^~~~~~~~~~
diskdump.c:542:9: warning: unused variable ‘len’ [-Wunused-variable]
size_t len;
^~~
diskdump.c:541:8: warning: unused variable ‘bufptr’ [-Wunused-variable]
char *bufptr;
^~~~~~
As for a second ack, please wait for a while.
Lianbo is taking a leave and will be back soon.
Thanks,
Kazu
>
> 2.) Test.
>
> The files:
> vmlinux: 272M
> vmcore : 23G (bitmap_len: 4575985664)
>
> #cat ./commands.txt
> quit
>
> Before this patch:
> #echo 3 > /proc/sys/vm/drop_caches;
> #time ./crash -i ./commands.txt /root/t/vmlinux /root/t/vmcore > /dev/null 2>&1
> ............................
> real 0m55.217s
> user 0m15.114s
> sys 0m3.560s
> ............................
>
> After this patch:
> #echo 3 > /proc/sys/vm/drop_caches;
> #time ./crash -i ./commands.txt /root/t/vmlinux /root/t/vmcore > /dev/null 2>&1
> ............................
> real 0m44.097s
> user 0m19.031s
> sys 0m1.620s
> ............................
>
> Signed-off-by: Huang Shijie <shijie at os.amperecomputing.com>
> ---
> v1 --> v2:
> Use MADV_WILLNEED for mmap, not MADV_SEQUENTIAL.
>
> ---
> diskdump.c | 39 ++++++++++++++++-----------------------
> 1 file changed, 16 insertions(+), 23 deletions(-)
>
> diff --git a/diskdump.c b/diskdump.c
> index ff1e9a3..102062b 100644
> --- a/diskdump.c
> +++ b/diskdump.c
> @@ -724,10 +724,6 @@ restart:
>
> offset = (off_t)block_size * (1 + header->sub_hdr_size);
>
> - if ((dd->bitmap = malloc(bitmap_len)) == NULL)
> - error(FATAL, "%s: cannot malloc bitmap buffer\n",
> - DISKDUMP_VALID() ? "diskdump" : "compressed kdump");
> -
> dd->dumpable_bitmap = calloc(bitmap_len, 1);
>
> if (CRASHDEBUG(8))
> @@ -736,30 +732,23 @@ restart:
> (ulonglong)offset);
>
> if (FLAT_FORMAT()) {
> + if ((dd->bitmap = malloc(bitmap_len)) == NULL)
> + error(FATAL, "%s: cannot malloc bitmap buffer\n",
> + DISKDUMP_VALID() ? "diskdump" : "compressed kdump");
> +
> if (!read_flattened_format(dd->dfd, offset, dd->bitmap, bitmap_len)) {
> error(INFO, "%s: cannot read memory bitmap\n",
> DISKDUMP_VALID() ? "diskdump" : "compressed kdump");
> goto err;
> }
> } else {
> - if (lseek(dd->dfd, offset, SEEK_SET) == failed) {
> - error(INFO, "%s: cannot lseek memory bitmap\n",
> + dd->bitmap = mmap(NULL, bitmap_len, PROT_READ,
> + MAP_SHARED, dd->dfd, offset);
> + if (dd->bitmap == MAP_FAILED)
> + error(FATAL, "%s: cannot mmap bitmap buffer\n",
> DISKDUMP_VALID() ? "diskdump" : "compressed kdump");
> - goto err;
> - }
> - bufptr = dd->bitmap;
> - len = bitmap_len;
> - while (len) {
> - bytes_read = read(dd->dfd, bufptr, len);
> - if (bytes_read <= 0) {
> - error(INFO, "%s: cannot read memory bitmap\n",
> - DISKDUMP_VALID() ? "diskdump"
> - : "compressed kdump");
> - goto err;
> - }
> - len -= bytes_read;
> - bufptr += bytes_read;
> - }
> +
> + madvise(dd->bitmap, bitmap_len, MADV_WILLNEED);
> }
>
> if (dump_is_partial(header))
> @@ -920,8 +909,12 @@ err:
> free(sub_header);
> if (sub_header_kdump)
> free(sub_header_kdump);
> - if (dd->bitmap)
> - free(dd->bitmap);
> + if (dd->bitmap) {
> + if (FLAT_FORMAT())
> + free(dd->bitmap);
> + else
> + munmap(dd->bitmap, dd->bitmap_len);
> + }
> if (dd->dumpable_bitmap)
> free(dd->dumpable_bitmap);
> if (dd->notes_buf)
> --
> 2.30.2
More information about the Crash-utility
mailing list