aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2009-11-30 13:17:34 -0800
committerBen Pfaff <blp@nicira.com>2009-12-01 09:24:59 -0800
commit86a06318bdfbea056b04eb78bcdea5672d0b200e (patch)
tree0047690913a25a31f0fc85161de7cce95eeb92ef
parent651880308c1fb26071f1f0788e3a9c842d927126 (diff)
ovs-vswitchd: Add --mlockall option and enable on XenServer.
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.
-rw-r--r--configure.ac1
-rw-r--r--vswitchd/ovs-vswitchd.8.in11
-rw-r--r--vswitchd/ovs-vswitchd.c15
-rwxr-xr-xxenserver/etc_init.d_vswitch8
-rw-r--r--xenserver/root_vswitch_scripts_sysconfig.template7
5 files changed, 40 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index 86cbe160..55df342b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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
diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in
index 5c8d6c77..e9c11f41 100644
--- a/vswitchd/ovs-vswitchd.8.in
+++ b/vswitchd/ovs-vswitchd.8.in
@@ -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
diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
index 01645adf..3309c080 100644
--- a/vswitchd/ovs-vswitchd.c
+++ b/vswitchd/ovs-vswitchd.c
@@ -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) {
diff --git a/xenserver/etc_init.d_vswitch b/xenserver/etc_init.d_vswitch
index 4050d5ae..e8e04ad2 100755
--- a/xenserver/etc_init.d_vswitch
+++ b/xenserver/etc_init.d_vswitch
@@ -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
}
diff --git a/xenserver/root_vswitch_scripts_sysconfig.template b/xenserver/root_vswitch_scripts_sysconfig.template
index f848e7b4..2578d11c 100644
--- a/xenserver/root_vswitch_scripts_sysconfig.template
+++ b/xenserver/root_vswitch_scripts_sysconfig.template
@@ -43,6 +43,13 @@
# 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