ovs-vswitchd: Add --mlockall option and enable on XenServer.
authorBen Pfaff <blp@nicira.com>
Mon, 30 Nov 2009 21:17:34 +0000 (13:17 -0800)
committerBen Pfaff <blp@nicira.com>
Tue, 1 Dec 2009 17:24:59 +0000 (09:24 -0800)
On XenServer 5.5 we found that running 4 simultaneous vm-import operations
on iSCSI caused so much disk and cache activity that (we suspect) parts of
ovs-vswitchd were paged out to disk and were not paged back in for over
10 seconds, causing the XenServer to fall off the network and the XenCenter
connection to fail.

Locking ovs-vswitchd into memory appears to avoid this problem.  Henrik
reports that, with memory locking, importing 11 VMs simultaneously
completed successfully.

Bug #2344.

configure.ac
vswitchd/ovs-vswitchd.8.in
vswitchd/ovs-vswitchd.c
xenserver/etc_init.d_vswitch
xenserver/root_vswitch_scripts_sysconfig.template

index 86cbe1607479a82c076290fe5aa411c2e670f44d..55df342b0c1dc0d289e862688f0c04351f155e6a 100644 (file)
@@ -46,6 +46,7 @@ OVS_CHECK_LINUX_VT_H
 OVS_CHECK_PCRE
 OVS_CHECK_IF_PACKET
 OVS_CHECK_STRTOK_R
+AC_CHECK_FUNCS([mlockall])
 
 OVS_CHECK_PKIDIR
 OVS_CHECK_RUNDIR
index 5c8d6c77213b87593f29970f96b1993a6748b27e..e9c11f419a0cf844e0b5dc40b939ed28580b4a0e 100644 (file)
@@ -67,6 +67,17 @@ Open vSwitch distribution for instructions on how to build and load
 the Open vSwitch kernel module.
 .PP
 .SH OPTIONS
+.IP "\fB--mlockall\fR"
+Causes \fBovs\-vswitchd\fR to call the \fBmlockall()\fR function, to
+attempt to lock all of its process memory into physical RAM,
+preventing the kernel from paging any of its memory to disk.  This
+helps to avoid networking interruptions due to system memory pressure.
+.IP
+Some systems do not support \fBmlockall()\fR at all, and other systems
+only allow privileged users, such as the superuser, to use it.
+\fBovs\-vswitchd\fR emits a log message if \fBmlockall()\fR is
+unavailable or unsuccessful.
+.
 .IP "\fB--fake-proc-net\fR"
 Causes \fBovs\-vswitchd\fR to simulate some files in \fB/proc/net/vlan\fR
 and \fB/proc/net/bonding\fR that some legacy software expects to
index 01645adf9e27a71f33327bd77a7b20cc5acfa271..3309c080d0793ec8bf1347b52c18085467ac1e08 100644 (file)
@@ -22,6 +22,9 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
+#ifdef HAVE_MLOCKALL
+#include <sys/mman.h>
+#endif
 
 #include "bridge.h"
 #include "cfg.h"
@@ -148,6 +151,7 @@ parse_options(int argc, char *argv[])
 {
     enum {
         OPT_PEER_CA_CERT = UCHAR_MAX + 1,
+        OPT_MLOCKALL,
         OPT_FAKE_PROC_NET,
         VLOG_OPTION_ENUMS,
         LEAK_CHECKER_OPTION_ENUMS
@@ -155,6 +159,7 @@ parse_options(int argc, char *argv[])
     static struct option long_options[] = {
         {"help",        no_argument, 0, 'h'},
         {"version",     no_argument, 0, 'V'},
+        {"mlockall",    no_argument, 0, OPT_MLOCKALL},
         {"fake-proc-net", no_argument, 0, OPT_FAKE_PROC_NET},
         DAEMON_LONG_OPTIONS,
         VLOG_LONG_OPTIONS,
@@ -186,6 +191,16 @@ parse_options(int argc, char *argv[])
             OVS_PRINT_VERSION(OFP_VERSION, OFP_VERSION);
             exit(EXIT_SUCCESS);
 
+        case OPT_MLOCKALL:
+#ifdef HAVE_MLOCKALL
+            if (mlockall(MCL_CURRENT | MCL_FUTURE)) {
+                VLOG_ERR("mlockall failed: %s", strerror(errno));
+            }
+#else
+            VLOG_ERR("mlockall not supported on this system");
+#endif
+            break;
+
         case OPT_FAKE_PROC_NET:
             error = proc_net_compat_init();
             if (error) {
index 4050d5ae0e137b7dc31114ed2d7fb921bf48795b..e8e04ad236acf9330cd1d42a7b2db606848415f8 100755 (executable)
@@ -34,6 +34,7 @@ VSWITCHD_CONF="${VSWITCHD_CONF:-/etc/ovs-vswitchd.conf}"
 VSWITCHD_PIDFILE="${VSWITCHD_PIDFILE:-/var/run/ovs-vswitchd.pid}"
 VSWITCHD_RUN_DIR="${VSWITCHD_RUN_DIR:-/var/xen/vswitch}"
 VSWITCHD_PRIORITY="${VSWITCHD_PRIORITY:--10}"
+VSWITCHD_MLOCKALL="${VSWITCHD_MLOCKALL:-yes}"
 VSWITCHD_LOGFILE="${VSWITCHD_LOGFILE:-/var/log/ovs-vswitchd.log}"
 VSWITCHD_FILE_LOGLEVEL="${VSWITCHD_FILE_LOGLEVEL:-INFO}"
 VSWITCHD_SYSLOG_LOGLEVEL="${VSWITCHD_SYSLOG_LOGLEVEL:-ERR}"
@@ -159,12 +160,15 @@ function start_vswitchd {
     if [ "$ENABLE_FAKE_PROC_NET" = "y" ]; then
         fake_proc_net_opt="--fake-proc-net"
     fi
+    if [ "$VSWITCHD_MLOCKALL" != "no" ]; then
+        mlockall_opt="--mlockall"
+    fi
     if [ "$daemonize" != "y" ]; then
         # Start in background and force a "success" message
         action "Starting ovs-vswitchd ($strace_opt$valgrind_opt)" true
-        (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_CONF") &
+        (nice -n "$VSWITCHD_PRIORITY" $strace_opt $valgrind_opt "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_CONF") &
     else
-        action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt "$VSWITCHD_CONF"
+        action "Starting ovs-vswitchd" nice -n "$VSWITCHD_PRIORITY" "$vswitchd" --pidfile="$VSWITCHD_PIDFILE" --detach --no-chdir $fake_proc_net_opt -vANY:CONSOLE:EMER $syslog_opt $logfile_level_opt $logfile_file_opt $leak_opt $mlockall_opt "$VSWITCHD_CONF"
     fi
 }
 
index f848e7b42b2c995b364e3047ef4ec095a17093e6..2578d11ceb2833ad19cc387f49232fbe8d09a83b 100644 (file)
 #     processes.
 # VSWITCHD_PRIORITY=-10
 
+# VSWITCHD_MLOCKALL: Whether to pass ovs-vswitchd the --mlockall option.
+#     This option should be set to "yes" or "no".  The default is "yes".
+#     Enabling this option can avoid networking interruptions due to
+#     system memory pressure in extraordinary situations, such as multiple
+#     concurrent VM import operations.
+# VSWITCHD_MLOCKALL=yes
+
 # VSWITCHD_LOGFILE: File to send the FILE_LOGLEVEL log messages to.
 # VSWITCHD_LOGFILE=/var/log/ovs-vswitchd.log