[PATCH v4 8/8] add a new interface to show the memory usage of 1st kernel
Baoquan He
bhe at redhat.com
Mon Aug 25 00:03:35 PDT 2014
Forgot updating the git log with v4 change.
Have posted new one, please review v5.
On 08/25/14 at 11:33am, Baoquan He wrote:
> Recently people complained that they don't know how to decide how
> much disk size need be reserved for kdump. E.g there are lots of
> machines with different memory size, if the memory usage information
> of current system can be shown, that can help them to make an estimate
> how much storage space need be reserved.
>
> In this patch, a new interface is added into makedumpfile. By the
> help of this, people can know the page number of memory in different
> use. The implementation is analyzing the "System Ram" and "kernel text"
> program segment of /proc/kcore excluding the crashkernel range, then
> calculating the page number of different kind per vmcoreinfo.
>
> The print is like below:
> ->$ ./makedumpfile --mem-usage /proc/kcore
> Excluding unnecessary pages : [100.0 %] |
>
> Page number of memory in different use
> --------------------------------------------------
> TYPE PAGES EXCLUDABLE DESCRIPTION
> ZERO 0 yes Pages filled with zero
> CACHE 562006 yes Cache pages
> CACHE_PRIVATE 353502 yes Cache pages + private
> USER 225780 yes User process pages
> FREE 2761884 yes Free pages
> KERN_DATA 235873 no Dumpable kernel data
>
> Total pages on system: 4139045
>
> Signed-off-by: Baoquan He <bhe at redhat.com>
> ---
> makedumpfile.8 | 17 +++++++++++++
> makedumpfile.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> makedumpfile.h | 2 ++
> print_info.c | 8 +++++++
> 4 files changed, 103 insertions(+)
>
> diff --git a/makedumpfile.8 b/makedumpfile.8
> index 25fe74e..64abbc7 100644
> --- a/makedumpfile.8
> +++ b/makedumpfile.8
> @@ -532,6 +532,23 @@ it is necessary to specfiy [\-x \fIVMLINUX\fR] or [\-i \fIVMCOREINFO\fR].
> # makedumpfile \-\-dump-dmesg -x vmlinux /proc/vmcore dmesgfile
> .br
>
> +
> +.TP
> +\fB\-\-mem-usage\fR
> +This option is used to show the page numbers of current system in different
> +use. It should be executed in 1st kernel. By the help of this, user can know
> +how many pages is dumpable when different dump_level is specified. It analyzes
> +the 'System Ram' and 'kernel text' program segment of /proc/kcore excluding
> +the crashkernel range, then calculates the page number of different kind per
> +vmcoreinfo. So currently /proc/kcore need be specified explicitly.
> +
> +.br
> +.B Example:
> +.br
> +# makedumpfile \-\-mem-usage /proc/kcore
> +.br
> +
> +
> .TP
> \fB\-\-diskset=VMCORE\fR
> Specify multiple \fIVMCORE\fRs created on sadump diskset configuration
> diff --git a/makedumpfile.c b/makedumpfile.c
> index c8d1299..87cca71 100644
> --- a/makedumpfile.c
> +++ b/makedumpfile.c
> @@ -7955,6 +7955,7 @@ print_mem_usage(void)
> shrinking = shrinking / pfn_original;
>
> MSG("\n");
> + MSG("\n");
> MSG("Page number of memory in different use\n");
> MSG("--------------------------------------------------\n");
> MSG("TYPE PAGES EXCLUDABLE DESCRIPTION\n");
> @@ -9008,6 +9009,13 @@ check_param_for_creating_dumpfile(int argc, char *argv[])
> */
> info->name_memory = argv[optind];
>
> + } else if ((argc == optind + 1) && info->flag_mem_usage) {
> + /*
> + * Parameter for showing the page number of memory
> + * in different use from.
> + */
> + info->name_memory = argv[optind];
> +
> } else
> return FALSE;
>
> @@ -9252,6 +9260,58 @@ static int get_sys_kernel_vmcoreinfo(uint64_t *addr, uint64_t *len)
> return TRUE;
> }
>
> +int show_mem_usage(void)
> +{
> + uint64_t vmcoreinfo_addr, vmcoreinfo_len;
> +
> + if (!is_crashkernel_mem_reserved()) {
> + ERRMSG("No memory is reserved for crashkenrel!\n");
> + return FALSE;
> + }
> +
> +
> + if (!info->flag_cyclic)
> + info->flag_cyclic = TRUE;
> +
> + info->dump_level = MAX_DUMP_LEVEL;
> +
> + if (!get_page_offset())
> + return FALSE;
> +
> + if (!open_dump_memory())
> + return FALSE;
> +
> + if (!get_elf_loads(info->fd_memory, info->name_memory))
> + return FALSE;
> +
> + if (!get_sys_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len))
> + return FALSE;
> +
> + if (!set_kcore_vmcoreinfo(vmcoreinfo_addr, vmcoreinfo_len))
> + return FALSE;
> +
> + if (!get_kcore_dump_loads())
> + return FALSE;
> +
> + if (!initial())
> + return FALSE;
> +
> +
> + if (!prepare_bitmap2_buffer_cyclic())
> + return FALSE;
> +
> + info->num_dumpable = get_num_dumpable_cyclic();
> +
> + free_bitmap2_buffer_cyclic();
> +
> + print_mem_usage();
> +
> + if (!close_files_for_creating_dumpfile())
> + return FALSE;
> +
> + return TRUE;
> +}
> +
>
> static struct option longopts[] = {
> {"split", no_argument, NULL, OPT_SPLIT},
> @@ -9269,6 +9329,7 @@ static struct option longopts[] = {
> {"cyclic-buffer", required_argument, NULL, OPT_CYCLIC_BUFFER},
> {"eppic", required_argument, NULL, OPT_EPPIC},
> {"non-mmap", no_argument, NULL, OPT_NON_MMAP},
> + {"mem-usage", no_argument, NULL, OPT_MEM_USAGE},
> {0, 0, 0, 0}
> };
>
> @@ -9360,6 +9421,9 @@ main(int argc, char *argv[])
> case OPT_DUMP_DMESG:
> info->flag_dmesg = 1;
> break;
> + case OPT_MEM_USAGE:
> + info->flag_mem_usage = 1;
> + break;
> case OPT_COMPRESS_SNAPPY:
> info->flag_compress = DUMP_DH_COMPRESSED_SNAPPY;
> break;
> @@ -9500,6 +9564,18 @@ main(int argc, char *argv[])
>
> MSG("\n");
> MSG("The dmesg log is saved to %s.\n", info->name_dumpfile);
> + } else if (info->flag_mem_usage) {
> + if (!check_param_for_creating_dumpfile(argc, argv)) {
> + MSG("Commandline parameter is invalid.\n");
> + MSG("Try `makedumpfile --help' for more information.\n");
> + goto out;
> + }
> +
> + if (!show_mem_usage())
> + goto out;
> +
> + MSG("\n");
> + MSG("Showing page number of memory in different use successfully.\n");
> } else {
> if (!check_param_for_creating_dumpfile(argc, argv)) {
> MSG("Commandline parameter is invalid.\n");
> diff --git a/makedumpfile.h b/makedumpfile.h
> index e83bd95..6ee4cae 100644
> --- a/makedumpfile.h
> +++ b/makedumpfile.h
> @@ -978,6 +978,7 @@ struct DumpInfo {
> int flag_force; /* overwrite existing stuff */
> int flag_exclude_xen_dom;/* exclude Domain-U from xen-kdump */
> int flag_dmesg; /* dump the dmesg log out of the vmcore file */
> + int flag_mem_usage; /*show the page number of memory in different use*/
> int flag_use_printk_log; /* did we read printk_log symbol name? */
> int flag_nospace; /* the flag of "No space on device" error */
> int flag_vmemmap; /* kernel supports vmemmap address space */
> @@ -1867,6 +1868,7 @@ struct elf_prstatus {
> #define OPT_CYCLIC_BUFFER OPT_START+11
> #define OPT_EPPIC OPT_START+12
> #define OPT_NON_MMAP OPT_START+13
> +#define OPT_MEM_USAGE OPT_START+14
>
> /*
> * Function Prototype.
> diff --git a/print_info.c b/print_info.c
> index 7592690..29db918 100644
> --- a/print_info.c
> +++ b/print_info.c
> @@ -264,6 +264,14 @@ print_usage(void)
> MSG(" LOGFILE. If a VMCORE does not contain VMCOREINFO for dmesg, it is\n");
> MSG(" necessary to specfiy [-x VMLINUX] or [-i VMCOREINFO].\n");
> MSG("\n");
> + MSG(" [--mem-usage]:\n");
> + MSG(" This option is used to show the page numbers of current system in different\n");
> + MSG(" use. It should be executed in 1st kernel. By the help of this, user can know\n");
> + MSG(" how many pages is dumpable when different dump_level is specified. It analyzes\n");
> + MSG(" the 'System Ram' and 'kernel text' program segment of /proc/kcore excluding\n");
> + MSG(" the crashkernel range, then calculates the page number of different kind per\n");
> + MSG(" vmcoreinfo. So currently /proc/kcore need be specified explicitly.\n");
> + MSG("\n");
> MSG(" [-D]:\n");
> MSG(" Print debugging message.\n");
> MSG("\n");
> --
> 1.8.5.3
>
More information about the kexec
mailing list