[RFC PATCH 0/4] makedumpfile: cyclic processing to keep memory consumption.
Atsushi Kumagai
kumagai-atsushi at mxc.nes.nec.co.jp
Mon Jun 4 03:54:49 EDT 2012
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.
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
More information about the kexec
mailing list