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
|
||||
replace=1
|
||||
|
||||
[my_included_plugin]
|
||||
type=test
|
||||
#[my_included_plugin]
|
||||
#type=test
|
||||
|
||||
[my_net_plugin]
|
||||
type=net
|
||||
|
|
|
|||
18
test.cfg
18
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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"]))
|
||||
|
|
|
|||
Loading…
Reference in a new issue