Message ID | 1600137887-58739-9-git-send-email-zhengchuan@huawei.com |
---|---|
State | Superseded |
Headers | show |
Series | *** A Method for evaluating dirty page rate *** | expand |
Chuan Zheng <zhengchuan@huawei.com> 于2020年9月15日周二 上午10:34写道: > > In order to sample real RAM, skip ramblock with size below MIN_RAMBLOCK_SIZE > which is set as 128M. > > Signed-off-by: Chuan Zheng <zhengchuan@huawei.com> > Reviewed-by: David Edmondson <david.edmondson@oracle.com> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Li Qiang <liq3ea@gmail.com> > --- > migration/dirtyrate.c | 21 +++++++++++++++++++++ > migration/dirtyrate.h | 5 +++++ > 2 files changed, 26 insertions(+) > > diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c > index 2d48eb8..903f728 100644 > --- a/migration/dirtyrate.c > +++ b/migration/dirtyrate.c > @@ -138,6 +138,18 @@ static void get_ramblock_dirty_info(RAMBlock *block, > strcpy(info->idstr, qemu_ram_get_idstr(block)); > } > > +static bool skip_sample_ramblock(RAMBlock *block) > +{ > + /* > + * Sample only blocks larger than MIN_RAMBLOCK_SIZE. > + */ > + if (qemu_ram_get_used_length(block) < (MIN_RAMBLOCK_SIZE << 10)) { > + return true; > + } > + > + return false; > +} > + > static bool record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, > struct DirtyRateConfig config, > int *block_count) > @@ -150,6 +162,9 @@ static bool record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, > bool ret = false; > > RAMBLOCK_FOREACH_MIGRATABLE(block) { > + if (skip_sample_ramblock(block)) { > + continue; > + } > total_count++; > } > > @@ -159,6 +174,9 @@ static bool record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, > } > > RAMBLOCK_FOREACH_MIGRATABLE(block) { > + if (skip_sample_ramblock(block)) { > + continue; > + } > if (index >= total_count) { > break; > } > @@ -225,6 +243,9 @@ static bool compare_page_hash_info(struct RamblockDirtyInfo *info, > RAMBlock *block = NULL; > > RAMBLOCK_FOREACH_MIGRATABLE(block) { > + if (skip_sample_ramblock(block)) { > + continue; > + } > block_dinfo = find_page_matched(block, block_count, info); > if (block_dinfo == NULL) { > continue; > diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h > index a3ee305..faaf9da 100644 > --- a/migration/dirtyrate.h > +++ b/migration/dirtyrate.h > @@ -24,6 +24,11 @@ > */ > #define RAMBLOCK_INFO_MAX_LEN 256 > > +/* > + * Minimum RAMBlock size to sample, in megabytes. > + */ > +#define MIN_RAMBLOCK_SIZE 128 > + > struct DirtyRateConfig { > uint64_t sample_pages_per_gigabytes; /* sample pages per GB */ > int64_t sample_period_seconds; /* time duration between two sampling */ > -- > 1.8.3.1 >
diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c index 2d48eb8..903f728 100644 --- a/migration/dirtyrate.c +++ b/migration/dirtyrate.c @@ -138,6 +138,18 @@ static void get_ramblock_dirty_info(RAMBlock *block, strcpy(info->idstr, qemu_ram_get_idstr(block)); } +static bool skip_sample_ramblock(RAMBlock *block) +{ + /* + * Sample only blocks larger than MIN_RAMBLOCK_SIZE. + */ + if (qemu_ram_get_used_length(block) < (MIN_RAMBLOCK_SIZE << 10)) { + return true; + } + + return false; +} + static bool record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, struct DirtyRateConfig config, int *block_count) @@ -150,6 +162,9 @@ static bool record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, bool ret = false; RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block)) { + continue; + } total_count++; } @@ -159,6 +174,9 @@ static bool record_ramblock_hash_info(struct RamblockDirtyInfo **block_dinfo, } RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block)) { + continue; + } if (index >= total_count) { break; } @@ -225,6 +243,9 @@ static bool compare_page_hash_info(struct RamblockDirtyInfo *info, RAMBlock *block = NULL; RAMBLOCK_FOREACH_MIGRATABLE(block) { + if (skip_sample_ramblock(block)) { + continue; + } block_dinfo = find_page_matched(block, block_count, info); if (block_dinfo == NULL) { continue; diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h index a3ee305..faaf9da 100644 --- a/migration/dirtyrate.h +++ b/migration/dirtyrate.h @@ -24,6 +24,11 @@ */ #define RAMBLOCK_INFO_MAX_LEN 256 +/* + * Minimum RAMBlock size to sample, in megabytes. + */ +#define MIN_RAMBLOCK_SIZE 128 + struct DirtyRateConfig { uint64_t sample_pages_per_gigabytes; /* sample pages per GB */ int64_t sample_period_seconds; /* time duration between two sampling */