Kinerja transfer NFS lambat dari file kecil

12

Saya menggunakan Openfiler 2.3 pada HP ML370 G5, Smart Array P400, disk SAS yang dikombinasikan menggunakan RAID 1 + 0.

Saya mengatur share NFS dari partisi ext3 menggunakan konfigurasi berbasis web Openfiler, dan saya berhasil me-mount share dari host lain. Kedua host terhubung menggunakan tautan gigabit khusus.

Tolok ukur sederhana menggunakan dd:

 $ dd if=/dev/zero of=outfile bs=1000 count=2000000
 2000000+0 records in
 2000000+0 records out
 2000000000 bytes (2.0 GB) copied, 34.4737 s, 58.0 MB/s

Saya melihatnya dapat mencapai kecepatan transfer moderat (58,0 MB / s).

Tetapi jika saya menyalin direktori yang berisi banyak file kecil ( .phpdan .jpg, sekitar 1-4 kB per file) dengan ukuran total ~ 300 MB, cpprosesnya berakhir sekitar 10 menit.

Apakah NFS tidak cocok untuk transfer file kecil seperti kasus di atas? Atau adakah beberapa parameter yang harus disesuaikan?

Arie K
sumber
Apakah ini menjawab pertanyaan Anda? Kinerja penulisan yang buruk NFS
Aleksandr Dubinsky

Jawaban:

7

Ada banyak alasan mengapa mentransfer banyak file kecil akan selalu lebih lambat daripada mentransfer satu file besar. Untuk dibaca, file-file tersebut cenderung tersebar di sekitar disk, sehingga membutuhkan semua tempat untuk mendapatkannya. Seperti yang disebutkan Evan, ada juga metadata yang terlibat dalam kasus NFS (atau sistem file lainnya!) Yang juga memperumit masalah.

Anda dapat mencoba meningkatkan rsizedan wsizeparameter Anda ke mount NFS dan melihat apakah itu akan sedikit membantu kinerja. Juga periksa pertanyaan ini pada penyetelan NFS untuk latensi minimum karena memiliki banyak saran bermanfaat yang akan membantu dalam kasus banyak transfer file kecil.

Kamil Kisiel
sumber
8

Saya tidak memiliki banyak pengalaman NFS, tetapi pengalaman saya dengan protokol berbagi file jaringan lainnya mengatakan bahwa kinerja menderita dalam skenario "banyak file kecil" hampir secara universal. Anda mengalami latensi bolak-balik, dan lebih dari satu grup besar file yang ditambahkan latensi.

Evan Anderson
sumber
4

Sudahkah Anda mencoba dengan sistem file yang berbeda, seperti XFS? Ini menyelesaikan semua masalah saya ketika melakukan sejumlah besar transfer blok iSCSI kecil. Tidak tahu kenapa.

Selain itu, iSCSI / NFS biasanya dikonfigurasikan untuk kerangka data yang cukup besar (bingkai jumbo dll), mungkin akan merugikan Anda jika Anda menyalin file kecil satu per satu. Mungkin tar'ing dan kemudian mentransfer akan membantu Anda.

pauska
sumber
1
Ya, tes saya menunjukkan beberapa peningkatan menggunakan XFS daripada ext3 (~ 8 menit vs ~ 14 menit).
Arie K
1
Beberapa? Aku akan mengatakan thats peningkatan yang cukup besar :)
pauska
1

Periksa apakah Anda menggunakan koneksi TCP ( mount -t nfs -o tcp host: / mount / target ). Kinerja pada sistem modern tidak akan terpengaruh, tetapi IO kecil dapat meningkat secara signifikan jika jaringan Anda dimuat.

Dan Anda juga harus mencoba beberapa sistem file lain; ext3 pada dasarnya adalah yang paling lambat. Solid, terkenal, tetapi cukup tidak cocok untuk server file. XFS jauh lebih baik, dan reiserf juga jauh lebih baik di IO kecil.

wazoox
sumber
1

Jika Anda ingin mentransfer pohon direktori besar file kecil melalui NFS, dan Anda dapat masuk ke server, cara terbaik untuk melakukannya adalah dengan membuat file tar yang secara otomatis diekstraksi pada klien, sebagai berikut:

tar c mydirectory | ssh user @ host tar -xf - -C destdir

Dengan cara itu hanya satu "file" yang ditransfer di jaringan dan Anda segera memiliki semua file Anda di host.


sumber
0

Hanya untuk menambah jawaban Evan, Anda juga memiliki semua overhead untuk membuat metadata (entri direktori, dll.) Untuk setiap file yang Anda salin.

TCampbell
sumber
0

Solusi serupa dengan jawaban Chris adalah rsync file Anda ke klien secara berkala. Jika Anda ingin membuat perubahan dua arah, Anda juga bisa menggunakan secara bersamaan.

Ztyx
sumber
0

Masalahnya adalah bahwa bagian Anda diekspor dengan syncopsi (default). Gunakan asyncuntuk mempercepat menulis jauh. Lihat nfs.sourceforge.net/nfs-howto/ar01s05.html

Aleksandr Dubinsky
sumber