本文介紹了使用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_nolock和nodelalloc兩個選項掛載ext4檔案系統。說明關於如何查看檔案系統類型及掛載選項,請參考如下步驟:
滿足以上特徵的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_nolock和nodelalloc組合選項掛載時,產生了大量核心中被稱為unwritten extents、大小為4 KB的髒頁(Dirty Page),由於ext4檔案系統處理邏輯的缺陷,這些4 KB的髒頁並不會被合并成若干個大頁再進行寫回,而是直接以小頁的形式被處理。通過Perf工具觀察核心寫回頁面緩衝的過程,發現處理過程主要發生在ext4檔案系統的ext4_writepages函數內部,在尋找和映射4 KB髒頁的邏輯中耗費了大量的時間,從而造成檔案寫入效能極低。
解決方案
方案一:取消同時使用dioread_nolock和nodelalloc掛載ext4檔案系統
執行以下命令,重新掛載ext4檔案系統,取消同時使用
dioread_nolock和nodelalloc的掛載選項組合。<$Device>需替換為ext4檔案系統的裝置名稱。可通過lsblk命令擷取,回顯資訊中的NAME列即為裝置名稱。<$MountPoint>需替換為ext4檔案系統的掛載點。掛載點可以是已有空目錄,或執行sudo mkdir -p <新目錄>命令建立新目錄作為掛載點。
sudo mount -o remount,delalloc <$Device> <$MountPoint>修改
/etc/fstab檔案,刪除ext4檔案系統的nodelalloc選項(預設為delalloc),以確保系統開機自動掛載。
方案二:升級核心版本
升級核心可能會出現相容性和穩定性問題,建議您查看Alibaba Cloud Linux 2鏡像發布記錄瞭解具體核心功能後謹慎進行操作。
重啟執行個體將導致您的執行個體暫停運行,這可能引發業務中斷和資料丟失。因此,建議您在執行此操作之前備份關鍵資料,並選擇在非業務高峰期進行。
執行以下命令,升級核心到最新版本。
sudo yum update kernel執行以下命令,重啟執行個體使配置生效。
sudo reboot