From: Max Reitz <mreitz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Peter Lieven <pl@kamp.de>,
Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 00/12] qcow2: Add new overlap check functions
Date: Tue, 25 Nov 2014 11:55:56 +0100 [thread overview]
Message-ID: <5474603C.2060606@redhat.com> (raw)
In-Reply-To: <1416844620-17717-1-git-send-email-mreitz@redhat.com>
On 2014-11-24 at 16:56, Max Reitz wrote:
> RAM usage
> =========
>
> So I have looked at my 2 GB image above, and the list uses 40 kB, which
> may or may not be too much (sounds completely fine to me for an image
> with 512 byte clusters); but it is a least a number I can use for
> testing the following theoretical inspection:
(I'm in the process of some kind of self-review right now)
Wrong, it's 371 kB after patch 1 is fixed.
[snip]
> Let's test that for the above image, which has a disk size of 266 MB:
Except the disk size doesn't matter; the image was created with
preallocation=metadata, therefore all the metadata for a 2 GB virtual
image is there. Let's check the file length: 2190559232, two percent
above 2 GB. Sounds reasonable.
For that file length, we actually have:
40 * 2190559232 / (512 * 512) = 326 kB
Hm, okay, so it doesn't work so well. The good message is: I know why.
In the calculation given here, I omitted the size of
Qcow2MetadataWindow; for every WINDOW_SIZE (= WS) clusters, there is one
such object. Let's include it in the calculation
(sizeof(Qcow2MetadataWindow) is 40 on my x64 system):
40 * IS / (CS * CS) + 40 * IS / (CS * WS)
= 40 * IS / CS * (1 / CS + 1 / WS)
Okay, something else I forgot? There is the Qcow2MetadataList object
itself; but we have it only once, so let's omit that. Then there is an
integer array with an entry per cache entry and the cache itself;
qcow2_create_empty_metadata_list() limits the cache size so that it that
integer array and the cached bitmaps will not surpass the given byte
size (currently 64 kB), so I'll just omit it as well (it's constant and
can easily be adjusted).
So, with the above term we have:
40 * 2190559232 / 512 * (1 / 512 + 1 / 4096) = 367 kB
Much better.
> 40 * 266M / (512 * 512) = 42 kB
>
> Great! It works.
>
>
> So, now let's set CS to 64 kB, because that is basically the only
> cluster size we really care about. For a 1 TB image, we need 10 kB for
> the list. Sounds great to me. For a 1 PB image, we will need 10 MB. Fair
> enough. (Note that you don't need 10 MB of RAM to create a 1 PB image;
> you only need that once the disk size of the image has reached 1 PB).
>
> And 1 TB with 512 byte clusters? 160 MB. Urgh, that is a lot. But then
> again, you can switch off the overlap check with overlap-check=off; and
> trying to actually use a 1 TB image with 512 byte clusters is crazy in
> itself (have you tried just creating one without preallocation? It takes
> forever). So I can live with that.
And with the fixed term:
1 TB / 64 kB: 170 kB
1 PB / 64 kB: 170 MB
1 TB / 512 B: 180 MB
The actually "problematic" 512 B cluster version actually doesn't get so
much worse (because 1 / 4096 < 1 / 512; whereas 1 / 4096 > 1 / 65536,
which is why fixing the term has a much higher impact on greater cluster
sizes).
But for the default of 64 kB, the size basically explodes. We now can
either choose to ignore that fact (17x is a lot, but using more than 1
MB starting from 6 TB still sounds fine to me) or increase WINDOW_SIZE
(to a maximum of 65536, which would reduce the RAM usage to 20 kB for a
1 TB image and 20 MB for a 1 PB image), which would probably somewhat
limit performance in the conversion case, but since I haven't seen any
issues for WINDOW_SIZE = 4096, I don't think it should make a huge
difference. But as a side effect, we will want to increase the cache
size, because with the current default of 64 kB, we will have only one
cached bitmap; but we probably want to have at least two, maybe four if
possible. But 256 kB does not sound too bad either.
> tl;dr
> =====
>
> * CPU usage at runtime decreased by 150 to 275 percent on
> overlap-check-heavy tasks
> * No additional performance problems at loading time (in theory has the
> same runtime complexity as a single overlap check right now; in
> practice I could not find any problems)
> * Decent RAM usage (40 kB for a 1 TB image with 64 kB clusters; 40 MB
> for a 1 PB image etc. pp.)
I'm not sure why I wrote 40 kB and 40 MB here; it was 10 kB and 10 MB.
Anyway, now it's 170 kB for a 1 TB image and 170 MB for a 1 PB image.
Max
next prev parent reply other threads:[~2014-11-25 10:56 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-24 15:56 [Qemu-devel] [PATCH v2 00/12] qcow2: Add new overlap check functions Max Reitz
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 01/12] " Max Reitz
2014-11-25 11:02 ` Max Reitz
2015-01-21 16:53 ` Stefan Hajnoczi
2015-01-21 22:12 ` Max Reitz
2015-02-03 23:08 ` Eric Blake
2015-02-04 16:29 ` Max Reitz
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 02/12] qcow2: Pull up overlap check option evaluation Max Reitz
2015-02-03 23:33 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 03/12] qcow2: Create metadata list Max Reitz
2015-02-03 23:34 ` Eric Blake
2015-02-04 16:31 ` Max Reitz
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 04/12] qcow2/overlaps: Protect image header Max Reitz
2015-02-03 23:47 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 05/12] qcow2/overlaps: Protect refcount table Max Reitz
2015-02-03 23:55 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 06/12] qcow2/overlaps: Protect refcount blocks Max Reitz
2015-02-05 1:24 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 07/12] qcow2/overlaps: Protect active L1 table Max Reitz
2015-02-05 1:25 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 08/12] qcow2/overlaps: Protect active L2 tables Max Reitz
2015-02-05 15:27 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 09/12] qcow2/overlaps: Protect snapshot table Max Reitz
2015-02-05 15:29 ` Eric Blake
2015-02-05 15:30 ` Max Reitz
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 10/12] qcow2/overlaps: Protect inactive L1 tables Max Reitz
2015-02-05 19:41 ` Eric Blake
2014-11-24 15:56 ` [Qemu-devel] [PATCH v2 11/12] qcow2/overlaps: Protect inactive L2 tables Max Reitz
2015-01-21 15:23 ` Stefan Hajnoczi
2015-01-21 16:07 ` Max Reitz
2014-11-24 15:57 ` [Qemu-devel] [PATCH v2 12/12] qcow2: Use new metadata overlap check function Max Reitz
2015-01-21 15:28 ` Stefan Hajnoczi
2014-11-24 16:56 ` [Qemu-devel] [PATCH v2 00/12] qcow2: Add new overlap check functions Eric Blake
2014-11-24 17:35 ` Max Reitz
2014-11-25 10:55 ` Max Reitz [this message]
2014-11-25 13:25 ` Stefan Hajnoczi
2014-12-15 9:43 ` Max Reitz
2015-01-20 22:48 ` Max Reitz
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=5474603C.2060606@redhat.com \
--to=mreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=pl@kamp.de \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).