[RFC PATCH 0/4] makedumpfile: cyclic processing to keep memory consumption.

Maxim Uvarov muvarov at gmail.com
Mon Jun 4 04:29:07 EDT 2012


2012/6/4 Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>

> Hello Maxim,
>
> On Thu, 31 May 2012 10:50:39 +0400
> Maxim Uvarov <muvarov at gmail.com> wrote:
>
> > Atsushi,
> >
> > do you have speed measurements for saving vmcore with this patches and
> > without them?
> > How much is speed up?
> >
> > Thanks,
> > Maxim.
>
> After received your mail, I measured executing time with the patch below.
> The result below was measured in 5GB memory machine.
>
> Result:
>  a. makedumpfile -Kcd31
>    excluding time:   6.55 [sec]
>    writing time:     5.89 [sec]
>
>  b. makedumpfile -cd31
>    excluding time:   0.21 [sec]
>    writing time:     5.82 [sec]
>
> I don't think this result is good, the prototype has some points to be
> improved for performance.
> (e.g. buffer size, the way to exclude free pages, etc...)
>
> However, I think getting a bit of speed down can't be helped to keep
> memory consumption.
>
>
I'm asking because I have machines with several TBs of ram. And filtering
and saving data from vmcore takes long time. (more then 30 minutes). I
wonder if somebody already work on performance. Probably we can do SMP
optimizations.

Maxim.


>
> Thanks
> Atsushi Kumagai
>
>
> From 56e807066b333e3ef26afe8745deab8c952b5ca6 Mon Sep 17 00:00:00 2001
> From: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>
> Date: Mon, 4 Jun 2012 10:15:50 +0900
> Subject: [PATCH] [RFC PATCH] Add time report for cyclic processing.
>
> Signed-off-by: Atsushi Kumagai <kumagai-atsushi at mxc.nes.nec.co.jp>
> ---
>  makedumpfile.c |   25 +++++++++++++++++++++++++
>  makedumpfile.h |   11 +++++++++++
>  2 files changed, 36 insertions(+)
>
> diff --git a/makedumpfile.c b/makedumpfile.c
> index f4b6f83..a211a89 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -45,6 +45,9 @@ unsigned long long pfn_user;
>  unsigned long long pfn_free;
>  unsigned long long num_dumped;
>
> +double d_exclude_start, d_exclude_end, d_exclude_time;
> +double d_write_start, d_write_end, d_write_time;
> +
>  int retcd = FAILED;    /* return code */
>
>  #define INITIALIZE_LONG_TABLE(table, value) \
> @@ -4078,10 +4081,13 @@ create_dump_bitmap(void)
>        } else {
>                if (!prepare_bitmap_buffer())
>                        goto out;
> +               d_exclude_start = getdtime();
>                if (!create_1st_bitmap())
>                        goto out;
>                if (!create_2nd_bitmap())
>                        goto out;
> +               d_exclude_end = getdtime();
> +               d_exclude_time += d_exclude_end - d_exclude_start;
>        }
>
>        ret = TRUE;
> @@ -5500,12 +5506,15 @@ write_kdump_pages_and_bitmap_cyclic(struct
> cache_data *cd_header, struct cache_d
>        /*
>         * Get number of dumpable pages.
>         */
> +       d_exclude_start = getdtime();
>        for (info->split_start_pfn = 0, info->split_end_pfn = PFN_CYCLIC;
>             info->split_end_pfn <= info->max_mapnr;
>             info->split_start_pfn += PFN_CYCLIC, info->split_end_pfn +=
> PFN_CYCLIC) {
>
>                info->num_dumpable += get_num_dumpable_cyclic();
>        }
> +       d_exclude_end = getdtime();
> +       d_exclude_time += d_exclude_end - d_exclude_start;
>
>        /*
>         * Reset counter for debug message.
> @@ -5540,26 +5549,35 @@ write_kdump_pages_and_bitmap_cyclic(struct
> cache_data *cd_header, struct cache_d
>             info->split_end_pfn <= info->max_mapnr;
>             info->split_start_pfn += PFN_CYCLIC, info->split_end_pfn +=
> PFN_CYCLIC) {
>
> +               d_exclude_start = getdtime();
>                if (!create_1st_bitmap_cyclic())
>                        return FALSE;
>
>                if (!exclude_unnecessary_pages_cyclic())
>                        return FALSE;
> +               d_exclude_end = getdtime();
> +               d_exclude_time += d_exclude_end - d_exclude_start;
>
> +               d_write_start = getdtime();
>                if (!write_kdump_pages_cyclic(cd_header, cd_page, &pd_zero,
> &offset_data))
>                        return FALSE;
>
>                if (!write_kdump_bitmap_cyclic())
>                        return FALSE;
> +               d_write_end = getdtime();
> +               d_write_time += d_write_end - d_write_start;
>        }
>
>        /*
>         * Write the remainder.
>         */
> +       d_write_start = getdtime();
>        if (!write_cache_bufsz(cd_page))
>                return FALSE;
>        if (!write_cache_bufsz(cd_header))
>                return FALSE;
> +       d_write_end = getdtime();
> +       d_write_time += d_write_end - d_write_start;
>
>        return TRUE;
>  }
> @@ -6310,6 +6328,10 @@ print_report(void)
>        REPORT_MSG("--------------------------------------------------\n");
>        REPORT_MSG("Total pages     : 0x%016llx\n", info->max_mapnr);
>        REPORT_MSG("\n");
> +
> +       MSG("\n");
> +       MSG("excluding time  %lf [sec]\n", d_exclude_time);
> +       MSG("writing time: %lf [sec]\n", d_write_time);
>  }
>
>  int
> @@ -6349,10 +6371,13 @@ writeout_dumpfile(void)
>                if (!write_kdump_eraseinfo(&cd_page))
>                        goto out;
>        } else {
> +               d_write_start = getdtime();
>                if (!write_kdump_header())
>                        goto out;
>                if (!write_kdump_pages(&cd_header, &cd_page))
>                        goto out;
> +               d_write_end = getdtime();
> +               d_write_time = d_write_end - d_write_start;
>                if (!write_kdump_eraseinfo(&cd_page))
>                        goto out;
>                if (!write_kdump_bitmap())
> diff --git a/makedumpfile.h b/makedumpfile.h
> index a8aab2a..ca9b100 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -16,6 +16,7 @@
>  #ifndef _MAKEDUMPFILE_H
>  #define _MAKEDUMPFILE_H
>
> +#include <sys/time.h>
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <fcntl.h>
> @@ -1502,4 +1503,14 @@ struct elf_prstatus {
>
>  #endif
>
> +static inline double
> +getdtime(void)
> +{
> +       struct timeval tv;
> +
> +       gettimeofday(&tv, NULL);
> +
> +       return (double)tv.tv_sec + (double)tv.tv_usec * 0.001 * 0.001;
> +}
> +
>  #endif /* MAKEDUMPFILE_H */
> --
> 1.7.9.2
>



-- 
Best regards,
Maxim Uvarov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/kexec/attachments/20120604/ebadbb5c/attachment.html>


More information about the kexec mailing list