全部產品
Search
文件中心

Alibaba Cloud Linux:使用Alibaba Cloud Linux 2鏡像的ECS執行個體中ext4檔案系統Buffer I/O寫效能不符合預期解決方案

更新時間:May 13, 2025

本文介紹了使用Alibaba Cloud Linux 2系統的ECS執行個體中ext4檔案系統的Buffer I/O寫效能不符合預期的原因及解決方案。

問題描述

在ext4檔案系統中執行常規的緩衝非同步I/O(Buffer I/O)寫操作時,可能會觀察到效能表現不符合預期的問題。存在該問題的ECS執行個體具有以下特徵:

  • 鏡像:aliyun-2.1903-x64-20G-alibase-20190327.vhd(包含)~aliyun_2_1903_x64_20G_alibase_20220525.vhd(不含)之間的鏡像版本。

  • 核心:kernel-4.19.24-9.al7(包含)~4.19.91-26.al7.x86_64(不含)之間的核心版本。您可以通過uname -r命令來查看核心版本。

  • 通過dioread_nolocknodelalloc兩個選項掛載ext4檔案系統。

    說明
    • 查看Block Storage效能

    • 關於如何查看檔案系統類型及掛載選項,請參考如下步驟:

      查看檔案系統類型及掛載選項

      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,在進行如下兩個資料寫入情境時會出現寫入效能不符合預期的問題。

情境一:使用cp命令拷貝大檔案

執行以下命令,將大檔案拷貝到滿足上述特徵的ext4檔案系統。

<$LargeFiles>需替換為您本地的一個大檔案。為複現寫入效能不符合預期的問題,建議該檔案的大小應大於2 GiB。

cp <$LargeFiles> /mnt/badfile

情境二:使用不帶同步標誌的dd命令寫入檔案

執行以下命令,使用不帶同步標誌的dd命令寫檔案到滿足上述特徵的ext4檔案系統。

dd if=/dev/zero of=/mnt/badfile bs=10M count=1000

在進行以上兩個情境操作時,您可以在終端中通過iostat -xm 1命令觀察對應磁碟的寫入速度,wMB/s列的值只有30 MB/s左右,遠低於ECS的Block Storage效能。系統顯示樣本如下所示:

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

問題原因

當檔案系統以dioread_nolocknodelalloc組合選項掛載時,產生了大量核心中被稱為unwritten extents、大小為4 KB的髒頁(Dirty Page),由於ext4檔案系統處理邏輯的缺陷,這些4 KB的髒頁並不會被合并成若干個大頁再進行寫回,而是直接以小頁的形式被處理。通過Perf工具觀察核心寫回頁面緩衝的過程,發現處理過程主要發生在ext4檔案系統的ext4_writepages函數內部,在尋找和映射4 KB髒頁的邏輯中耗費了大量的時間,從而造成檔案寫入效能極低。

解決方案

方案一:取消同時使用dioread_nolocknodelalloc掛載ext4檔案系統

  1. 執行以下命令,重新掛載ext4檔案系統,取消同時使用dioread_nolocknodelalloc的掛載選項組合。

    • <$Device>需替換為ext4檔案系統的裝置名稱。可通過lsblk命令擷取,回顯資訊中的NAME列即為裝置名稱。

    • <$MountPoint>需替換為ext4檔案系統的掛載點。掛載點可以是已有空目錄,或執行sudo mkdir -p <新目錄>命令建立新目錄作為掛載點。

    sudo mount -o remount,delalloc <$Device> <$MountPoint>
  2. 修改/etc/fstab檔案,刪除ext4檔案系統的nodelalloc選項(預設為delalloc),以確保系統開機自動掛載。

方案二:升級核心版本

警告
  • 升級核心可能會出現相容性和穩定性問題,建議您查看Alibaba Cloud Linux 2鏡像發布記錄瞭解具體核心功能後謹慎進行操作。

  • 重啟執行個體將導致您的執行個體暫停運行,這可能引發業務中斷和資料丟失。因此,建議您在執行此操作之前備份關鍵資料,並選擇在非業務高峰期進行。

  1. 執行以下命令,升級核心到最新版本。

    sudo yum update kernel
  2. 執行以下命令,重啟執行個體使配置生效。

    sudo reboot