2016-03-02 50 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