NFS kinerja penulisan buruk

20

Saya memiliki dua mesin yang terhubung dengan 10Gbit Ethernet. Biarkan salah satu dari mereka menjadi server NFS dan yang lain akan menjadi klien NF.

Menguji kecepatan jaringan melalui TCP dengan iperfmenunjukkan ~ 9,8 Gbit / s throughput di kedua arah, sehingga jaringan OK.

Menguji kinerja disk server NFS:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

Hasilnya ~ 150 MBytes / s, jadi disk berfungsi dengan baik untuk menulis.

Server /etc/exportsadalah:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

Klien me-mount bagian ini ke lokal /mnt/testdengan opsi berikut:

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

Jika saya mencoba mengunduh file besar (~ 5Gb) pada mesin klien dari share NFS, saya mendapatkan kinerja ~ 130-140 MBytes / s yang dekat dengan kinerja disk lokal server, jadi memuaskan.

Tetapi ketika saya mencoba mengunggah file besar ke share NFS, upload dimulai pada ~ 1,5 Mbytes / s, perlahan-lahan meningkat hingga 18-20 Mbytes / s dan berhenti meningkat. Terkadang bagian "hang" selama beberapa menit sebelum unggahan benar-benar dimulai, yaitu lalu lintas antara host menjadi mendekati nol dan jika saya mengeksekusi ls /mnt/test, itu tidak kembali selama satu atau dua menit. Kemudian lsperintah kembali dan mengunggah dimulai dengan kecepatan awal 1,5Mbit / s.

Ketika kecepatan unggah mencapai maksimum (18-20 Mbytes / s), saya menjalankan iptraf-ngdan itu menunjukkan ~ 190 Mbit / s lalu lintas di antarmuka jaringan, jadi jaringan bukanlah hambatan di sini, serta HDD server.

Apa yang saya coba:

1. Atur server NFS pada host ketiga yang hanya terhubung dengan NIC Ethernet 100Mbit. Hasilnya analog: DL menunjukkan kinerja yang baik dan pemanfaatan jaringan 100Mbit hampir penuh, unggahan tidak berkinerja lebih cepat dari ratusan kilobyte per detik, menjadikan pemanfaatan jaringan sangat rendah (2,5 Mbit / dtk menurut iptraf-ng).

2. Saya mencoba menyetel beberapa parameter NFS:

  • sync atau async

  • noatime

  • tidak hard

  • rsizedan wsizemaksimal dalam contoh saya, jadi saya mencoba menguranginya dalam beberapa langkah ke 8192

3. Saya mencoba untuk beralih mesin klien dan server (mengatur server NFS pada mantan klien dan sebaliknya). Selain itu, ada enam server lagi dengan konfigurasi yang sama, jadi saya mencoba untuk me-mount mereka satu sama lain dalam variasi yang berbeda. Hasil yang sama

4. MTU = 9000, MTU = 9000 dan 802.3ad agregasi tautan, agregasi tautan dengan MTU = 1500.

5. sysctl tuning:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

Hasil yang sama

6. Pasang dari localhost:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

Dan di sini saya mendapatkan hasil yang sama: unduh dari /mnt/testmount/cepat, unggah menjadi /mnt/testmount/sangat lambat, tidak lebih cepat dari 22 MB / s dan ada sedikit penundaan sebelum transfer benar-benar dimulai. Apakah ini berarti bahwa tumpukan jaringan berfungsi dengan sempurna dan masalahnya ada di NFS?

Semua ini tidak membantu, hasilnya tidak berbeda secara signifikan dari konfigurasi default. echo 3 > /proc/sys/vm/drop_cachesdieksekusi sebelum semua tes.

MTU semua NICS di semua 3 host adalah 1500, tidak ada penyetelan jaringan non-standar yang dilakukan. Switch Ethernet adalah Dell MXL 10 / 40Gbe.

OS adalah CentOS 7.

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Pengaturan apa yang saya lewatkan? Bagaimana membuat NFS menulis dengan cepat dan tanpa hang?

