1
0
Fork 0

Hopefully working net plugin

This commit is contained in:
Jan Kaluza 2012-02-20 13:08:59 +01:00
parent 001cf1fbbd
commit cf7fd4faf6
4 changed files with 61 additions and 20 deletions

View file

@ -6,8 +6,8 @@ type=sysctl
net.core.rmem_max = 8388609
replace=1
[my_included_plugin]
type=test
#[my_included_plugin]
#type=test
[my_net_plugin]
type=net

View file

@ -61,18 +61,18 @@ vm.dirty_ratio = 50
type=ktune
script=test.sh
elevator=deadline
#
[my_cpu_plugin]
type=cpu
#type=cpu
[my_test_plugin]
type=test
merge=1
#[my_test_plugin]
#type=test
#merge=1
[my_broken_plugin]
type=broken
#[my_broken_plugin]
#type=broken
[my_disk_plugin]
type=disk
#[my_disk_plugin]
#type=disk

View file

@ -15,8 +15,8 @@ class NetMonitor(tuned.monitors.Monitor):
cls._available_devices = set(available)
for dev in available:
max_speed = cls._calcspeed(ethcard(dev).get_max_speed())
cls._load[dev] = ['0', '0', '0', '0', max_speed]
#max_speed = cls._calcspeed(ethcard(dev).get_max_speed())
cls._load[dev] = ['0', '0', '0', '0']
@classmethod
def _calcspeed(cls, speed):
@ -31,7 +31,7 @@ class NetMonitor(tuned.monitors.Monitor):
files = ["rx_bytes", "rx_packets", "tx_bytes", "tx_packets"]
for i,f in enumerate(files):
with open("/sys/class/net/" + dev + "/statistics/" + f) as statfile:
cls._load[dev]["new"][i] = statfile.read().strip()
cls._load[dev][i] = statfile.read().strip()
@classmethod
def update(cls):

View file

@ -15,6 +15,7 @@ class NetTuningPlugin(tuned.plugins.Plugin):
super(self.__class__, self).__init__(None, options)
self.devidle = {}
self.stats = {}
log.info("Devices: %s" % str(devices));
self._load_monitor = tuned.monitors.get_repository().create("net", devices)
@ -27,17 +28,51 @@ class NetTuningPlugin(tuned.plugins.Plugin):
log.info("Tunable devices: %s" % str(available))
return available
def _updateIdle(self, dev, devload):
def _calc_speed(self, speed):
# 0.6 is just a magical constant (empirical value): Typical workload on netcard won't exceed
# that and if it does, then the code is smart enough to adapt it.
# 1024 * 1024 as for MB -> B
# speed / 8 Mb -> MB
return (int) (0.6 * 1024 * 1024 * speed / 8)
def _calc_diff(self, dev):
l = []
for i in xrange(len(self.stats[dev]["old"])):
l.append(int(self.stats[dev]["new"][i]) - int(self.stats[dev]["old"][i]))
return l
def _update_idle(self, dev):
idle = self.devidle.setdefault(dev, {})
idle.setdefault("LEVEL", 0)
for _type in ("READ", "WRITE"):
if devload[_type] <= 0.05:
for _type in ("read", "write"):
if self.stats[dev][_type] <= 0.05:
idle.setdefault(_type, 0)
idle[_type] += 1
else:
idle.setdefault(_type, 0)
idle[_type] = 0
def _init_stats(self, dev):
if not self.stats.has_key(dev):
max_speed = self._calc_speed(ethcard(dev).get_max_speed())
self.stats[dev] = {}
self.stats[dev]["new"] = ['0', '0', '0', '0']
self.stats[dev]["max"] = [max_speed, 1, max_speed, 1]
self.stats[dev]["max"] = [max_speed, 1, max_speed, 1]
def _update_stats(self, dev, devload):
self.stats[dev]["old"] = list(self.stats[dev]["new"])
self.stats[dev]["new"] = list(devload)
l = self._calc_diff(dev)
for i in xrange(len(l)):
if l[i] > self.stats[dev]["max"][i]:
self.stats[dev]["max"][i] = l[i]
self.stats[dev]["diff"] = l
self.stats[dev]["read"] = float(self.stats[dev]["diff"][0]) / float(self.stats[dev]["max"][0])
self.stats[dev]["write"] = float(self.stats[dev]["diff"][2]) / float(self.stats[dev]["max"][2])
def cleanup(self):
log.info("Cleanup")
@ -48,14 +83,20 @@ class NetTuningPlugin(tuned.plugins.Plugin):
def update_tuning(self):
load = self._load_monitor.get_load()
for dev, devload in load.iteritems():
self._updateIdle(dev, devload)
if self.devidle[dev]["LEVEL"] == 0 and self.devidle[dev]["READ"] >= 6 and self.devidle[dev]["WRITE"] >= 6:
self._init_stats(dev)
self._update_stats(dev, devload)
self._update_idle(dev)
if self.devidle[dev]["LEVEL"] == 0 and self.devidle[dev]["read"] >= 6 and self.devidle[dev]["write"] >= 6:
self.devidle[dev]["LEVEL"] = 1
log.info("%s: setting 100Mbps" % dev)
ethcard(dev).set_speed(100)
if self.devidle[dev]["LEVEL"] > 0 and (self.devidle[dev]["READ"] == 0 or self.devidle[dev]["WRITE"] == 0):
if self.devidle[dev]["LEVEL"] > 0 and (self.devidle[dev]["read"] == 0 or self.devidle[dev]["write"] == 0):
self.devidle[dev]["LEVEL"] = 0
log.info("%s: setting maximal speed" % dev)
ethcard(dev).set_max_speed()
log.debug("%s load: read %f, write %f" % (dev, self.stats[dev]["read"], self.stats[dev]["write"]))
log.debug("%s idle: read %d, write %d, level %d" % (dev, self.devidle[dev]["read"], self.devidle[dev]["write"], self.devidle[dev]["LEVEL"]))