Hopefully working net plugin
This commit is contained in:
parent
001cf1fbbd
commit
cf7fd4faf6
4 changed files with 61 additions and 20 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
18
test.cfg
18
test.cfg
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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"]))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue