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 86cbe16..55df342 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 5c8d6c7..e9c11f4 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 01645ad..3309c08 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 4050d5a..e8e04ad 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 f848e7b..2578d11 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