[pve-devel] r5634 - in qemu-server/pve2: . PVE

svn-commits at proxmox.com svn-commits at proxmox.com
Wed Mar 2 13:17:29 CET 2011


Author: dietmar
Date: 2011-03-02 13:17:29 +0100 (Wed, 02 Mar 2011)
New Revision: 5634

Modified:
   qemu-server/pve2/ChangeLog
   qemu-server/pve2/PVE/QemuServer.pm
   qemu-server/pve2/pve-bridge
Log:
add traffic shaping


Modified: qemu-server/pve2/ChangeLog
===================================================================
--- qemu-server/pve2/ChangeLog	2011-03-02 06:01:52 UTC (rev 5633)
+++ qemu-server/pve2/ChangeLog	2011-03-02 12:17:29 UTC (rev 5634)
@@ -1,3 +1,9 @@
+2011-03-02  Proxmox Support Team  <support at proxmox.com>
+
+	* PVE/QemuServer.pm (parse_net): new 'rate' option.
+
+	* pve-bridge: add traffic shaping
+
 2011-02-25  Proxmox Support Team  <support at proxmox.com>
 
 	* PVE/QemuServer.pm: changed network config systax. We now use

Modified: qemu-server/pve2/PVE/QemuServer.pm
===================================================================
--- qemu-server/pve2/PVE/QemuServer.pm	2011-03-02 06:01:52 UTC (rev 5633)
+++ qemu-server/pve2/PVE/QemuServer.pm	2011-03-02 12:17:29 UTC (rev 5634)
@@ -410,7 +410,7 @@
 my $netdesc = {
     optional => 1,
     type => 'string', format => 'pve-qm-net',
-    typetext => "MODEL=XX:XX:XX:XX:XX:XX [,bridge=<dev>]",
+    typetext => "MODEL=XX:XX:XX:XX:XX:XX [,bridge=<dev>][,rate=<mbps>]",
     description => <<EODESCR,
 Specify network devices. 
 
@@ -421,6 +421,8 @@
 
 The bridge parameter can be used to automatically add the interface to a bridge device. The Proxmox VE standard bridge is called 'vmbr0'.
 
+Option 'rate' is used to limit traffic bandwidth from and to this interface. It is specified as floating point number, unit is 'Megabytes per second'.
+
 If you specify no bridge, we create a kvm 'user' (NATed) network device, which provides DHCP and DNS services. The following addresses are used:
 
 10.0.2.2   Gateway
@@ -850,7 +852,7 @@
 
 }
 
-# netX: e1000=XX:XX:XX:XX:XX:XX,bridge=vmbr0,
+# netX: e1000=XX:XX:XX:XX:XX:XX,bridge=vmbr0,rate=<mbps>
 sub parse_net {
     my ($data) = @_;
 
@@ -865,6 +867,8 @@
 	    $res->{macaddr} = $mac;
 	} elsif ($kvp =~ m/^bridge=(\S+)$/) {
 	    $res->{bridge} = $1;
+	} elsif ($kvp =~ m/^rate=(\d+(\.\d+)?)$/) {
+	    $res->{rate} = $1;
 	} else {
 	    return undef;
 	}
@@ -882,6 +886,7 @@
     my $res = "$net->{model}";
     $res .= "=$net->{macaddr}" if $net->{macaddr};
     $res .= ",bridge=$net->{bridge}" if $net->{bridge};
+    $res .= ",rate=$net->{rate}" if $net->{rate};
 
     return $res;
 }

Modified: qemu-server/pve2/pve-bridge
===================================================================
--- qemu-server/pve2/pve-bridge	2011-03-02 06:01:52 UTC (rev 5633)
+++ qemu-server/pve2/pve-bridge	2011-03-02 12:17:29 UTC (rev 5634)
@@ -2,6 +2,7 @@
 
 use strict;
 use PVE::QemuServer;
+use PVE::Tools qw(run_command);
 
 my $iface = shift;
 
@@ -26,6 +27,29 @@
 
 system ("/sbin/ifconfig $iface 0.0.0.0 promisc up") == 0 ||
     die "interface activation failed\n";
+
+if ($net->{rate}) {
+
+    my $rate = int($net->{rate}*1024*1024);
+    my $burst = 1024*1024;
+
+    system("/sbin/tc qdisc del dev $iface ingres >/dev/null 2>&1");
+    system("/sbin/tc qdisc del dev $iface root >/dev/null 2>&1");
+
+    run_command("/sbin/tc qdisc add dev $iface handle ffff: ingress");
+    run_command("/sbin/tc filter add dev $iface parent ffff: protocol ip prio 50 " . 
+		"u32 match ip src 0.0.0.0/0 police rate ${rate}bps " .
+		"burst ${burst}b drop flowid :1");
+
+    # tbf does not work for unknown reason
+    #$TC qdisc add dev $DEV root tbf rate $RATE latency 100ms burst $BURST
+
+    run_command("/sbin/tc qdisc add dev $iface root handle 1: htb default 1");
+    run_command("/sbin/tc class add dev $iface parent 1: classid 1:1 " .
+		"htb rate ${rate}bps burst ${burst}b");
+
+}
+
 system ("/usr/sbin/brctl addif $bridge $iface") == 0 ||
     die "can't add interface to bridge\n";
 



More information about the pve-devel mailing list