diff --git a/mininet/util.py b/mininet/util.py index 21e71ce..05df136 100644 --- a/mininet/util.py +++ b/mininet/util.py @@ -3,7 +3,7 @@ from mininet.log import output, info, error, warn from time import sleep -from resource import setrlimit, RLIMIT_NPROC, RLIMIT_NOFILE +from resource import getrlimit, setrlimit, RLIMIT_NPROC, RLIMIT_NOFILE from select import poll, POLLIN, POLLHUP from subprocess import call, check_call, Popen, PIPE, STDOUT import re @@ -355,11 +355,50 @@ def pmonitor(popens, timeoutms=500, readline=True, yield None, '' # Other stuff we use +def sysctlTestAndSet( name, limit ): + "Helper function to set sysctl limits" + #convert non-directory names into directory names + if '/' not in name: + name = '/proc/sys/' + name.replace( '.', '/' ) + #read limit + f = open( name, 'r+' ) + oldLimit = f.readline() + if type( limit ) is int: + #compare integer limits before overriding + if int( oldLimit ) < limit: + f.write( "%d" % limit ) + else: + #overwrite non-integer limits + f.write( limit ) + f.close() + +def rlimitTestAndSet( name, limit ): + "Helper function to set rlimits" + soft, hard = getrlimit( name ) + if soft < limit: + hardLimit = hard if limit < hard else limit + setrlimit( name, ( limit, hardLimit ) ) def fixLimits(): "Fix ridiculously small resource limits." - setrlimit( RLIMIT_NPROC, ( 8192, 8192 ) ) - setrlimit( RLIMIT_NOFILE, ( 16384, 16384 ) ) + rlimitTestAndSet( RLIMIT_NPROC, 8192 ) + rlimitTestAndSet( RLIMIT_NOFILE, 16384 ) + #Increase open file limit + sysctlTestAndSet( 'fs.file-max', 10000 ) + #Increase network buffer space + sysctlTestAndSet( 'net.core.wmem_max', 16777216 ) + sysctlTestAndSet( 'net.core.rmem_max', 16777216 ) + sysctlTestAndSet( 'net.ipv4.tcp_rmem', '10240 87380 16777216' ) + sysctlTestAndSet( 'net.ipv4.tcp_wmem', '10240 87380 16777216' ) + sysctlTestAndSet( 'net.core.netdev_max_backlog', 5000 ) + #Increase arp cache size + sysctlTestAndSet( 'net.ipv4.neigh.default.gc_thresh1', 4096 ) + sysctlTestAndSet( 'net.ipv4.neigh.default.gc_thresh2', 8192 ) + sysctlTestAndSet( 'net.ipv4.neigh.default.gc_thresh3', 16384 ) + #Increase routing table size + sysctlTestAndSet( 'net.ipv4.route.max_size', 32768 ) + #Increase number of PTYs for nodes + sysctlTestAndSet( 'kernel.pty.max', 20000 ) def mountCgroups(): "Make sure cgroups file system is mounted" diff --git a/util/install.sh b/util/install.sh index e6fdf92..4873a8e 100755 --- a/util/install.sh +++ b/util/install.sh @@ -144,15 +144,6 @@ function mn_deps { python-setuptools cgroup-bin ethtool help2man \ pyflakes pylint pep8 - # Add sysctl parameters as noted in the INSTALL file to increase kernel - # limits to support larger setups: - if ! grep Mininet /etc/sysctl.conf; then - echo "Adding Mininet sysctl settings" - sudo su -c "cat $MININET_DIR/mininet/util/sysctl_addon >> /etc/sysctl.conf" - fi - # Load new sysctl settings: - sudo sysctl -p - echo "Installing Mininet core" pushd $MININET_DIR/mininet sudo make install