Ketika Anda menggunakan panggilan sistem seperti read dan copy_file_range untuk membaca file dari sistem file Network File System (NFS) pada instance Alibaba Cloud Linux 3, performa pembacaan mungkin menurun secara signifikan dibandingkan dengan instance Alibaba Cloud Linux 2. Topik ini menjelaskan penyebab dan solusi untuk masalah tersebut.
Deskripsi Masalah
Gejala
Sistem file NFS pada instance Alibaba Cloud Linux 3 mengalami performa baca file yang buruk dengan situasi berikut:
Instance membutuhkan waktu lama untuk membaca file besar dari sistem file NFS melalui panggilan sistem seperti read dan copy_file_range.
Instance membutuhkan waktu lebih lama daripada instance Alibaba Cloud Linux 2 untuk membaca data dari file di titik mount NFS menggunakan perintah
dd. Contoh perintah:dd if=<nfs_mntpoint>/<testfile> of=/dev/null bs=1MCatatanContoh perintah membaca data dari file testfile di titik mount NFS dan mengirimkan data ke perangkat /dev/null. Setelah menjalankan perintah
dd, keluaran mencakup informasi spesifik seperti jumlah total byte yang dibaca dan waktu yang dikonsumsi. Informasi ini dapat digunakan untuk menghitung laju pembacaan data dan mengevaluasi performa sistem file NFS.
Dampak
Masalah ini terutama terjadi pada instance ECS dengan konfigurasi berikut:
Image: aliyun_3_x64_20G_alibase_20210415.vhd dan seterusnya.
Kernel: 5.10.23-4.al8.x86_64 dan seterusnya.
Sistem file: Sistem file NFS telah dimount, dan file dalam direktori titik mount sedang dibaca.
Penyebab
Di kernel Linux upstream, parameter read_ahead_kb menentukan ukuran jendela read-ahead dari perangkat blok. Read-ahead adalah teknologi optimasi performa yang memungkinkan sistem memprediksi data yang kemungkinan akan diakses dalam waktu dekat dan proaktif memuat data tersebut ke dalam memori. Jika data read-ahead tersedia, sistem dapat membaca langsung dari memori tanpa menunggu operasi I/O disk selesai, mengurangi latensi dan meningkatkan efisiensi pembacaan data.
Sebelum versi kernel Linux 5.4, jumlah data baca-dahulu yang didukung oleh sistem file NFS bergantung pada nilai rsize yang ditentukan saat pemasangan. Nilai
rsizemenunjukkan ukuran maksimum data yang dapat diterima klien NFS untuk setiap permintaan baca jaringan. Secara default, nilairead_ahead_kbadalah 15 kali lebih besar dari nilairsize. Pada Alibaba Cloud Linux 2 dengan kernel versi 4.19, nilai defaultrsizeadalah 1.024 KB, sedangkan nilairead_ahead_kbadalah 15.360 KB.Namun, setelah commit (index : kernel/git/torvalds/linux.git) diperkenalkan di kernel Linux 5.4, parameter
read_ahead_kbbergantung pada parameterVM_READAHEAD_PAGESbukanrsize. Pada Alibaba Cloud Linux 3 dengan kernel versi 5.10, nilai defaultread_ahead_kbadalah 128 KB.
Akibatnya, performa pembacaan file pada Alibaba Cloud Linux 3 lebih rendah dibandingkan dengan Alibaba Cloud Linux 2. Untuk instance Alibaba Cloud Linux 3, Anda perlu mengevaluasi ulang dan menyesuaikan ukuran jendela read-ahead untuk mengoptimalkan efisiensi pembacaan file.
Pada sistem file NFS, jendela read-ahead yang besar dapat meningkatkan performa pembacaan berkelanjutan dari file besar. Namun, jika jendela terlalu besar, data yang tidak diperlukan mungkin dimuat ke dalam memori, terutama dalam skenario pembacaan acak. Oleh karena itu, kami merekomendasikan agar Anda mengevaluasi beban kerja aktual berdasarkan lingkungan bisnis Anda dan menyesuaikan nilai read_ahead_kb untuk mendapatkan ukuran jendela read-ahead yang optimal.
Solusi
Anda dapat menggunakan salah satu metode berikut untuk memodifikasi nilai read_ahead_kb.
Jalankan perintah echo untuk memodifikasi nilai read_ahead_kb untuk satu sistem file.
Periksa pengaturan read-ahead dari sistem file NFS.
cat /sys/class/bdi/$(mountpoint -d <nfs_mountpoint>)/read_ahead_kbGanti
<nfs_mountpoint>dengan jalur sebenarnya dari titik mount NFS. Untuk mendapatkan jalur, jalankan perintahcat /proc/self/mountinfo.Tingkatkan ukuran jendela read-ahead sistem file NFS secara tepat.
sudo sh -c 'echo <num> > /sys/class/bdi/<major>:<minor>/read_ahead_kb'Atur parameter berikut berdasarkan lingkungan sebenarnya:
<num>: ukuran jendela read-ahead dalam KB.<major>:<minor>: nomor perangkat mayor dan minor dari sistem file NFS. Untuk mendapatkan nomor-nomor tersebut, jalankan perintahsudo mountpoint -d <nfs_mountpoint>.
Contoh perintah:
sudo sh -c 'echo 15360 > /sys/class/bdi/0:422/read_ahead_kb'CatatanJika beberapa sistem file NFS dimount ke instance, jalankan perintah berulang kali untuk memodifikasi pengaturan read-ahead setiap sistem file.
Modifikasi nilai read_ahead_kb untuk beberapa sistem file dengan menggunakan mekanisme udev.
Anda dapat menggunakan mekanisme udev untuk menambahkan aturan udev yang memicu pemeriksaan aturan udev secara manual untuk semua sistem file NFS yang dimount ke instance. Peristiwa pemeriksaan aturan udev memungkinkan instance secara otomatis memodifikasi pengaturan read-ahead untuk semua sistem file NFS yang dimount dan akan dimount. Ikuti langkah-langkah berikut:
udev adalah manajer perangkat untuk kernel Linux dan bertanggung jawab atas manajemen serta otomatisasi operasi file. Mekanisme udev menggunakan daemon udev sebagai komponen inti. Daemon udev berjalan di ruang pengguna dan berkomunikasi dengan kernel menggunakan mekanisme uevent.
Buka dan edit file konfigurasi yang berisi aturan udev untuk sistem file NFS. File konfigurasi terletak di direktori
/etc/udev/rules.d/. Jika file konfigurasi tidak ada, buat satu. Contoh perintah:sudo vim /etc/udev/rules.d/99-nfs.rulesTambahkan aturan udev ke file konfigurasi untuk memungkinkan sistem file NFS secara otomatis memodifikasi pengaturan read-ahead.
Dalam contoh ini, parameter
read_ahead_kbdiatur ke 15.360 KB. Anda dapat menyesuaikan nilai parameter ini sesuai kebutuhan bisnis Anda.SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes", ATTR{read_ahead_kb}="15360"Simpan dan tutup file konfigurasi.
Muat ulang file konfigurasi agar aturan baru berlaku.
sudo udevadm control --reloadPicu secara manual peristiwa pemeriksaan aturan udev untuk memodifikasi nilai
read_ahead_kbuntuk semua sistem file NFS yang dimount.sudo udevadm trigger -c add -s bdi
Modifikasi file konfigurasi NFS untuk memodifikasi nilai read_ahead_kb untuk beberapa sistem file versi 2.3.3-57.0.1.al8.1 atau lebih baru.
Jika versi sistem file NFS pada instance Alibaba Cloud Linux 3 adalah nfs-utils-2.3.3-57.0.1.al8.1 atau lebih baru, Anda dapat memodifikasi nilai read_ahead_kb dengan mengedit file konfigurasi NFS yang terletak di direktori /etc/nfs.conf. Jalankan perintah rpm -qa | grep nfs-utils untuk memeriksa versi sistem file NFS.
Buka dan edit file konfigurasi NFS.
sudo vim /etc/nfs.confModifikasi pengaturan read-ahead default, lalu simpan dan tutup file.
[nfsrahead] nfs=15000 nfs4=16000Modifikasi pengaturan read-ahead berdasarkan versi sistem file NFS:
nfsuntuk versi 3 dannfs4untuk versi 4. Untuk memeriksa versi, jalankan perintahmount -v | grep nfs.Untuk sistem file NFS yang dimount, unmount lalu mount ulang sistem file agar konfigurasi berlaku.
sudo umount <nfs_mountpoint> sudo mount -t nfs -o vers=<versi protokol NFS> <alamat server NFS> <nfs_mountpoint>