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

Alibaba Cloud Linux:Alibaba Cloud Linux 2 ECSインスタンス上のExt4ファイルシステムのバッファI/O書き込みパフォーマンスが期待どおりでない場合はどうすればよいですか?

最終更新日:May 27, 2025

このトピックでは、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ファイルシステム。

    説明
    • 詳細については、「ブロックストレージのパフォーマンス」をご参照ください。

    • 次の手順を実行します。

      ファイルシステムの種類とマウントオプションを確認する

      1. 書き込み操作のターゲットディレクトリが配置されているディスクパーティションを特定します。

        <$DIR> を書き込み操作のターゲットディレクトリに置き換えます。

        df <$DIR> | grep -v Filesystem | awk '{ print $1 }'
      2. ディスクパーティションのファイルシステムの種類とマウントオプションを表示します。

        <$Partition> を前の手順で取得したディスクパーティション名に置き換えます。

        mount | grep -w <$Partition> | grep ext4 | grep -w dioread_nolock | grep -w nodelalloc

上記の構成の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 ファイルシステムを再マウントする

  1. dioread_nolock オプションと nodelalloc オプションなしで Ext4 ファイルシステムを再マウントします。

    • <$Device> をExt4ファイルシステムのデバイス名に置き換えます。lsblk コマンドを実行して、コマンド出力のNAME列にあるファイルシステムのデバイス名を表示できます。

    • <$MountPoint>Ext4 ファイルシステムに必要なマウントポイントに置き換えます。既存の空のディレクトリをマウントポイントとして選択するか、sudo mkdir -p <new directory> コマンドを実行して作成できます。

    sudo mount -o remount,delalloc <$Device> <$MountPoint>
  2. システム起動時にファイルシステムが自動的にマウントされるように、/etc/fstab ファイルから Ext ファイルシステムの nodelalloc オプションを削除します。デフォルトでは、Ext4 ファイルシステムには delalloc オプションが使用されます。

解決策 2:カーネルバージョンをアップグレードする

警告
  • カーネルのアップグレードは、互換性と安定性の問題を引き起こす可能性があります。 Alibaba Cloud Linux 2 のリリースノートでカーネルの機能を確認し、カーネルバージョンをアップグレードする際は注意してください。

  • 再起動操作によりインスタンスが一時的に停止し、実行中のサービスが中断され、データが失われる可能性があります。そのため、重要なインスタンスデータをバックアップしてから、オフピーク時にインスタンスを再起動してください。

  1. 最新のカーネルバージョンにアップグレードします。

    sudo yum update kernel
  2. 新しいカーネルバージョンを有効にするために、インスタンスを再起動します。

    sudo reboot