Nima uchun mening NVMe SSD dan sekinroq?

Nima uchun mening NVMe SSD dan sekinroq?
Ushbu maqolada biz I/U quyi tizimining ba'zi nuanslarini va ularning ishlashga ta'sirini ko'rib chiqamiz.

Bir necha hafta oldin men nima uchun bir serverda NVMe boshqa serverdagi SATA-dan sekinroq degan savolga duch keldim. Men server xususiyatlariga qaradim va bu qiyin savol ekanligini angladim: NVMe foydalanuvchi segmentidan, SSD esa server segmentidan edi.

Shubhasiz, turli xil segmentlardagi mahsulotlarni turli muhitlarda solishtirish adolatdan emas, lekin bu to'liq texnik javob emas. Keling, asoslarni o'rganamiz, tajribalar o'tkazamiz va berilgan savolga javob beramiz.

Fsync nima va u qayerda ishlatiladi?

Drayvlar bilan ishlashni tezlashtirish uchun ma'lumotlar buferlanadi, ya'ni bufer tarkibini haydovchiga saqlash uchun qulay imkoniyat paydo bo'lguncha o'zgaruvchan xotirada saqlanadi. "Imkoniyat" mezonlari operatsion tizim va haydovchining xususiyatlari bilan belgilanadi. Elektr uzilib qolgan taqdirda, buferdagi barcha ma'lumotlar yo'qoladi.

Bir qator vazifalar mavjud bo'lib, ularda faylga kiritilgan o'zgarishlar oraliq buferda emas, balki haydovchiga yozilganligiga ishonch hosil qilishingiz kerak. Ushbu kafolatni POSIX-mos keladigan fsync tizimi chaqiruvi yordamida olish mumkin. Fsync chaqiruvi buferdan diskka yozishni majbur qiladi.

Buferlarning taʼsirini C tilidagi qisqa dastur koʻrinishidagi sunʼiy misol bilan koʻrsatamiz.

#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;
}

Sharhlar dasturdagi harakatlar ketma-ketligini yaxshi tushuntiradi. "Hayot, koinot va bularning barchasi haqidagi asosiy savolga javob" matni operatsion tizim tomonidan buferlanadi va agar siz "hisoblash" paytida "Qayta tiklash" tugmasini bosib serverni qayta ishga tushirsangiz, fayl bo'sh bo'ladi. Bizning misolimizda matnni yo'qotish muammo emas, shuning uchun fsync kerak emas. Ma'lumotlar bazalari bu optimizmni baham ko'rmaydi.

Ma'lumotlar bazalari bir vaqtning o'zida ko'plab fayllar bilan ishlaydigan murakkab dasturlardir, shuning uchun ular yozgan ma'lumotlar diskda saqlanishiga ishonch hosil qilishni xohlashadi, chunki ma'lumotlar bazasi ichidagi ma'lumotlarning izchilligi bunga bog'liq. Ma'lumotlar bazalari barcha tugallangan tranzaktsiyalarni yozib olish va istalgan vaqtda quvvatni yo'qotishga tayyor bo'lish uchun mo'ljallangan. Ushbu xatti-harakatlar fsync dan doimiy ravishda katta miqdorda foydalanishni talab qiladi.

Fsync-dan tez-tez foydalanish qanday ta'sir qiladi?

Oddiy kiritish-chiqarish paytida operatsion tizim disklar bilan aloqani optimallashtirishga harakat qiladi, chunki tashqi disklar xotira ierarxiyasida eng sekindir. Shuning uchun, operatsion tizim haydovchiga bir marta kirishda imkon qadar ko'proq ma'lumot yozishga harakat qiladi.

Keling, fsync-dan foydalanishning ta'sirini aniq misol bilan ko'rsatamiz. Bizda sinov drayvlari sifatida quyidagi SSD disklari mavjud:

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

Sinovlar Ubuntu 2255 operatsion tizimida ishlaydigan Intel® Xeon® W-20.04 qurilmasida o'tkaziladi. Sysbench 1.0.18 disklarni sinash uchun ishlatiladi. Disklarda ext4 sifatida formatlangan bitta bo'lim yaratilgan. Sinovga tayyorgarlik 100 GB hajmli fayllarni yaratishni o'z ichiga oladi:

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

Ishlayotgan testlar:

# Без 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

Sinov natijalari jadvalda keltirilgan.

sinov
Intel® S4500
Samsung 970 EVO+

Fsync holda o'qish, MiB/s
5734.89
9028.86

Fsyncsiz yozish, MiB/s
3823.26
6019.24

fsync bilan o'qish, MiB/s
37.76
3.27

fsync bilan yozish, MiB/s
25.17
2.18

