]> xenbits.xensource.com Git - libvirt.git/commitdiff
virnetdevbandwidth: Compute quantum value
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 2 Feb 2016 11:48:44 +0000 (12:48 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Fri, 5 Feb 2016 15:43:19 +0000 (16:43 +0100)
I've noticed couple of warning in dmesg while debugging
something:

[ 9683.973754] HTB: quantum of class 10001 is big. Consider r2q change.
[ 9683.976460] HTB: quantum of class 10002 is big. Consider r2q change.

I've read the HTB documentation and linux kernel code to find out
what's wrong. Basically we need to pass another argument
"quantum" to our tc cmd line because the default computed by HTB
does not always work in which case the warning message is printed
out.

You can read more details here:

http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm#sharing

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/util/virnetdevbandwidth.c
tests/virnetdevbandwidthtest.c

index da3a0d327ea21879e2da5f10701015f38eec0297..4e4ac617beb958a6a9961a8e5207429bb0f91f86 100644 (file)
@@ -43,6 +43,29 @@ virNetDevBandwidthFree(virNetDevBandwidthPtr def)
     VIR_FREE(def);
 }
 
+static void
+virNetDevBandwidthCmdAddOptimalQuantum(virCommandPtr cmd,
+                                       const virNetDevBandwidthRate *rate)
+{
+    const unsigned long long mtu = 1500;
+    unsigned long long r2q;
+
+    /* When two or more classes compete for unused bandwidth they are each
+     * given some number of bytes before serving other competing class. This
+     * number is called quantum. It's advised in HTB docs that the number
+     * should be equal to MTU. The class quantum is computed from its rate
+     * divided by global r2q parameter. However, if rate is too small the
+     * default value will not suffice and thus we must provide our own value.
+     * */
+
+    r2q = rate->average * 1024 / 8 / mtu;
+    if (!r2q)
+        r2q = 1;
+
+    virCommandAddArg(cmd, "quantum");
+    virCommandAddArgFormat(cmd, "%llu", r2q);
+}
+
 /**
  * virNetDevBandwidthManipulateFilter:
  * @ifname: interface to operate on
@@ -280,6 +303,7 @@ virNetDevBandwidthSet(const char *ifname,
             virCommandAddArgList(cmd, "class", "add", "dev", ifname, "parent",
                                  "1:", "classid", "1:1", "htb", "rate", average,
                                  "ceil", peak ? peak : average, NULL);
+            virNetDevBandwidthCmdAddOptimalQuantum(cmd, bandwidth->in);
             if (virCommandRun(cmd, NULL) < 0)
                 goto cleanup;
         }
@@ -295,6 +319,7 @@ virNetDevBandwidthSet(const char *ifname,
         if (burst)
             virCommandAddArgList(cmd, "burst", burst, NULL);
 
+        virNetDevBandwidthCmdAddOptimalQuantum(cmd, bandwidth->in);
         if (virCommandRun(cmd, NULL) < 0)
             goto cleanup;
 
@@ -549,6 +574,7 @@ virNetDevBandwidthPlug(const char *brname,
     virCommandAddArgList(cmd, "class", "add", "dev", brname, "parent", "1:1",
                          "classid", class_id, "htb", "rate", floor,
                          "ceil", ceil, NULL);
+    virNetDevBandwidthCmdAddOptimalQuantum(cmd, bandwidth->in);
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
@@ -672,6 +698,7 @@ virNetDevBandwidthUpdateRate(const char *ifname,
     virCommandAddArgList(cmd, "class", "change", "dev", ifname,
                          "classid", class_id, "htb", "rate", rate,
                          "ceil", ceil, NULL);
+    virNetDevBandwidthCmdAddOptimalQuantum(cmd, bandwidth->in);
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
index 5a3f02cef0085748cc2e309e19308bb8193d92e4..b29318e7c147fcfba85d1527a2ef326baceb0841 100644 (file)
@@ -137,7 +137,7 @@ mymain(void)
                 (TC " qdisc del dev eth0 root\n"
                  TC " qdisc del dev eth0 ingress\n"
                  TC " qdisc add dev eth0 root handle 1: htb default 1\n"
-                 TC " class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps\n"
+                 TC " class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps quantum 87\n"
                  TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10\n"
                  TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1\n"));
 
@@ -157,7 +157,7 @@ mymain(void)
                 (TC " qdisc del dev eth0 root\n"
                  TC " qdisc del dev eth0 ingress\n"
                  TC " qdisc add dev eth0 root handle 1: htb default 1\n"
-                 TC " class add dev eth0 parent 1: classid 1:1 htb rate 1kbps ceil 2kbps burst 4kb\n"
+                 TC " class add dev eth0 parent 1: classid 1:1 htb rate 1kbps ceil 2kbps burst 4kb quantum 1\n"
                  TC " qdisc add dev eth0 parent 1:1 handle 2: sfq perturb 10\n"
                  TC " filter add dev eth0 parent 1:0 protocol all prio 1 handle 1 fw flowid 1\n"
                  TC " qdisc add dev eth0 ingress\n"