2016-03-02 51 views
0

我有一个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

回答

0

如果您在systemd达到default.target之前尝试更改cpu份额,则需要使用StartupCPUShares=

+0

此选项'StartupCPUShares ='比'systemd 211'晚。而我的问题更多的是通常用systemd更改cgroup设置。我甚至在systemd达到default.target后检查,如果我通过dbus或shell更改了设置,我仍然需要重启设备以激活'/ sys/fs/cgroup'中的设置。正如我在问题中所描述的那样,应该触发更改,这意味着不在'default.target'的时间点。非常感谢您的帮助。 – Shuangistan

+1

这可能是systemd在这个领域的一个bug。你好像你已经尝试了一切。你没有特权问题,你甚至可以获得改变信号的属性。但是,您不会从上游获得相对较旧的系统版本的帮助。你最好的选择可能是升级到最新的systemd。 – Umut

+0

你是对的,至少它可以在我的Ubuntu机器上运行'systemd 225'。谢谢你的评论。 – Shuangistan