diff --git a/profiles/latency-performance/script.sh b/profiles/latency-performance/script.sh index cdd82dd..b68aa32 100755 --- a/profiles/latency-performance/script.sh +++ b/profiles/latency-performance/script.sh @@ -5,7 +5,6 @@ start() { set_elevator "/sys/block/{sd,cciss,dm-,vd}*/queue/scheduler" deadline set_cpu_governor performance - /usr/libexec/tuned/pmqos-static.py cpu_dma_latency=0 return 0 } @@ -13,7 +12,6 @@ start() { stop() { restore_elevator "/sys/block/{sd,cciss,dm-,vd}*/queue/scheduler" restore_cpu_governor - /usr/libexec/tuned/pmqos-static.py disable return 0 } diff --git a/profiles/latency-performance/tuned.conf b/profiles/latency-performance/tuned.conf index 6c4c15a..7f3254d 100644 --- a/profiles/latency-performance/tuned.conf +++ b/profiles/latency-performance/tuned.conf @@ -2,5 +2,8 @@ # tuned configuration # +[cpu] +force_latency=0 + [script] script=script.sh diff --git a/tuned/plugins/plugin_cpu.py b/tuned/plugins/plugin_cpu.py index e16314e..e47ed02 100644 --- a/tuned/plugins/plugin_cpu.py +++ b/tuned/plugins/plugin_cpu.py @@ -18,15 +18,19 @@ class CPULatencyPlugin(tuned.plugins.Plugin): super(self.__class__, self).__init__(devices, options) self._latency = None + self._load_monitor = None self._cpu_latency_fd = os.open("/dev/cpu_dma_latency", os.O_WRONLY) - self.dynamic_tuning = None + self._load_monitor = None if self.dynamic_tuning: self._load_monitor = tuned.monitors.get_repository().create("load", devices) if not tuned.utils.storage.Storage.get_instance().data.has_key("cpu"): tuned.utils.storage.Storage.get_instance().data["cpu"] = {} + self.register_command("latency", + self._set_latency, + self._revert_latency) self.register_command("cpu_governor", self._set_cpu_governor, self._revert_cpu_governor) @@ -43,6 +47,7 @@ class CPULatencyPlugin(tuned.plugins.Plugin): "load_threshold" : 0.2, "latency_low" : 100, "latency_high" : 1000, + "latency" : "", "cpu_governor" : "", "cpu_multicore_powersave" : "", "enable_usb_autosupend" : "", @@ -57,11 +62,11 @@ class CPULatencyPlugin(tuned.plugins.Plugin): def update_tuning(self): load = self._load_monitor.get_load()["system"] if load < self._options["load_threshold"]: - self._set_latency(self._options["latency_high"]) + self._set_latency_dynamic(self._options["latency_high"]) else: - self._set_latency(self._options["latency_low"]) + self._set_latency_dynamic(self._options["latency_low"]) - def _set_latency(self, latency): + def _set_latency_dynamic(self, latency): latency = int(latency) if self._latency != latency: log.info("new cpu latency %d" % latency) @@ -69,6 +74,17 @@ class CPULatencyPlugin(tuned.plugins.Plugin): os.write(self._cpu_latency_fd, latency_bin) self._latency = latency + @command("cpu", "latency") + def _set_latency(self, value): + latency_bin = tuned.utils.commands.read_file("/dev/cpu_dma_latency") + old_value = str(struct.unpack("i", latency_bin)[0]) + self._set_latency_dynamic(value) + return old_value + + @command_revert("cpu", "latency") + def _revert_latency(self, value): + self._set_latency_dynamic(value) + @command("cpu", "cpu_governor") def _set_cpu_governor(self, value): old_value = tuned.utils.commands.execute(["cpupower", "frequency-info", "-p"])