From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Chuan Zheng <zhengchuan@huawei.com>
Cc: zhang.zhanghailiang@huawei.com, quintela@redhat.com,
linyilu@huawei.com, qemu-devel@nongnu.org, alex.chen@huawei.com,
ann.zhuangyanying@huawei.com, fangying1@huawei.com
Subject: Re: [RFC PATCH 3/8] migration/dirtyrate: Add dirtyrate statistics series functions
Date: Tue, 4 Aug 2020 17:44:39 +0100 [thread overview]
Message-ID: <20200804164439.GF2659@work-vm> (raw)
In-Reply-To: <1595646669-109310-4-git-send-email-zhengchuan@huawei.com>
* Chuan Zheng (zhengchuan@huawei.com) wrote:
> From: Zheng Chuan <zhengchuan@huawei.com>
>
> Add dirtyrate statistics to record/update dirtyrate info.
>
> Signed-off-by: Zheng Chuan <zhengchuan@huawei.com>
> Signed-off-by: YanYing Zhang <ann.zhuangyanying@huawei.com>
> ---
> migration/dirtyrate.c | 47 ++++++++++++++++++++++++++++++-----------------
> migration/dirtyrate.h | 11 +++++++++++
> 2 files changed, 41 insertions(+), 17 deletions(-)
>
> diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c
> index fc652fb..6baf674 100644
> --- a/migration/dirtyrate.c
> +++ b/migration/dirtyrate.c
> @@ -13,19 +13,41 @@
> #include "dirtyrate.h"
>
> static uint64_t sample_pages_per_gigabytes = DIRTYRATE_DEFAULT_SAMPLE_PAGES;
> -static uint64_t dirty_rate; /* MB/s */
> +static struct dirtyrate_statistics dirty_stat;
> CalculatingDirtyRateStage calculating_dirty_rate_stage = CAL_DIRTY_RATE_INIT;
>
> -static bool calculate_dirtyrate(struct dirtyrate_config config,
> - uint64_t *dirty_rate, int64_t time)
> +static void reset_dirtyrate_stat(void)
> {
> - /* todo */
> - return true;
> + dirty_stat.total_dirty_samples = 0;
> + dirty_stat.total_sample_count = 0;
> + dirty_stat.total_block_mem_MB = 0;
> + dirty_stat.dirty_rate = 0;
> +}
> +
> +static void update_dirtyrate_stat(struct block_dirty_info *info)
> +{
> + dirty_stat.total_dirty_samples += info->sample_dirty_count;
> + dirty_stat.total_sample_count += info->sample_pages_count;
> + dirty_stat.total_block_mem_MB += (info->block_pages << DIRTYRATE_PAGE_SIZE_SHIFT) >> PAGE_SIZE_SHIFT;
> }
>
> -static void set_dirty_rate(uint64_t drate)
> +static void update_dirtyrate(int64_t msec)
> {
> - dirty_rate = drate;
> + uint64_t dirty_rate;
> + unsigned int total_dirty_samples = dirty_stat.total_dirty_samples;
> + unsigned int total_sample_count = dirty_stat.total_sample_count;
> + unsigned long total_block_mem_MB = dirty_stat.total_block_mem_MB;
> +
> + dirty_rate = total_dirty_samples * total_block_mem_MB *
> + 1000 / (total_sample_count * msec);
> +
> + dirty_stat.dirty_rate = dirty_rate;
> +}
> +
> +
> +static void calculate_dirtyrate(struct dirtyrate_config config, int64_t time)
> +{
> + /* todo */
> }
>
> /*
> @@ -42,21 +64,12 @@ static void set_dirty_rate_stage(CalculatingDirtyRateStage ratestage)
> void *get_dirtyrate_thread(void *arg)
> {
> struct dirtyrate_config config = *(struct dirtyrate_config *)arg;
> - uint64_t dirty_rate;
> - uint64_t hash_dirty_rate;
> - bool query_succ;
> int64_t msec = 0;
>
> set_dirty_rate_stage(CAL_DIRTY_RATE_ING);
>
> - query_succ = calculate_dirtyrate(config, &hash_dirty_rate, msec);
> - if (!query_succ) {
> - dirty_rate = 0;
> - } else {
> - dirty_rate = hash_dirty_rate;
> - }
All this was only just added; it might be easier to create the
update_dirtyrate function first.
> + calculate_dirtyrate(config, msec);
>
> - set_dirty_rate(dirty_rate);
> set_dirty_rate_stage(CAL_DIRTY_RATE_END);
>
> return NULL;
> diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h
> index 342b89f..2994535 100644
> --- a/migration/dirtyrate.h
> +++ b/migration/dirtyrate.h
> @@ -15,6 +15,9 @@
>
> /* take 256 pages per GB for cal dirty rate */
> #define DIRTYRATE_DEFAULT_SAMPLE_PAGES 256
> +#define DIRTYRATE_PAGE_SIZE_SHIFT 12
> +#define BLOCK_INFO_MAX_LEN 256
> +#define PAGE_SIZE_SHIFT 20
I think you might also have used one of these #define's in a previous
patch; so make sure the patches each compile in order.
Also, can you please comment each one of these - I was confused by a lot
of the calculations above because I don't quite understand what each of
these is.
I don't thinl 'BLOCK_INFO_MAX_LEN' is needed - becuase it's just a
RAMBlock ID, and you can link to the RAMBlock.
I'm not sure what DIRTYRATE_PAGE_SIZE_SHIFT is, or why it's different
from TARGET_PAGE_BITS.
>
> struct dirtyrate_config {
> uint64_t sample_pages_per_gigabytes;
> @@ -33,6 +36,14 @@ typedef enum {
> CAL_DIRTY_RATE_END = 2,
> } CalculatingDirtyRateStage;
>
> +struct dirtyrate_statistics {
> + unsigned int total_dirty_samples;
> + unsigned int total_sample_count;
> + unsigned long total_block_mem_MB;
'long' is normally a bad idea - we use it in a few places and it
was generally a bad idea; size_t for a size is much better.
> + int64_t dirty_rate;
Is this blocks/sec, MB/s what - please comment it.
Dave
> +};
> +
> +
> /*
> * Store dirtypage info for each block.
> */
> --
> 1.8.3.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-08-04 16:45 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-25 3:11 [RFC PATCH 0/8] *** A Method for evaluating dirty page rate *** Chuan Zheng
2020-07-25 3:11 ` [RFC PATCH 1/8] migration/dirtyrate: Add get_dirtyrate_thread() function Chuan Zheng
2020-08-04 16:23 ` Dr. David Alan Gilbert
2020-08-06 7:36 ` Zheng Chuan
2020-07-25 3:11 ` [RFC PATCH 2/8] migration/dirtyrate: Add block_dirty_info to store dirtypage info Chuan Zheng
2020-08-04 16:28 ` Dr. David Alan Gilbert
2020-08-06 7:37 ` Zheng Chuan
2020-08-06 16:59 ` Dr. David Alan Gilbert
2020-08-07 6:19 ` Zheng Chuan
2020-07-25 3:11 ` [RFC PATCH 3/8] migration/dirtyrate: Add dirtyrate statistics series functions Chuan Zheng
2020-08-04 16:44 ` Dr. David Alan Gilbert [this message]
2020-07-25 3:11 ` [RFC PATCH 4/8] migration/dirtyrate: Record hash results for each ramblock Chuan Zheng
2020-08-04 17:00 ` Dr. David Alan Gilbert
2020-08-06 7:37 ` Zheng Chuan
2020-07-25 3:11 ` [RFC PATCH 5/8] migration/dirtyrate: Compare hash results for recorded ramblock Chuan Zheng
2020-08-04 17:29 ` Dr. David Alan Gilbert
2020-08-11 8:42 ` Zheng Chuan
2020-07-25 3:11 ` [RFC PATCH 6/8] migration/dirtyrate: Implement get_sample_gap_period() and block_sample_gap_period() Chuan Zheng
2020-08-04 17:52 ` Dr. David Alan Gilbert
2020-07-25 3:11 ` [RFC PATCH 7/8] migration/dirtyrate: Implement calculate_dirtyrate() function Chuan Zheng
2020-08-04 17:57 ` Dr. David Alan Gilbert
2020-07-25 3:11 ` [RFC PATCH 8/8] migration/dirtyrate: Implement qmp_cal_dirty_rate()/qmp_get_dirty_rate() function Chuan Zheng
2020-08-04 16:28 ` Eric Blake
2020-08-06 7:37 ` Zheng Chuan
2020-08-04 16:34 ` Eric Blake
2020-08-04 18:02 ` Dr. David Alan Gilbert
2020-08-04 16:19 ` [RFC PATCH 0/8] *** A Method for evaluating dirty page rate *** Dr. David Alan Gilbert
2020-08-06 7:36 ` Zheng Chuan
2020-08-06 16:58 ` Dr. David Alan Gilbert
2020-08-07 6:13 ` Zheng Chuan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200804164439.GF2659@work-vm \
--to=dgilbert@redhat.com \
--cc=alex.chen@huawei.com \
--cc=ann.zhuangyanying@huawei.com \
--cc=fangying1@huawei.com \
--cc=linyilu@huawei.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=zhang.zhanghailiang@huawei.com \
--cc=zhengchuan@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.