Operatsion tizimning o'zi disklar bilan ishlashni o'zi hal qilganda mijoz segmentidagi NVMe ishonchli tarzda etakchi bo'lishini va fsync ishlatilganda yo'qotilishini ko'rish oson. Bu ikkita savol tug'diradi:

  1. Nima uchun fsyncsiz testda o'qish tezligi kanalning jismoniy o'tkazish qobiliyatidan oshadi?
  2. Nima uchun SSD server segmenti ko'p sonli fsync so'rovlarini boshqarishda yaxshiroq?

Birinchi savolga javob oddiy: sysbench nol bilan to'ldirilgan fayllarni yaratadi. Shunday qilib, sinov 100 gigabaytdan ortiq noldan o'tkazildi. Ma'lumotlar juda bir xil va bashorat qilinadigan bo'lgani uchun, turli xil OS optimallashtirishlari o'ynaydi va bajarilishini sezilarli darajada tezlashtiradi.

Agar siz barcha sysbench natijalarini so'rasangiz, fio dan foydalanishingiz mumkin.

# Без 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

sinov
Intel® S4500
Samsung 970 EVO+

Fsync holda o'qish, MiB/s
45.5
178

Fsyncsiz yozish, MiB/s
30.4
119

fsync bilan o'qish, MiB/s
32.6
20.9

fsync bilan yozish, MiB/s
21.7
13.9

fsync dan foydalanganda NVMe ishlashining pasayishi tendentsiyasi aniq ko'rinadi. Ikkinchi savolga javob berishga o'tishingiz mumkin.

Optimallashtirish yoki blöf

Ilgari biz ma'lumotlar buferda saqlanishini aytdik, ammo qaysi biri muhim emasligini aniqlamadik. Hozir ham biz operatsion tizimlarning nozik tomonlarini o'rganmaymiz va buferlarning ikkita umumiy turini ajratib ko'rsatamiz:

  • dastur;
  • apparat.

Dasturiy ta'minot buferi operatsion tizimda mavjud bo'lgan buferlarga, apparat buferi esa disk boshqaruvchisining o'zgaruvchan xotirasiga ishora qiladi. fsync tizimi chaqiruvi drayverga buferdan asosiy xotiraga ma'lumotlarni yozish uchun buyruq yuboradi, lekin buyruq to'g'ri bajarilganligini tekshirishning hech qanday usuli yo'q.

SSD eng yaxshi natijalarni ko'rsatganligi sababli, ikkita taxmin qilish mumkin:

  • disk shunga o'xshash yuk uchun mo'ljallangan;
  • disk "blöf" qiladi va buyruqni e'tiborsiz qoldiradi.

Agar siz quvvatni yo'qotish sinovini o'tkazsangiz, haydovchining nohaq xatti-harakati sezilishi mumkin. Buni skript yordamida tekshirishingiz mumkin diskchecker.pledi yaratilgan 2005 yili.

Ushbu skript ikkita jismoniy mashinani talab qiladi - "server" va "mijoz". Mijoz sinovdan o'tayotgan diskka kichik hajmdagi ma'lumotlarni yozadi, fsync ga qo'ng'iroq qiladi va nima yozilganligi haqida serverga ma'lumot yuboradi.

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

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

Skriptni ishga tushirgandan so'ng, siz "mijoz" ga quvvatni o'chirishingiz kerak va quvvatni bir necha daqiqaga qaytarmang. Sinovdan o'tgan odamni elektrdan uzib qo'yish muhim, va faqat qattiq o'chirishni amalga oshirish emas. Biroz vaqt o'tgach, server ulanishi va OTga yuklanishi mumkin. OSni yuklaganingizdan so'ng uni qayta ishga tushirishingiz kerak diskchecker.pl, lekin argument bilan Tekshiring.

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

Tekshirish oxirida siz xatolar sonini ko'rasiz. Agar 0 bo'lsa, disk sinovdan o'tgan. Disk uchun omadli tasodifni istisno qilish uchun tajriba bir necha marta takrorlanishi mumkin.

Bizning S4500 quvvati uzilganda xatolik ko‘rsatmadi, ya’ni u fsync qo‘ng‘iroqlari ko‘p bo‘lgan ish yuklariga tayyor.

xulosa

Disklarni yoki to'liq tayyor konfiguratsiyalarni tanlashda siz hal qilinishi kerak bo'lgan muammolarning o'ziga xos xususiyatlarini eslab qolishingiz kerak. Bir qarashda, NVMe, ya'ni PCIe interfeysiga ega SSD "klassik" SATA SSD-dan tezroq ekanligi aniq ko'rinadi. Biroq, biz bugun bilib olganimizdek, muayyan sharoitlarda va muayyan vazifalarda bunday bo'lmasligi mumkin.

IaaS provayderidan ijaraga olayotganda server komponentlarini qanday sinab ko'rasiz?
Sizni izohlarda kutamiz.

Nima uchun mening NVMe SSD dan sekinroq?

Manba: www.habr.com

a Izoh qo'shish