Revision: 10249
http://freenas.svn.sourceforge.net/freenas/?rev=10249&view=rev
Author: zippybr
Date: 2012-02-24 22:24:36 +0000 (Fri, 24 Feb 2012)
Log Message:
-----------
Change autotune.py to write values to db using django orm
I'm sure there are some points that could be better thought,
but I think that is a good start.
Requested-by: gcooper
Modified Paths:
--------------
branches/8.2.0/src/autotune/files/autotune.py
Modified: branches/8.2.0/src/autotune/files/autotune.py
===================================================================
--- branches/8.2.0/src/autotune/files/autotune.py 2012-02-24 22:24:01 UTC (rev 10248)
+++ branches/8.2.0/src/autotune/files/autotune.py 2012-02-24 22:24:36 UTC (rev 10249)
@@ -5,7 +5,7 @@
Garrett Cooper, December 2011
Example:
- autotune.py --conf-file /boot/loader.conf \
+ autotune.py --conf loader \
--kernel-reserved=2147483648 \
--userland-reserved=4294967296
"""
@@ -18,7 +18,16 @@
import subprocess
import sys
+sys.path.append('/usr/local/www')
+sys.path.append('/usr/local/www/freenasUI')
+from freenasUI import settings
+from django.core.management import setup_environ
+
+setup_environ(settings)
+
+from freenasUI.system.models import Sysctl, Tunable
+
MB = 1024 * 1024
GB = 1024 * MB
@@ -95,20 +104,21 @@
HW_PHYSMEM = sysctl_int('hw.physmem')
DEF_KNOBS = {
- LOADER_CONF: {
+ 'loader': {
'kern.ipc.nmbclusters',
'vm.kmem_size',
'vfs.zfs.arc_max',
},
- SYSCTL_CONF: {
+ 'sysctl': {
'kern.ipc.maxsockbuf',
'net.inet.tcp.recvbuf_max',
'net.inet.tcp.sendbuf_max',
},
}
+
def guess_kern_ipc_maxsockbuf():
- """Maximum socket buffer.
+ """Maximum socket buffer.
Higher -> better throughput, but greater tha likelihood of wasted bandwidth
and memory use/chance for starvation with a larger number of connections.
@@ -199,8 +209,8 @@
"""
return int(max(HW_PHYSMEM - USERLAND_RESERVED_MEM,
MIN_KERNEL_RESERVED_MEM + MIN_ZFS_RESERVED_MEM))
-
+
def guess_vfs_zfs_arc_max():
""" Maximum usable scratch space for the ZFS ARC in secondary memory
@@ -226,10 +236,14 @@
global USERLAND_RESERVED_MEM
parser = argparse.ArgumentParser()
- parser.add_argument('-f', '--conf-file',
- default=LOADER_CONF,
+ parser.add_argument('-c', '--conf',
+ default='loader',
type=str,
)
+ parser.add_argument('-o', '--overwrite',
+ default=False,
+ action="store_true"
+ )
parser.add_argument('-k', '--kernel-reserved',
default=KERNEL_RESERVED_MEM,
type=int,
@@ -240,9 +254,9 @@
)
args = parser.parse_args()
- knobs = DEF_KNOBS.get(args.conf_file)
+ knobs = DEF_KNOBS.get(args.conf)
if not knobs:
- parser.error('Invalid conf_file specified: %s' % (args.conf_file, ))
+ parser.error('Invalid conf specified: %s' % (args.conf, ))
if args.kernel_reserved < DEFAULT_KERNEL_RESERVED_MEM:
parser.error('Value specified for --kernel-reserved is < %d'
@@ -259,25 +273,31 @@
% (knob.replace('.', '_'), )), )) for knob in knobs
])
- with open(args.conf_file) as f:
- lines = map(str.rstrip, f.readlines())
+ if args.conf == 'loader':
+ model = Tunable
+ var_field = 'tun_var'
+ value_field = 'tun_value'
+ comment_field = 'tun_comment'
+ elif args.conf == 'sysctl':
+ model = Sysctl
+ var_field = 'sysctl_mib'
+ value_field = 'sysctl_value'
+ comment_field = 'sysctl_comment'
- seen_list = []
- for i, line in enumerate(lines):
- if line.find('=') == -1:
- # Skip over lines without variables.
+ for var, value in recommendations.items():
+ qs = model.objects.filter(**{var_field: var})
+ if qs.exists() and args.overwrite:
+ obj = qs[0]
+ elif qs.exists() and not args.overwrite:
+ print >> sys.stderr, "skipping", var, "already on db"
continue
- var, value = line.split('=', 1)
- if var in recommendations:
- # Replace line in-place. Please note the importance of 'i'.
- lines[i] = '%s="%s"' % (var, recommendations[var], )
- seen_list.append(var)
+ else:
+ obj = model()
+ setattr(obj, var_field, var)
+ setattr(obj, value_field, value)
+ setattr(obj, comment_field, 'Generated by autotune')
+ obj.save()
- for var in recommendations.iterkeys():
- if var not in seen_list:
- lines.append('%s="%s"' % (var, recommendations[var], ))
- print '\n'.join(lines)
-
if __name__ == '__main__':
main(sys.argv[1:])
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|