1
0
Fork 0

plugin_disk: added err_cnt to hdparm calls

Disabled set_apm and set_spindown commands after 5 consecutive
errors (individual counters).

Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
This commit is contained in:
Jaroslav Škarvada 2014-09-29 23:12:38 +02:00
parent de1bb42821
commit 71a0b2d523
2 changed files with 48 additions and 4 deletions

View file

@ -8,6 +8,11 @@ DBUS_OBJECT = "/Tuned"
DEFAULT_PROFILE = "balanced"
DEFAULT_STORAGE_FILE = "/run/tuned/save.pickle"
LOAD_DIRECTORIES = ["/usr/lib/tuned", "/etc/tuned"]
# max. number of consecutive errors to give up
ERROR_THRESHOLD = 5
# bootloader plugin configuration
GRUB2_CFG_FILES = ["/boot/grub2/grub.cfg", "/boot/efi/EFI/redhat/grub.cfg", "/boot/efi/EFI/fedora/grub.cfg"]
GRUB2_TUNED_TEMPLATE_NAME = "00_tuned"
GRUB2_TEMPLATE_HEADER_BEGIN = "### BEGIN /etc/grub.d/" + GRUB2_TUNED_TEMPLATE_NAME + " ###"

View file

@ -1,6 +1,7 @@
import hotplug
from decorators import *
import tuned.logs
import tuned.consts as consts
from tuned.utils.commands import commands
import os
import re
@ -78,6 +79,9 @@ class DiskPlugin(hotplug.Plugin):
def _instance_init(self, instance):
instance._has_static_tuning = True
self._set_apm_errcnt = 0
self._set_spindown_errcnt = 0
if self._option_bool(instance.options["dynamic"]):
instance._has_dynamic_tuning = True
instance._load_monitor = self._monitors_repository.create("disk", instance.devices)
@ -93,6 +97,14 @@ class DiskPlugin(hotplug.Plugin):
self._monitors_repository.delete(instance._load_monitor)
instance._load_monitor = None
def _check_set_apm_err_threshold(self):
if self._set_apm_errcnt >= consts.ERROR_THRESHOLD:
log.info("disabling set_apm command, too many consecutive errors")
def _check_set_spindown_err_threshold(self):
if self._set_spindown_errcnt >= consts.ERROR_THRESHOLD:
log.info("disabling set_spindown command, too many consecutive errors")
def _instance_update_dynamic(self, instance, device):
load = instance._load_monitor.get_device_load(device)
if load is None:
@ -124,8 +136,23 @@ class DiskPlugin(hotplug.Plugin):
new_spindown_level = self._spindown_levels[idle["level"]]
log.debug("tuning level changed to %d (power %d, spindown %d)" % (idle["level"], new_power_level, new_spindown_level))
self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "-B%d" % new_power_level, "/dev/%s" % device])
if self._set_spindown_errcnt < consts.ERROR_THRESHOLD and self._set_apm_errcnt < consts.ERROR_THRESHOLD:
(rc, out) = self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "-B%d" % new_power_level, "/dev/%s" % device])
if rc != 0:
self._set_spindown_errcnt += 1
self._set_apm_errcnt += 1
self._check_set_spindown_err_threshold()
self._check_set_apm_err_threshold()
elif self._set_spindown_errcnt < consts.ERROR_THRESHOLD:
(rc, out) = self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "/dev/%s" % device])
if rc != 0:
self._set_spindown_errcnt += 1
self._check_set_spindown_err_threshold()
elif self._set_apm_errcnt < consts.ERROR_THRESHOLD:
(rc, out) = self._cmd.execute(["hdparm", "-B%d" % new_power_level, "/dev/%s" % device])
if rc != 0:
self._set_apm_errcnt += 1
self._check_set_apm_err_threshold()
log.debug("%s load: read %0.2f, write %0.2f" % (device, stats["read"], stats["write"]))
log.debug("%s idle: read %d, write %d, level %d" % (device, idle["read"], idle["write"], idle["level"]))
@ -209,7 +236,13 @@ class DiskPlugin(hotplug.Plugin):
@command_set("apm", per_device=True)
def _set_apm(self, value, device):
self._cmd.execute(["hdparm", "-B", str(value), "/dev/" + device])
if self._set_apm_errcnt < consts.ERROR_THRESHOLD:
(rc, out) = self._cmd.execute(["hdparm", "-B", str(value), "/dev/" + device])
if rc:
self._set_apm_errcnt += 1
self._check_set_apm_err_threshold()
else:
self._set_apm_errcnt = 0
@command_get("apm")
def _get_apm(self, device):
@ -224,7 +257,13 @@ class DiskPlugin(hotplug.Plugin):
@command_set("spindown", per_device=True)
def _set_spindown(self, value, device):
self._cmd.execute(["hdparm", "-S", str(value), "/dev/" + device])
if self._set_spindown_errcnt < consts.ERROR_THRESHOLD:
(rc, out) = self._cmd.execute(["hdparm", "-S", str(value), "/dev/" + device])
if rc:
self._set_spindown_errcnt += 1
self._check_set_spindown_err_threshold()
else:
self._set_spindown_errcnt = 0
@command_get("spindown")
def _get_spindown(self, device):