すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:cgroupライトバック機能の有効化

最終更新日:Jul 17, 2024

Alibaba Cloud Linux 2は、カーネルバージョン4.19.36〜12.al7以降のcgroup v1カーネルインターフェイスのcgroupライトバック機能を提供します。 この機能を使用すると、cgroup v1カーネルインターフェイスを使用するときに、バッファリングされるI/Oレートを制限できます。

背景情報

このトピックではcgroupsと略されるコントロールグループは、リソースを割り当てることができるLinuxカーネル機能です。 cgroupsは、cgroup v1とcgroup v2の2つのバージョンがあります。 詳細については、リソース管理ガイドの「コントロールグループとは」を参照してください。 このトピックでは、cgroup v1のcgroupライトバック機能を有効にして、プロセスのバッファリングされたI/Oレートを制限する方法について説明します。

制限事項

cgroupライトバック機能を有効にした後、メモリサブシステム (memcgs) とI/Oサブシステム (blkcgs) 間のマッピングが次のルールに準拠しているかどうかを確認します。 マッピングがルールに準拠している場合は、プロセスのバッファリングされたI/Oレートを制限します。

cgroupライトバック機能では、バッファリングされたI/Oレートを制限するためにmemcgsとblkcgsの間の連携が必要です。 ただし、デフォルトでは、cgroup v1の制御サブシステムは互いに連携しません。 Memcgsとblkcgsは、各memcgが一意のblkcgにマップされるというルールに基づいて関連付けられている必要があります。 memcgsからblkcgsへのマッピングは、1対1または多対1にすることができますが、1対多または多対多にすることはできません。

たとえば、プロセスAおよびBのバッファリングされたI/Oレートを制限するには、次の項目に注意する必要があります。

  • AおよびBが2つの異なるmemcgに属するとき、各memcgは、一意のblkcgにマッピングされ得る。 たとえば、Aはmemcg1blkcg1に属し、Bはmemcg2blkcg0に属します。

  • AおよびBが2つの異なるメモリに属する場合、これらのメモリも同じblkcgにマッピングすることができる。 たとえば、Aはmemcg1に属し、Bはmemcg2に属し、AとBの両方がblkcg2に属することができます。

  • AとBが同じmemcgに属している場合、memcgは1つのblkcgにのみマッピングできます。 例えば、AおよびBは、memcg0およびblkcg3に属する。

例外を防ぐには、cgroupライトバック機能を有効にした後、プロセスのバッファーI/Oレートを制限する前に、次の操作を実行することをお勧めします。対応するblkcgのcgroup.procsインターフェイスを設定し、このblkcgにマップされたmemcgsが他のblkcgsにマップされないように、プロセスのIDをインターフェイスに書き込みます。 ツールを使用してmemcgsとblkcgsの間のマッピングを表示することもできます。 詳細については、「memcgsからblkcgsへのマッピングの確認」をご参照ください。

O&M中に、プロセスは異なるcgroupに移動することができる。 上記のルールに基づいて、プロセスがmemcgs間を移動する場合、例外は発生しません。 ただし、プロセスがブロック間を移動する場合、例外が発生する可能性があります。 cgroupライトバック機能のコードでは、例外を防ぐために次のルールが定義されています。実行中のblkcgのプロセスが別のblkcgに移動すると、そのプロセスが属するmemcgがルートblkcgにマップされます。 通常、ルートblkcgにはスロットリングしきい値は設定されません。 memcgがルートblkcgにマップされると、スロットリング機能は有効になりません。

重要

上記のルールはカーネルコードで定義されていますが、blkcgs間でプロセスを移動しないことを推奨します。

cgroupライトバック機能の有効化

デフォルトでは、cgroup v1インターフェイスのcgroupライトバック機能は無効になっています。 この機能を有効にするには、次の手順を実行します。

  1. cgwb_v1フィールドをgrubbyコマンドに追加し、コマンドを実行してcgroupライトバック機能を有効にします。

    この例では、カーネルのバージョンは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. cgroupライトバック機能が有効になるようにシステムを再起動します。

    sudo reboot
  3. 次のコマンドを実行して、/proc/cmdlineカーネルファイルを読み取ります。 コマンドのパラメーターにcgwb_v1フィールドが含まれていることを確認します。 このように、対応するblkcgs内のblkio.throttle.write_bps_deviceおよびblkio.throttle.write_iops_deviceインターフェイスは、バッファリングされるI/Oレートを制限することができる。

    cat /proc/cmdline | grep cgwb_v1
説明

Kubernetes環境では、cgroupライトバック機能を有効にしてプロセスのバッファリングされたI/Oレートを制限した後、プロセスの移動によってスロットリングが無効にならないように、memcgをblkcgに関連付ける必要があります。

  1. memcgをblkcgに関連付けます。

    1. system.confファイルを編集します。

      sudo vim /etc/systemd/system.conf
    2. JoinControllersの設定を変更します。 例:

      JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio
    3. Escキーを押して挿入モードを終了し、:wqと入力してファイルを保存して終了します。

  2. 次のコマンドを実行してカーネルイメージを再作成し、新しいsystemd設定が有効になるようにします。

    sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12。al7.x86_64 -- 力
  3. 次のコマンドを実行して、システムを再起動します。

    sudo reboot
  4. 次のコマンドを実行して、blkcgとmemcgが関連付けられているかどうかを確認します。

    ls /sys/fs/cgroup

cgroupライトバック機能が有効かどうかを確認する

この例では、I/Oを生成する2つのプロセスをシミュレートして、cgroupライトバック機能が有効かどうかを確認します。

説明
  • ddコマンドはすばやく応答し、画面のロールが速すぎて表示できません。 iostatコマンドを実行して、ddコマンドの出力を表示します。

  • ddコマンドは、データを順番に書き込みます。 システムは、1 MBの出力データが生成される毎にシーケンシャルI/Oリフレッシュを行う。 したがって、blkio.throttle.write_bps_deviceのしきい値を1 MB (1,048,576バイト) 以上に設定する必要があります。 blkio.throttle.write_bps_deviceのしきい値を1 MB未満に設定すると、I/Oがハングすることがあります。

  1. I/Oを生成する2つのプロセスをシミュレートし、上記の制限に基づいて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"    # $$ specify the process ID.
    sudo bash -c "echo $$ > /sys/fs/cgroup/memory/memcg1/cgroup.procs"    # $$ specify the process ID.
  2. blkcgでblkio.throttle.write_bps_deviceインターフェイスを使用して、バッファリングされたI/Oレートを制限します。

    sudo bash -c "echo 254:48 10485760 > /sys/fs/cgroup/blkio/blkcg1/blkio.throttle.write_bps_device"# ディスクのライトバック調整しきい値をデバイス番号に基づいて10メガバイト/秒に設定します。
  3. oflagが同期に設定されていないddコマンドを使用して、バッファリングされたI/Oを生成します。

    sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000
  4. iostatツールを使用して結果を照会します。 コマンド出力のwMB/s列を表示します。 値が10メガバイト/秒の場合、cgroupライトバック機能が有効になります。

    iostat -xdm 1 vdd

memcgsからblkcgsへのマッピングを確認する

次のいずれかの方法を使用して、memcgsからblkcgsへのマッピングが1対1であるか、多対1であるかを確認できます。

  • 次のコマンドを実行して、memcgsからblkcgsへのマッピングを表示します。

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

    次のサンプル応答は、memcgからblkcgへのマッピングが1対1であることを示しています。

    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へのマッピングが1対1であることを示しています。

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