Topik ini menjelaskan penyebab dan solusi untuk masalah kinerja penulisan I/O buffer sistem file Ext4 pada instance Elastic Compute Service (ECS) yang menjalankan Alibaba Cloud Linux 2.
Deskripsi masalah
Operasi penulisan I/O buffer mungkin tidak berjalan sesuai harapan dalam sistem file Ext4 pada instance ECS dengan konfigurasi berikut:
Versi gambar: dari
aliyun-2.1903-x64-20G-alibase-20190327.vhd(inklusif) hinggaaliyun_2_1903_x64_20G_alibase_20220525.vhd(eksklusif).Versi kernel: dari
kernel-4.19.24-9.al7(inklusif) hinggakernel-4.19.91-26.al7.x86_64(eksklusif). Anda dapat menjalankan perintahuname -runtuk memeriksa versi kernel.Sistem file Ext4 dipasang dengan opsi
dioread_nolockdannodelalloc.CatatanPelajari tentang kinerja penyimpanan blok.
Lakukan langkah-langkah berikut:
Instance ECS dengan konfigurasi di atas mungkin mengalami masalah kinerja penulisan yang tidak sesuai harapan dalam skenario berikut:
Skenario 1: Jalankan Perintah cp untuk Menyalin File Besar
Jalankan perintah berikut untuk menyalin file besar ke sistem file Ext4 dengan konfigurasi di atas.
Ganti <$LargeFiles> dengan nama file besar lokal yang ingin Anda salin. Untuk mensimulasikan masalah kinerja penulisan yang tidak sesuai harapan, gunakan file lebih besar dari 2 GiB.
cp <$LargeFiles> /mnt/badfileSkenario 2: Jalankan Perintah dd Tanpa Flag Sinkronisasi untuk Menulis File
Jalankan perintah berikut tanpa flag sinkronisasi untuk menulis file ke sistem file Ext4 dengan konfigurasi di atas:
dd if=/dev/zero of=/mnt/badfile bs=10M count=1000Ketika Anda menjalankan perintah iostat -xm 1 pada instance ECS dalam skenario di atas untuk memeriksa kecepatan penulisan, keluaran perintah berikut akan ditampilkan. Nilai pada kolom wMB/s adalah sekitar 30 MB/s, yang lebih rendah dari kinerja penyimpanan blok yang diharapkan dari instance 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.20Penyebab
Ketika sistem file Ext4 dipasang dengan opsi dioread_nolock dan nodelalloc, sejumlah besar halaman kotor 4-KB yang disebut unwritten extents dihasilkan di kernel. Karena adanya cacat dalam logika pemrosesan sistem file Ext4, halaman-halaman ini tidak digabungkan menjadi halaman besar sebelum ditulis kembali dan diproses sebagai halaman kecil. Ketika Anda menggunakan alat Perf untuk memantau proses penulisan kembali cache halaman kernel, Anda akan menemukan bahwa proses ini dilakukan oleh fungsi ext4_writepages dari sistem file Ext4. Sebagian besar waktu dihabiskan untuk mencari dan memetakan halaman kotor 4-KB, sehingga mengakibatkan kinerja penulisan file yang sangat rendah.
Solusi
Solusi 1: Pasang ulang sistem file Ext4 tanpa opsi dioread_nolock dan nodelalloc
Pasang ulang sistem file
Ext4tanpa opsidioread_nolockdannodelalloc.Ganti
<$Device>dengan nama perangkat sistem file Ext4. Anda dapat menjalankan perintahlsblkuntuk melihat nama perangkat sistem file di kolom NAME pada keluaran perintah.Ganti
<$MountPoint>dengan titik pemasangan yang Anda inginkan untuk sistem fileExt4. Anda dapat memilih direktori kosong yang ada sebagai titik pemasangan atau membuat satu dengan menjalankan perintahsudo mkdir -p <new directory>.
sudo mount -o remount,delalloc <$Device> <$MountPoint>Hapus opsi
nodelallocuntuk sistem fileExtdari file/etc/fstabuntuk memastikan bahwa sistem file dipasang secara otomatis saat startup sistem. Secara default, opsidelallocdigunakan untuk sistem fileExt4.
Solusi 2: Tingkatkan versi kernel
Peningkatan kernel dapat menyebabkan masalah kompatibilitas dan stabilitas. Tinjau fitur kernel dalam catatan rilis untuk Alibaba Cloud Linux 2 dan berhati-hatilah ketika Anda meningkatkan versi kernel.
Operasi restart sementara menghentikan instance, yang dapat mengganggu layanan yang sedang berjalan dan menyebabkan kehilangan data. Oleh karena itu, cadangkan data penting instance dan kemudian restart instance selama jam-jam sepi.
Tingkatkan ke versi kernel terbaru.
sudo yum update kernelMulai ulang instance agar versi kernel baru berlaku.
sudo reboot