diff --git a/included.cfg b/included.cfg index 7aa0c75..e3350cd 100644 --- a/included.cfg +++ b/included.cfg @@ -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 diff --git a/test.cfg b/test.cfg index d15cd88..f0c5271 100644 --- a/test.cfg +++ b/test.cfg @@ -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 diff --git a/tuned/monitors/monitor_net.py b/tuned/monitors/monitor_net.py index 0620ecd..cbacb62 100644 --- a/tuned/monitors/monitor_net.py +++ b/tuned/monitors/monitor_net.py @@ -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): diff --git a/tuned/plugins/plugin_net.py b/tuned/plugins/plugin_net.py index adf2975..e4d26c8 100644 --- a/tuned/plugins/plugin_net.py +++ b/tuned/plugins/plugin_net.py @@ -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"]))