Mengapa NVMe saya lebih perlahan daripada SSD?

Mengapa NVMe saya lebih perlahan daripada SSD?
Dalam artikel ini kita akan melihat beberapa nuansa subsistem I/O dan kesannya terhadap prestasi.

Beberapa minggu yang lalu saya berhadapan dengan persoalan mengapa NVMe pada satu pelayan lebih perlahan daripada SATA pada yang lain. Saya melihat spesifikasi pelayan dan menyedari bahawa ini adalah soalan rumit: NVMe adalah dari segmen pengguna, dan SSD adalah dari segmen pelayan.

Jelas sekali, adalah tidak adil untuk membandingkan produk daripada segmen berbeza dalam persekitaran yang berbeza, tetapi ini bukan jawapan teknikal yang lengkap. Mari belajar asas, menjalankan eksperimen dan memberi jawapan kepada soalan yang dikemukakan.

Apakah fsync dan di mana ia digunakan?

Untuk mempercepatkan kerja dengan pemacu, data ditimbal, iaitu, disimpan dalam memori yang tidak menentu sehingga peluang yang mudah muncul untuk menyimpan kandungan penimbal ke pemacu. Kriteria untuk "peluang" ditentukan oleh sistem pengendalian dan ciri pemacu. Sekiranya berlaku kegagalan kuasa, semua data dalam penimbal akan hilang.

Terdapat beberapa tugas di mana anda perlu memastikan bahawa perubahan pada fail ditulis pada pemacu dan bukan dalam penimbal perantaraan. Jaminan ini boleh diperoleh dengan menggunakan panggilan sistem fsync yang mematuhi POSIX. Memanggil fsync memaksa menulis daripada penimbal ke pemacu.

Mari kita tunjukkan kesan penimbal dengan contoh tiruan dalam bentuk program pendek dalam C.

#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(void) {
    /* Открываем файл answer.txt на запись, если его нет -- создаём */
    int fd = open("answer.txt", O_WRONLY | O_CREAT);
    /* Записываем первый набор данных */
    write(fd, "Answer to the Ultimate Question of Life, The Universe, and Everything: ", 71);
    /* Делаем вид, что проводим вычисления в течение 10 секунд */
    sleep(10);
    /* Записываем результат вычислений */
    write(fd, "42n", 3); 

    return 0;
}

Komen menerangkan dengan baik urutan tindakan dalam program. Teks "jawapan kepada persoalan utama kehidupan, Alam Semesta dan semua itu" akan ditimbal oleh sistem pengendalian, dan jika anda memulakan semula pelayan dengan menekan butang Reset semasa "pengiraan", fail akan kosong. Dalam contoh kami, kehilangan teks bukan masalah, jadi fsync tidak diperlukan. Pangkalan data tidak berkongsi keyakinan ini.

Pangkalan data ialah program kompleks yang berfungsi secara serentak dengan banyak fail, jadi mereka ingin memastikan bahawa data yang mereka tulis akan disimpan pada pemacu, kerana konsistensi data di dalam pangkalan data bergantung pada ini. Pangkalan data direka untuk merekodkan semua transaksi yang telah selesai dan bersedia untuk kehilangan kuasa pada bila-bila masa. Tingkah laku ini memerlukan penggunaan fsync secara berterusan dalam kuantiti yang banyak.

Apakah kesan penggunaan fsync yang kerap?

Semasa I/O biasa, sistem pengendalian cuba mengoptimumkan komunikasi dengan cakera, kerana pemacu luaran adalah yang paling perlahan dalam hierarki memori. Oleh itu, sistem pengendalian cuba menulis data sebanyak mungkin dalam satu akses kepada pemacu.

Mari tunjukkan kesan penggunaan fsync dengan contoh khusus. Kami mempunyai SSD berikut sebagai pemacu ujian:

  • Intel® DC SSD S4500 480 GB, disambungkan melalui SATA 3.2, 6 Gbit/s;
  • Samsung 970 EVO Plus 500GB, disambungkan melalui PCIe 3.0 x4, ~31 Gbit/s.

Ujian dijalankan pada Intel® Xeon® W-2255 yang menjalankan Ubuntu 20.04. Sysbench 1.0.18 digunakan untuk menguji cakera. Satu partition telah dibuat pada cakera, diformat sebagai ext4. Persediaan untuk ujian melibatkan mencipta fail 100 GB:

sysbench --test=fileio --file-total-size=100G prepare

Menjalankan ujian:

# Без fsync
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=0 run

# С fsync после каждой записи
sysbench --num-threads=16 --test=fileio --file-test-mode=rndrw --file-fsync-freq=1 run

Keputusan ujian dibentangkan dalam jadual.

Ujian
Intel® S4500
Samsung 970 EVO+

Membaca tanpa fsync, MiB/s
5734.89
9028.86

Rakaman tanpa fsync, MiB/s
3823.26
6019.24

Membaca dengan fsync, MiB/s
37.76
3.27

Rakaman dengan fsync, MiB/s
25.17
2.18

