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 net.core.rmem_max = 8388609
replace=1 replace=1
[my_included_plugin] #[my_included_plugin]
type=test #type=test
[my_net_plugin] [my_net_plugin]
type=net type=net

View file

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

View file

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

View file

@ -15,6 +15,7 @@ class NetTuningPlugin(tuned.plugins.Plugin):
super(self.__class__, self).__init__(None, options) super(self.__class__, self).__init__(None, options)
self.devidle = {} self.devidle = {}
self.stats = {}
log.info("Devices: %s" % str(devices)); log.info("Devices: %s" % str(devices));
self._load_monitor = tuned.monitors.get_repository().create("net", 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)) log.info("Tunable devices: %s" % str(available))
return 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 = self.devidle.setdefault(dev, {})
idle.setdefault("LEVEL", 0) idle.setdefault("LEVEL", 0)
for _type in ("READ", "WRITE"): for _type in ("read", "write"):
if devload[_type] <= 0.05: if self.stats[dev][_type] <= 0.05:
idle.setdefault(_type, 0) idle.setdefault(_type, 0)
idle[_type] += 1 idle[_type] += 1
else: else:
idle.setdefault(_type, 0) idle.setdefault(_type, 0)
idle[_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): def cleanup(self):
log.info("Cleanup") log.info("Cleanup")
@ -48,14 +83,20 @@ class NetTuningPlugin(tuned.plugins.Plugin):
def update_tuning(self): def update_tuning(self):
load = self._load_monitor.get_load() load = self._load_monitor.get_load()
for dev, devload in load.iteritems(): for dev, devload in load.iteritems():
self._updateIdle(dev, devload) self._init_stats(dev)
if self.devidle[dev]["LEVEL"] == 0 and self.devidle[dev]["READ"] >= 6 and self.devidle[dev]["WRITE"] >= 6: 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 self.devidle[dev]["LEVEL"] = 1
log.info("%s: setting 100Mbps" % dev) log.info("%s: setting 100Mbps" % dev)
ethcard(dev).set_speed(100) 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 self.devidle[dev]["LEVEL"] = 0
log.info("%s: setting maximal speed" % dev) log.info("%s: setting maximal speed" % dev)
ethcard(dev).set_max_speed() 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"]))