qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@gmail.com>
To: Harald Schieche <rehs@gmx.de>
Cc: Stefan Weil <sw@weilnetz.de>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>,
	Anthony Liguori <aliguori@amazon.com>
Subject: Re: [Qemu-devel] [PATCH] Simple performance logging and network limiting based on trace option
Date: Wed, 29 Oct 2014 15:09:34 +0000	[thread overview]
Message-ID: <20141029150934.GF19774@stefanha-thinkpad.redhat.com> (raw)
In-Reply-To: <1414510422-8277-1-git-send-email-rehs@gmx.de>

[-- Attachment #1: Type: text/plain, Size: 2860 bytes --]

On Tue, Oct 28, 2014 at 04:33:42PM +0100, Harald Schieche wrote:

Missing commit description:

What problem are you trying to solve?

The "Signed-off-by" goes here.

> diff --git a/block/raw-posix.c b/block/raw-posix.c
> index 475cf74..3c5cc71 100644
> --- a/block/raw-posix.c
> +++ b/block/raw-posix.c
> @@ -1031,6 +1031,27 @@ static int aio_worker(void *arg)
>      return ret;
>  }
>  
> +static void log_guest_storage_performance(void)
> +{
> +    /*
> +     * Performance logging isn't specified yet.
> +     * Therefore we're using existing tracing.
> +     */
> +    static int64_t logged_clock;
> +    static int64_t counter;

There can be multiple threads, static variables will not work.

> +    int64_t clock = get_clock();
> +
> +    counter++;
> +    if (clock - logged_clock >= 1000000000LL) {

You are trying to identify calls to log_guest_storage_performance() that
are more than 1 second apart?  I'm not sure what you're trying to
measure.

It is simplest to have unconditional trace events and calculate
latencies during trace file analysis.  That way no arbitrary constants
like 1 second are hard-coded into QEMU.

> diff --git a/net/queue.c b/net/queue.c
> index f948318..2b0fef7 100644
> --- a/net/queue.c
> +++ b/net/queue.c
> @@ -23,7 +23,9 @@
>  
>  #include "net/queue.h"
>  #include "qemu/queue.h"
> +#include "qemu/timer.h"
>  #include "net/net.h"
> +#include "trace.h"
>  
>  /* The delivery handler may only return zero if it will call
>   * qemu_net_queue_flush() when it determines that it is once again able
> @@ -58,6 +60,15 @@ struct NetQueue {
>      unsigned delivering : 1;
>  };
>  
> +static int64_t bandwidth_limit;     /* maximum number of bits per second */

Throttling should be per-device, not global.

> +
> +void qemu_net_set_bandwidth_limit(int64_t limit)
> +{
> +    bandwidth_limit = limit;
> +    trace_qemu_net_set_bandwidth_limit(limit);
> +}
> +
> +
>  NetQueue *qemu_new_net_queue(void *opaque)
>  {
>      NetQueue *queue;
> @@ -175,6 +186,48 @@ static ssize_t qemu_net_queue_deliver_iov(NetQueue *queue,
>      return ret;
>  }
>  
> +static int64_t limit_network_performance(int64_t start_clock,
> +                                         int64_t bytes)
> +{
> +    int64_t clock = get_clock();
> +    int64_t sleep_usecs = 0;
> +    if (bandwidth_limit > 0) {
> +        sleep_usecs = (bytes * 8 * 1000000LL) / bandwidth_limit -
> +                      (clock - start_clock) / 1000LL;
> +    }
> +    if (sleep_usecs > 0) {
> +        usleep(sleep_usecs);

This does more than limit the network performance, it can also freeze
the guest.

QEMU is event-driven.  The event loop thread is not allowed to block or
sleep - otherwise the vcpu threads will block when they try to acquire
the QEMU global mutex.

[-- Attachment #2: Type: application/pgp-signature, Size: 473 bytes --]

  reply	other threads:[~2014-10-29 15:10 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-28 15:33 [Qemu-devel] [PATCH] Simple performance logging and network limiting based on trace option Harald Schieche
2014-10-29 15:09 ` Stefan Hajnoczi [this message]
2014-10-30 14:05   ` harald Schieche
2014-10-31 11:13     ` Stefan Hajnoczi

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=20141029150934.GF19774@stefanha-thinkpad.redhat.com \
    --to=stefanha@gmail.com \
    --cc=aliguori@amazon.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rehs@gmx.de \
    --cc=stefanha@redhat.com \
    --cc=sw@weilnetz.de \
    /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).