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は
memcg1
とblkcg1
に属し、Bはmemcg2
とblkcg0
に属します。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ライトバック機能は無効になっています。 この機能を有効にするには、次の手順を実行します。
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"
cgroupライトバック機能が有効になるようにシステムを再起動します。
sudo reboot
次のコマンドを実行して、
/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に関連付ける必要があります。
memcgをblkcgに関連付けます。
system.confファイルを編集します。
sudo vim /etc/systemd/system.conf
JoinControllersの設定を変更します。 例:
JoinControllers=cpu,cpuacct net_cls,net_prio memory,blkio
Escキーを押して挿入モードを終了し、:wqと入力してファイルを保存して終了します。
次のコマンドを実行してカーネルイメージを再作成し、新しいsystemd設定が有効になるようにします。
sudo dracut /boot/initramfs-4.19.36-12.al7.x86_64.img 4.19.36-12。al7.x86_64 -- 力
次のコマンドを実行して、システムを再起動します。
sudo reboot
次のコマンドを実行して、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がハングすることがあります。
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.
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メガバイト/秒に設定します。
oflag
が同期に設定されていないdd
コマンドを使用して、バッファリングされたI/Oを生成します。sudo dd if=/dev/zero of=/mnt/vdd/testfile bs=4k count=10000
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カーネル监视ツールを使用する。
ftraceツールを使用します。
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/writeback/insert_memcg_blkcg_link/enable"
出力情報を表示します。
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