mirror of
https://github.com/openvswitch/ovs
synced 2025-08-30 05:47:55 +00:00
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.
This commit is contained in:
parent
651880308c
commit
86a06318bd
@ -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
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user