全部产品
Search
文档中心

Alibaba Cloud Linux:Apa yang harus saya lakukan jika sistem file NFS pada instance Alibaba Cloud Linux 3 mengalami performa baca file yang buruk?

更新时间:Jun 28, 2025

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=1M
    Catatan

    Contoh 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 rsize menunjukkan ukuran maksimum data yang dapat diterima klien NFS untuk setiap permintaan baca jaringan. Secara default, nilai read_ahead_kb adalah 15 kali lebih besar dari nilai rsize. Pada Alibaba Cloud Linux 2 dengan kernel versi 4.19, nilai default rsize adalah 1.024 KB, sedangkan nilai read_ahead_kb adalah 15.360 KB.

  • Namun, setelah commit (index : kernel/git/torvalds/linux.git) diperkenalkan di kernel Linux 5.4, parameter read_ahead_kb bergantung pada parameter VM_READAHEAD_PAGES bukan rsize. Pada Alibaba Cloud Linux 3 dengan kernel versi 5.10, nilai default read_ahead_kb adalah 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.

Penting

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.

  1. Periksa pengaturan read-ahead dari sistem file NFS.

    cat /sys/class/bdi/$(mountpoint -d <nfs_mountpoint>)/read_ahead_kb

    Ganti <nfs_mountpoint> dengan jalur sebenarnya dari titik mount NFS. Untuk mendapatkan jalur, jalankan perintah cat /proc/self/mountinfo.

  2. 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 perintah sudo mountpoint -d <nfs_mountpoint>.

    Contoh perintah:

    sudo sh -c 'echo 15360 > /sys/class/bdi/0:422/read_ahead_kb'
    Catatan

    Jika 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:

Catatan

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.

  1. 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.rules
  2. Tambahkan aturan udev ke file konfigurasi untuk memungkinkan sistem file NFS secara otomatis memodifikasi pengaturan read-ahead.

    Dalam contoh ini, parameter read_ahead_kb diatur 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"
  3. Simpan dan tutup file konfigurasi.

  4. Muat ulang file konfigurasi agar aturan baru berlaku.

    sudo udevadm control --reload
  5. Picu secara manual peristiwa pemeriksaan aturan udev untuk memodifikasi nilai read_ahead_kb untuk 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.

  1. Buka dan edit file konfigurasi NFS.

    sudo vim /etc/nfs.conf
  2. Modifikasi pengaturan read-ahead default, lalu simpan dan tutup file.

    [nfsrahead]
    nfs=15000
    nfs4=16000

    Modifikasi pengaturan read-ahead berdasarkan versi sistem file NFS: nfs untuk versi 3 dan nfs4 untuk versi 4. Untuk memeriksa versi, jalankan perintah mount -v | grep nfs.

  3. 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>