feat: add io limits controller for systemd youki-dev/youki #3235by gokulmaxi

コンテナランタイムを実装していると D-Bus に触れることがある。一番ある例が cgroup まわりの操作。いつも忘れがちなので、メモしておく。

$ man 5 org.freedesktop.systemd1
method
SetUnitProperties(in s name, in b runtime, in a(sv) properties)

properties で unit のプロパティを実行中に変更できる。cgroup のリソース制限(例: MemoryMax)もここから設定可能。

busctl で試す

  1. テスト用の Unit を作成

    /etc/systemd/system/memhog.service
    [Unit]
    Description=memhog demo service (for SetUnitProperties example)
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3 -c "import time; buf=bytearray(150*1024*1024); print('allocated', len(buf)); time.sleep(3600)"
    Restart=no
    
    [Install]
    WantedBy=multi-user.target

    反映して起動します。

    $ sudo systemctl daemon-reload
    $ sudo systemctl start memhog.service
    $ sudo systemctl status memhog.service
    
  2. D-Bus 上の Unit オブジェクトパスを取る
    GetUnit で object path を取得します。

    $ busctl --system call \
    org.freedesktop.systemd1 /org/freedesktop/systemd1 \
    org.freedesktop.systemd1.Manager GetUnit \
    s "memhog.service"
    o "/org/freedesktop/systemd1/unit/memhog_2eservice"
    
  3. MemoryMax の型を introspect で確認する

    SetUnitProperties は値が variant なので型が必要。introspect で確認します。

    $ busctl --system introspect \
    org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/memhog_2eservice \
    | grep MemoryMax
    .MemoryMax  property  t  18446744073709551615  -
    

    t は uint64

  4. D-Bus SetUnitProperties でメモリ使用量の最大値を制限 ついに、SetUnitProperties を呼ぶ

    $ sudo busctl --system call \
    org.freedesktop.systemd1 /org/freedesktop/systemd1 \
    org.freedesktop.systemd1.Manager SetUnitProperties \
    "sba(sv)" "memhog.service" true \
    1 \
    "MemoryMax" t 104857600
    

    引数たち:

    • true は runtime(再起動まで)
    • a(sv) の先頭 1 は (sv) ペアの個数
    • 104857600 = 100MiB
  5. 設定が入ったか確認する(D-Bus / systemctl) D-Bus で確認

    $ busctl --system get-property \
    org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/memhog_2eservice \
    org.freedesktop.systemd1.Service MemoryMax
    t 104857600
    

    systemctl で確認

    $ systemctl show memhog.service -p MemoryMax
    MemoryMax=104857600
    
  6. お片付け

    $ sudo systemctl stop memhog.service
    $ sudo rm /etc/systemd/system/memhog.service
    $ sudo systemctl daemon-reload