Adalah mudah untuk melihat bahawa NVMe daripada segmen pelanggan yakin mendahului apabila sistem pengendalian itu sendiri memutuskan cara untuk bekerja dengan cakera, dan hilang apabila fsync digunakan. Ini menimbulkan dua persoalan:

  1. Mengapakah kelajuan baca dalam ujian tanpa fsync melebihi lebar jalur fizikal saluran?
  2. Mengapakah SSD segmen pelayan lebih baik dalam mengendalikan sejumlah besar permintaan fsync?

Jawapan kepada soalan pertama adalah mudah: sysbench menjana fail yang diisi dengan sifar. Oleh itu, ujian telah dijalankan lebih 100 gigabait sifar. Memandangkan data adalah sangat seragam dan boleh diramal, pelbagai pengoptimuman OS mula dimainkan dan mempercepatkan pelaksanaan dengan ketara.

Jika anda mempersoalkan semua hasil sysbench, anda boleh menggunakan fio.

# Без fsync
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=0 --filename=/dev/sdb

# С fsync после каждой записи
fio --name=test1 --blocksize=16k --rw=randrw --iodepth=16 --runtime=60 --rwmixread=60 --fsync=1 --filename=/dev/sdb

Ujian
Intel® S4500
Samsung 970 EVO+

Membaca tanpa fsync, MiB/s
45.5
178

Rakaman tanpa fsync, MiB/s
30.4
119

Membaca dengan fsync, MiB/s
32.6
20.9

Rakaman dengan fsync, MiB/s
21.7
13.9

Kecenderungan prestasi NVMe merosot apabila menggunakan fsync dapat dilihat dengan jelas. Anda boleh meneruskan untuk menjawab soalan kedua.

Pengoptimuman atau gertakan

Sebelum ini, kami mengatakan bahawa data disimpan dalam penimbal, tetapi kami tidak menyatakan yang mana satu, kerana ini tidak penting. Malah sekarang kami tidak akan menyelidiki selok-belok sistem pengendalian dan akan menyerlahkan dua jenis penimbal umum:

  • program;
  • perkakasan.

Penampan perisian merujuk kepada penimbal yang wujud dalam sistem pengendalian, dan penimbal perkakasan merujuk kepada memori yang tidak menentu pengawal cakera. Panggilan sistem fsync menghantar arahan kepada pemacu untuk menulis data daripada penimbalnya ke storan utama, tetapi tidak mempunyai cara untuk mengesahkan bahawa arahan itu dilaksanakan dengan betul.

Memandangkan SSD menunjukkan hasil terbaik, dua andaian boleh dibuat:

  • cakera direka untuk beban yang sama;
  • cakera "membutakan" dan mengabaikan arahan.

Tingkah laku tidak jujur ​​pemacu boleh diperhatikan jika anda menjalankan ujian kehilangan kuasa. Anda boleh menyemak ini dengan skrip diskchecker.pl, Itu adalah ditubuhkan dalam tahun 2005.

Skrip ini memerlukan dua mesin fizikal - "pelayan" dan "pelanggan". Pelanggan menulis sejumlah kecil data ke cakera yang sedang diuji, memanggil fsync, dan menghantar maklumat kepada pelayan tentang perkara yang ditulis.

# Запускается на сервере
./diskchecker.pl -l [port]

# Запускается на клиенте
./diskchecker.pl -s <server[:port]> create <file> <size_in_MB>

Selepas menjalankan skrip, anda mesti mematikan kuasa kepada "pelanggan" dan jangan mengembalikan kuasa selama beberapa minit. Adalah penting untuk memutuskan sambungan orang yang sedang diuji daripada elektrik, dan bukan hanya melakukan penutupan keras. Selepas beberapa lama, pelayan boleh disambungkan dan dimuatkan ke dalam OS. Selepas memuatkan OS anda perlu memulakannya semula diskchecker.pl, tetapi dengan hujah mengesahkan.

./diskchecker.pl -s <server[:port]> verify <file>

Pada akhir semakan anda akan melihat bilangan ralat. Jika terdapat 0, maka cakera telah lulus ujian. Untuk mengecualikan kebetulan bertuah untuk cakera, percubaan boleh diulang beberapa kali.

S4500 kami tidak menunjukkan ralat apabila kuasa terputus, bermakna ia sedia untuk beban kerja dengan banyak panggilan fsync.

Kesimpulan

Apabila memilih cakera atau keseluruhan konfigurasi siap sedia, anda harus ingat spesifik masalah yang perlu diselesaikan. Pada pandangan pertama, nampaknya jelas bahawa NVMe, iaitu SSD dengan antara muka PCIe, adalah lebih pantas daripada SSD SATA "klasik". Walau bagaimanapun, seperti yang telah kita pelajari hari ini, dalam keadaan tertentu dan dengan tugas tertentu ini mungkin tidak berlaku.

Bagaimanakah anda menguji komponen pelayan apabila menyewa daripada pembekal IaaS?
Kami sedang menunggu anda dalam komen.

Mengapa NVMe saya lebih perlahan daripada SSD?

Sumber: www.habr.com

Tambah komen