tuned
tuned copied to clipboard
Tuning of individual kernel threads
In combination with #596 and #580, this PR implements the third feature needed to dynamically tune all relevant aspects of a realtime application using a dedicated HW device (typically a NIC).
Two things might need some discussion:
- In my implementation I kept the basic idea that one instace can cover a number of different groups of threads. That makes it easy to migrate from the current
schedulerplugin, but means we still need_has_dynamic_options, which is marked as a hack in plugins/base.py. The alternative would be to have one plugin instance per "group", which would make the profiles much longer.
would become something likegroup.ktimers=0:f:2:*:^\[ktimers[kthread_ktimers] type=kthread regex=^ktimers policy=fifo sched_prio=2 affinity=* - I copied the approach of using perf to monitor for creation of new threads. That means that when running both the
schedulerplugin and thekthreadplugin, we'd have two threads doing the same thing. For my applications that's not a problem, because I no longer use theschedulerplugin at all:schedulerhandles three things: IRQ affinities, kernel threads, and userland threads- For IRQ affinities I can use the
irqplugin - For kernel threads I can use
kthread - For userland threads I use systemd and cgroupv2, and I don't want TuneD to touch them
but means we still
need _has_dynamic_options, which is marked as a hack in plugins/base.py.
It's OK for me, in long-term it's a candidate for rewrite/refactor, but there are other plugins using it as well. We will probably keep the idea and if we change the implementation, this could be then updated in all affected plugins the same way.
Regarding the cgroups, there is support for cgroups v1 in the scheduler plugin and we would also like to add support for the v2 for completeness. It could be useful for somebody.
It's OK if you are not using some plugin. We even wanted to add global configuration option allowing selective disablement of specific plugins in the stock profiles.
Regarding the cgroups, there is support for cgroups v1 in the scheduler plugin and we would also like to add support for the v2 for completeness. It could be useful for somebody.
I found the whole cgroup topic to be rather tricky, because in modern systems, SystemD is the "cgroup manager", and it owns (by convention) the cgroup tree. So any creation of new cgroups should happen via SystemD, and can then use Delegation to create further sub-groups.
I've had some success with:
- set
AllowedCPUson all the default slices (system.slice,user.slice,init.scope) to restrict all "normal" processes. This to some extent replaces theisolcpus=kernel option. - Create an
isolated.sliceusing SystemD, with access to the desired CPUs, and then useSlice=isolatedin my service file (orsystemd-run --slice=isolatedwhen launching from a shell) to gain access to the isolated CPUs.
But simply having TuneD move processes around seems like it could have unwanted side-effects, and should be handled with care...