我有一个systemd foo.slice
,cgroup设置为CPUShares
。 我的想法是在系统启动期间的某个时刻更改设置,这将由systemd服务触发。系统资源控制在运行时使用gdbus的SetProperties
我做了一些测试工作来检查如何在运行时更改设置。
在foo.slice
我定义了CPUShares=256
。这将导致cat /sys/fs/cgroup/cpu/foo.slice/cpu.shares 256
。
,将由gdbus introspect
得到下面几行:
interface org.freedesktop.systemd1.Slice {
methods:
signals:
properties:
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly s Slice = '-.slice';
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly s ControlGroup = '/foo.slice';
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly b CPUAccounting = false;
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t CPUShares = 256;
我尝试通过调用方法来改变CPUShares
:使用
@org.freedesktop.systemd1.Privileged("true")
SetProperties(in b arg_0,
in a(sv) arg_1);
:
gdbus call --system --dest org.freedesktop.systemd1 --object-path /org/freedesktop/systemd/unit/foo_2eslice --method org.freedesktop.systemd1.Unit.SetProperties true "[('CPUShares', <@t 2048>)]"
我会的获得
@org.freedesktop.DBus.Property.EmitsChangedSignal("false")
readonly t CPUShares = 2048;
但我仍然得到cat /sys/fs/cgroup/cpu/foo.slice/cpu.shares 256
。
我重新启动后片:
gdbus call --system --dest org.freedesktop.systemd1 --object-path /org/freedesktop/systemd1/unit/foo_2eslice --method org.freedesktop.systemd1.Unit.Restart 'replace'
我会得到 cat /sys/fs/cgroup/cpu/foo.slice/cpu.shares 2048
我用systemd 211
。
我希望知道更多关于此行为的详细信息,或者是否有更好的解决方案,即希望获得一些提示,以便在运行时使用systemd更改CPUShares
。
此选项'StartupCPUShares ='比'systemd 211'晚。而我的问题更多的是通常用systemd更改cgroup设置。我甚至在systemd达到default.target后检查,如果我通过dbus或shell更改了设置,我仍然需要重启设备以激活'/ sys/fs/cgroup'中的设置。正如我在问题中所描述的那样,应该触发更改,这意味着不在'default.target'的时间点。非常感谢您的帮助。 – Shuangistan
这可能是systemd在这个领域的一个bug。你好像你已经尝试了一切。你没有特权问题,你甚至可以获得改变信号的属性。但是,您不会从上游获得相对较旧的系统版本的帮助。你最好的选择可能是升级到最新的systemd。 – Umut
你是对的,至少它可以在我的Ubuntu机器上运行'systemd 225'。谢谢你的评论。 – Shuangistan