Sergey
sumber
1
Anda memiliki test case yang cukup lengkap, tetapi saya akan mencoba memasang pada server itu sendiri dan menulis dari sana, dengan cara itu Anda dapat mengetahui apakah NFS stack atau stack jaringan salah. Juga, coba alihkan server dan klien (ekspor dari klien, pasang di server) dan juga, gunakan klien yang berbeda sama sekali. proses stracing server / klien tidak mengungkapkan apa-apa?
Dalibor Karlovic
@ DaliborKarlović Saya mencoba semua kecuali strace dan menambahkan informasi ke pertanyaan. Mount dari localhost bekerja lambat, sehingga jaringan stack dan switch tampaknya tidak bersalah. Saya menggunakan kernel-space NFS dan Operation not permittedmencoba melampirkan strace ke proses NFS.
Sergey
Saya berasumsi ini berarti Anda dapat mengesampingkan tumpukan jaringan sepenuhnya (tetapi Anda harus melampirkan strace untuk memastikan). Anda harus dapat menandai proses apa pun sebagai pengguna root jika tidak terkena bug tertentu .
Dalibor Karlovic
@ DaliborKarlović Tentunya saya mencoba strace sebagai root. Saya dapat melampirkan ke proses userspace apa pun, tetapi tidak yang kernelern. Tetapi informasi apa yang bisa saya dapatkan dari outputnya? Saya kira itu akan menghasilkan ratusan ribu garis output jika saya lampirkan ke NFS dan mulai mengunggah. Haruskah saya memperhatikan nilai pengembalian bukan nol?
Sergey
Anda benar, saya tidak menganggapnya sebagai proses non-userland. Saya berharap untuk melihat apa yang dilakukannya saat "hang" di awal transfer, mungkin sesuatu yang sepele seperti pencarian DNS terbalik yang salah dikonfigurasi.
Dalibor Karlović

Jawaban:

3

Anda menggunakan opsi sinkronisasi dalam pernyataan ekspor Anda. Ini berarti bahwa server hanya mengkonfirmasi operasi tulis setelah mereka benar-benar ditulis ke disk. Mengingat Anda memiliki disk pemintalan (yaitu tidak ada SSD), ini membutuhkan rata-rata setidaknya 1/2 putaran operasi disk per penulisan, yang merupakan penyebab perlambatan.

Menggunakan pengaturan async, server segera mengakui operasi tulis kepada klien ketika diproses tetapi belum ditulis ke disk. Ini sedikit lebih tidak dapat diandalkan, misalnya, dalam kasus kegagalan daya ketika klien menerima ack untuk operasi yang tidak terjadi. Namun, ini memberikan peningkatan besar dalam kinerja penulisan.

(edit) Saya baru saja melihat bahwa Anda sudah menguji opsi async vs sync. Namun, saya hampir yakin bahwa ini adalah penyebab masalah penurunan kinerja Anda - Saya pernah memiliki indikasi yang persis sama dengan pengaturan idencitcal. Mungkin Anda mengujinya lagi. Apakah Anda memberikan opsi async pada pernyataan ekspor server DAN dalam operasi mount pada klien pada saat yang sama?

Bernd Gloss
sumber
+1 Penjelasan yang paling mungkin adalah sinkronisasi tidak dinonaktifkan dengan benar.
David Schwartz
2

Ini bisa menjadi masalah yang terkait dengan ukuran paket dan latensi. Coba yang berikut ini:

Laporan tersebut mengembalikan hasil Anda.

shodanshok
sumber
Saya mencoba frame jumbo dengan MTU = 9000, tetapi hasilnya sama. Saya juga mencoba agregasi tautan dengan 802.3ad, sekali lagi tidak ada perubahan. Jadi saya mengembalikan semua pengaturan ini agar sedekat mungkin dengan keadaan default. Juga saya mencoba untuk menyetel itu net.core.*dan net.ipv4.*sysctl, tapi mungkin saya membuat eksperimen terlalu sedikit Oke, saya akan melakukan beberapa tes lagi dan akan melaporkan.
Sergey
Saya mencoba sekali lagi untuk menyelaraskan sysctl di server dan klien, tetapi itu tidak membantu.
Sergey
Sudahkah Anda mencoba dengan UDP sebagai protokol transport?
shodanshok
Saya telah mencoba UDP (proto = udp di opsi mount), tetapi ia bekerja lebih lambat 1-2 MBytes / s daripada TCP. Hasilnya adalah pemasangan yang sama dari localhost dan dari host jarak jauh.
Sergey
2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

Mengkonfigurasi scheduler Linux pada sistem dengan RAID perangkat keras dan mengubah default dari [cfq] ke [noop] memberikan peningkatan I / O.

Gunakan perintah nfsstat, untuk menghitung persentase baca / tulis. Atur rasio cache pengontrol RAID agar sesuai.

Untuk beban kerja yang berat, Anda perlu menambah jumlah utas server NFS.

Konfigurasikan utas nfs untuk menulis tanpa penundaan ke disk menggunakan opsi no_delay.

Beri tahu kernel Linux untuk menyiram secepat mungkin agar penulisan disimpan sekecil mungkin. Dalam kernel Linux, frekuensi penulisan kembali halaman yang kotor dapat dikontrol oleh dua parameter.

Untuk penulisan disk yang lebih cepat, gunakan data sistem file = opsi jurnal dan cegah pembaruan untuk mengajukan waktu akses yang dengan sendirinya menghasilkan data tambahan yang ditulis ke disk. Mode ini adalah yang tercepat ketika data perlu dibaca dari dan ditulis ke disk pada saat yang sama di mana ia mengungguli semua mode lainnya

Vasco V.
sumber