1
0
Fork 0

Merge pull request #61 from olysonek/udev_monitor_buffer_size

Increase udev monitor buffer size, make it configurable
This commit is contained in:
Jaroslav Škarvada 2017-08-15 15:51:33 +02:00 committed by GitHub
commit a83170deb7
6 changed files with 45 additions and 2 deletions

View file

@ -29,3 +29,6 @@ reapply_sysctl = 1
# Default priority assigned to instances
default_instance_priority = 0
# Udev buffer size
udev_buffer_size = 1MB

View file

@ -63,6 +63,7 @@ CFG_UPDATE_INTERVAL = "update_interval"
CFG_RECOMMEND_COMMAND = "recommend_command"
CFG_REAPPLY_SYSCTL = "reapply_sysctl"
CFG_DEFAULT_INSTANCE_PRIORITY = "default_instance_priority"
CFG_UDEV_BUFFER_SIZE = "udev_buffer_size"
# no_daemon mode
CFG_DEF_DAEMON = True
@ -78,6 +79,8 @@ CFG_DEF_RECOMMEND_COMMAND = True
CFG_DEF_REAPPLY_SYSCTL = True
# default instance priority
CFG_DEF_DEFAULT_INSTANCE_PRIORITY = 0
# default pyudev.Monitor buffer size
CFG_DEF_UDEV_BUFFER_SIZE = 1024 * 1024
PATH_CPU_DMA_LATENCY = "/dev/cpu_dma_latency"

View file

@ -22,7 +22,8 @@ class Application(object):
storage_factory = storage.Factory(storage_provider)
monitors_repository = monitors.Repository()
hardware_inventory = hardware.Inventory()
udev_buffer_size = config.get_size("udev_buffer_size", consts.CFG_DEF_UDEV_BUFFER_SIZE)
hardware_inventory = hardware.Inventory(buffer_size=udev_buffer_size)
device_matcher = hardware.DeviceMatcher()
device_matcher_udev = hardware.DeviceMatcherUdev()
plugin_instance_factory = plugins.instance.Factory()

View file

@ -1,5 +1,6 @@
import pyudev
import tuned.logs
from tuned import consts
__all__ = ["Inventory"]
@ -11,7 +12,7 @@ class Inventory(object):
about related hardware events.
"""
def __init__(self, udev_context=None, udev_monitor_cls=None, monitor_observer_factory=None):
def __init__(self, udev_context=None, udev_monitor_cls=None, monitor_observer_factory=None, buffer_size=None):
if udev_context is not None:
self._udev_context = udev_context
else:
@ -20,6 +21,9 @@ class Inventory(object):
if udev_monitor_cls is None:
udev_monitor_cls = pyudev.Monitor
self._udev_monitor = udev_monitor_cls.from_netlink(self._udev_context)
if buffer_size is None:
buffer_size = consts.CFG_DEF_UDEV_BUFFER_SIZE
self._udev_monitor.set_receive_buffer_size(buffer_size)
if monitor_observer_factory is None:
monitor_observer_factory = _MonitorObserverFactory()

View file

@ -432,3 +432,24 @@ class commands:
return terminate.wait(time, False)
except:
return terminate.wait(time)
def get_size(self, s):
s = str(s).strip().upper()
for unit in ["KB", "MB", "GB", ""]:
unit_ix = s.rfind(unit)
if unit_ix == -1:
continue
try:
val = int(s[:unit_ix])
u = s[unit_ix:]
if u == "KB":
val *= 1024
elif u == "MB":
val *= 1024 * 1024
elif u == "GB":
val *= 1024 * 1024 * 1024
elif u != "":
val = None
return val
except ValueError:
return None

View file

@ -47,3 +47,14 @@ class GlobalConfig():
def set(self, key, value):
self._cfg[key] = value
def get_size(self, key, default = None):
val = self.get(key)
if val is None:
return default
ret = self._cmd.get_size(val)
if ret is None:
log.error("Error parsing value '%s', using '%s'." %(val, default))
return default
else:
return ret