このトピックでは、Alibaba Cloud Linux 2を実行するElastic Compute Service(ECS)インスタンス上のExt4ファイルシステムのバッファI/O書き込みパフォーマンスが期待どおりでない問題の原因と解決策について説明します。
問題の説明
以下の構成のECSインスタンス上のExt4ファイルシステムでは、バッファI/O書き込み操作が期待どおりに実行されない場合があります。
イメージバージョン:
aliyun-2.1903-x64-20G-alibase-20190327.vhd以上aliyun_2_1903_x64_20G_alibase_20220525.vhd未満。カーネルバージョン:
kernel-4.19.24-9.al7以上kernel-4.19.91-26.al7.x86_64未満。uname -rコマンドを実行して、カーネルバージョンを確認できます。dioread_nolockオプションとnodelallocオプションを使用してマウントされたExt4ファイルシステム。説明詳細については、「ブロックストレージのパフォーマンス」をご参照ください。
次の手順を実行します。
上記の構成のECSインスタンスでは、以下のシナリオで書き込みパフォーマンスが期待を下回る問題が発生する可能性があります。
注cplarge ファイルをコピーするコマンド
次のコマンドを実行して、上記の構成の Ext4 ファイルシステムに大きなファイルをコピーします。
<$LargeFiles> をコピーするオンプレミスの大きなファイルの名前に置き換えます。書き込みパフォーマンスが期待を下回る問題をシミュレートするには、2 GiBを超えるファイルを使用します。
cp <$LargeFiles> /mnt/badfileシナリオ 2: 同期フラグなしで dd コマンドを実行してファイルを書き込む
同期フラグなしで次のコマンドを実行して、上記の構成の Ext4 ファイルシステムにファイルを書き込みます。
dd if=/dev/zero of=/mnt/badfile bs=10M count=1000上記のシナリオでECSインスタンス上で iostat -xm 1 コマンドを実行して書き込み速度を確認すると、次のコマンド出力が返されます。wMB/s列の値は約 30 MB/s で、ECSインスタンスの期待されるブロックストレージのパフォーマンスよりも低くなっています。
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 12.77 0.00 0.00 87.23
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
vdb 0.00 7194.00 0.00 57.00 0.00 28.05 1008.00 0.02 17.81 0.00 17.81 0.39 2.20原因
Ext4 ファイルシステムが dioread_nolock オプションと nodelalloc オプションを使用してマウントされている場合、unwritten extents と呼ばれる 4 KB のダーティページがカーネルに多数生成されます。Ext4ファイルシステムの処理ロジックの欠陥により、これらのページは書き戻される前にヒュージページにマージされず、小さなページとして処理されます。Perf ツールを使用してカーネルのページキャッシュ書き戻しプロセスを監視すると、プロセスが Ext4 ファイルシステムの ext4_writepages 関数によって実行されていることがわかります。4 KB のダーティページの検索とマッピングにかなりの時間が費やされ、ファイルの書き込みパフォーマンスが非常に低くなります。
解決策
解決策 1:dioread_nolock オプションと nodelalloc オプションなしで Ext4 ファイルシステムを再マウントする
dioread_nolockオプションとnodelallocオプションなしでExt4ファイルシステムを再マウントします。<$Device>をExt4ファイルシステムのデバイス名に置き換えます。lsblkコマンドを実行して、コマンド出力のNAME列にあるファイルシステムのデバイス名を表示できます。<$MountPoint>をExt4ファイルシステムに必要なマウントポイントに置き換えます。既存の空のディレクトリをマウントポイントとして選択するか、sudo mkdir -p <new directory>コマンドを実行して作成できます。
sudo mount -o remount,delalloc <$Device> <$MountPoint>システム起動時にファイルシステムが自動的にマウントされるように、
/etc/fstabファイルからExtファイルシステムのnodelallocオプションを削除します。デフォルトでは、Ext4ファイルシステムにはdelallocオプションが使用されます。
解決策 2:カーネルバージョンをアップグレードする
カーネルのアップグレードは、互換性と安定性の問題を引き起こす可能性があります。 Alibaba Cloud Linux 2 のリリースノートでカーネルの機能を確認し、カーネルバージョンをアップグレードする際は注意してください。
再起動操作によりインスタンスが一時的に停止し、実行中のサービスが中断され、データが失われる可能性があります。そのため、重要なインスタンスデータをバックアップしてから、オフピーク時にインスタンスを再起動してください。
最新のカーネルバージョンにアップグレードします。
sudo yum update kernel新しいカーネルバージョンを有効にするために、インスタンスを再起動します。
sudo reboot