全部產品
Search
文件中心

Alibaba Cloud Linux:啟用cgroup writeback功能

更新時間:Jul 19, 2024

在Alibaba Cloud Linux 2(核心版本4.19.36-12.al7開始)和Alibaba Cloud Linux 3中,對核心介面cgroup v1新增了控制群組回寫(cgroup writeback)功能。該功能使您在使用核心介面cgroup v1時,可以對緩衝非同步I/O (Buffered I/O) 進行限速。

背景資訊

控制群組(control group)簡稱為cgroup,分為v1和v2兩個版本。更多資訊,請參見什麼是控制群組。本文介紹如何啟用cgroup v1的cgroup writeback功能,並對進程進行Buffered I/O限速。

使用限制

在啟用cgroup writeback功能之後,您可以先確認記憶體子系統(memcg)和IO子系統(blkcg)的映射關係是否符合下文所述的規則,再對進程進行Buffered I/O限速。

cgroup writeback功能需要memcg和blkcg協同工作,完成Buffered I/O的限速,但是核心介面cgroup v1的各個控制子系統間預設不協同工作。因此需要通過一定的規則把memcg和blkcg串連起來,規則為:通過任意一個memcg必須可以找到與之唯一對應的blkcg。即memcg和blkcg的映射關係可以是一對一或多對一,不可以是一對多或多對多。

例如,存在進程A和B,對它們進行Buffered I/O限速,需要遵循以下約束。

  • 如果A和B分屬不同的memcg,它們可以映射到不同的blkcg,只需各自一一對應。例如:A屬於memcg1blkcg1;B屬於memcg2blkcg0

  • 如果A和B分屬不同的memcg,它們也可以映射到同一個blkcg。例如:A屬於memcg1,B屬於memcg2,A和B都屬於blkcg2

  • 如果A和B屬於相同的memcg,那麼它們只能映射到同一個blkcg。例如:A和B均屬於memcg0,它們同時屬於blkcg3

為了避免出現意外情況,建議您在啟用cgroup writeback功能後,對進程進行Buffered I/O限速前,優先設定blkcg的cgroup.procs介面,向該介面寫入一個進程ID來保證blkcg映射的唯一性。同時您也可以通過工具查看memcg和blkcg的映射關係,更多資訊,請參見確認memcg和blkcg的映射關係

在實際營運中,可能出現進程移動到其它cgroup的情況。根據上述規則,如果進程在memcg之間移動,不會出現問題,但如果進程在blkcg之間移動,將會出現異常情況。為了避免產生異常,該功能的代碼中定義了規則:一旦工作中的blkcg內的進程發生blkcg間的移動,則將映射關係直接指向root blkcg。由於一般情況是不在root blkcg設定限流閾值,所以當映射關係直接指向root blkcg時,限速功能會失效。

重要

核心代碼雖定義了規則避免出現意外,但您需要在實際操作中盡量避免將進程在blkcg間移動。

開啟cgroup writeback功能

cgroup v1介面中的cgroup writeback功能預設是關閉的,按照以下步驟開啟該功能。

  1. 通過命令grubby內添加cgwb_v1欄位開啟該功能。

    本樣本中核心版本為4.19.36-12.al7.x86_64,您在操作中需要更換為實際的核心版本,核心版本的查看命令為uname -r

    sudo grubby --update-kernel="/boot/vmlinuz-4.19.36-12.al7.x86_64" --args="cgwb_v1"
  2. 重啟系統使功能生效。

    sudo reboot
  3. 使用以下命令讀取核心檔案/proc/cmdline,確認核心命令列參數中帶有cgwb_v1欄位。此時,blkcg下的blkio.throttle.write_bps_deviceblkio.throttle.write_iops_device介面能夠對Buffered I/O進行限速。

    cat /proc/cmdline | grep cgwb_v1
說明

在k8s環境下,開啟cgroup writeback功能後,您需要額外綁定memory和blkio cgroup子系統,以避免因為進程移動導致限速功能失效。

  1. 合并memory和blkio cgroup子系統。

    1. 編輯system.conf檔案。

      sudo vim /etc/systemd/system.conf
    2. 修改JoinControllers配置,例如:

      JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio
    3. Ecs 鍵退出編輯模式,輸入 :wq儲存並退出。

  2. 運行以下命令,重做核心鏡像,確保systemd的配置修改生效。

    sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12.al7.x86_64 --force
  3. 運行以下命令,重啟系統。

    sudo reboot
  4. 運行以下命令,驗證memory、blkio子系統是否合并。

    ls /sys/fs/cgroup

驗證cgroup writeback是否生效

本樣本將類比出兩個產生I/O的進程,用於驗證cgroup writeback功能是否有效。

說明
  • 由於dd命令的反饋速度較快,結果使用iostat命令查看。

  • 由於dd命令為順序寫入,順序IO回刷時,會產生1 MB資料再回刷,因此設定閾值時,blkio.throttle.write_bps_device不得小於1 MB(1048576)。如果設定值小於1 MB,可能會引發IO hang。

  1. 類比出兩個產生I/O的進程,並按照限制條件優先設定blkcg的cgroup.procs介面。

    sudo mkdir /sys/fs/cgroup/blkio/blkcg1
    sudo mkdir /sys/fs/cgroup/memory/memcg1
    sudo bash -c "echo $$ > /sys/fs/cgroup/blkio/blkcg1/cgroup.procs"    # $$為您的進程ID
    sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs"    # $$為您的進程ID
  2. 使用blkcg下的blkio.throttle.write_bps_device介面對Buffered I/O進行限速。

    sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device"    # 通過裝置號配置磁碟的回寫限流bps為10 M
  3. 使用不帶參數oflag=syncdd命令產生緩衝非同步I/O。

    sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000
  4. 使用iostat工具查詢結果。查看輸出資料行wMB/s,如果被限制到10 MB/s,則表示cgroup writeback功能已生效。

    iostat -xdm 1 vdd

確認memcg和blkcg的映射關係

您可以使用以下任意一種方式診斷memcg和blkcg的映射關係是否為一對一或多對一。

  • 查看memcg與blkcg映射關係。

    sudo cat /sys/kernel/debug/bdi/bdi_wb_link

    返回結果樣本如下,該樣本表示memcg和blkcg符合一對一的映射規則。

    memory     <--->     blkio
    memcg1:   35 <---> blkcg1:   48
  • 使用ftrace核心監測工具。

    1. 開啟ftrace工具。

      sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable"
    2. 查看資訊輸出介面。

      sudo cat /sys/kernel/debug/tracing/trace_pipe

      輸出內容樣本如下,其中memcg_ino=35 blkcg_ino=48表示memcg和blkcg符合一對一的映射規則。

      <...>-1537  [006] ....    99.511327: insert_memcg_blkcg_link: memcg_ino=35 blkcg_ino=48 old_blkcg_ino=0