Неліктен менің NVMe SSD-ге қарағанда баяу?

Неліктен менің NVMe SSD-ге қарағанда баяу?
Бұл мақалада біз енгізу-шығару ішкі жүйесінің кейбір нюанстарын және олардың өнімділікке әсерін қарастырамыз.

Бірнеше апта бұрын мен бір сервердегі NVMe неге басқа сервердегі SATA-дан баяуырақ деген сұраққа тап болдым. Мен серверлердің сипаттамаларын қарап шықтым және бұл қулық сұрақ екенін түсіндім: NVMe пайдаланушы сегментінен, ал SSD сервер сегментінен.

Әлбетте, әртүрлі ортадағы әртүрлі сегменттердің өнімдерін салыстыру дұрыс емес, бірақ бұл толық техникалық жауап емес. Біз негіздерді зерттеп, эксперимент жүргіземіз және қойылған сұраққа жауап береміз.

fsync дегеніміз не және ол қайда қолданылады

Дискілермен жұмысты жылдамдату үшін деректер буферленеді, яғни дискіге буфердің мазмұнын сақтауға ыңғайлы мүмкіндік пайда болғанша тұрақсыз жадта сақталады. Мүмкіндік критерийлері операциялық жүйе мен диск сипаттамаларымен анықталады. Қуат өшіп қалған жағдайда буфердегі барлық деректер жоғалады.

Файлдағы өзгерістер дискіге жазылғанына және аралық буферде жатпағанына сенімді болуыңыз керек бірқатар тапсырмалар бар. Бұл кепілдікті POSIX-үйлесімді fsync жүйелік шақыруын пайдалану арқылы алуға болады. fsync шақыруы буферден дискіге жазуды мәжбүр етеді.

Қысқаша 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;
}

Түсініктемелер бағдарламадағы әрекеттер тізбегін жақсы түсіндіреді. «Өмірдің, ғаламның және осының бәрінің негізгі сұрағына жауап» мәтіні операциялық жүйе арқылы буферленеді және «есептеулер» кезінде «Қалпына келтіру» түймесін басу арқылы серверді қайта іске қоссаңыз, файл бос болады. Біздің мысалда мәтінді жоғалту проблема емес, сондықтан fsync қажет емес. Деректер базалары бұл оптимизммен бөліспейді.

Деректер базалары бір уақытта көптеген файлдармен жұмыс істейтін күрделі бағдарламалар, сондықтан олар жазған деректер дискіде сақталатынына сенімді болғысы келеді, өйткені деректер қорындағы деректердің сәйкестігі осыған байланысты. Мәліметтер базалары барлық аяқталған транзакцияларды жазуға және кез келген уақытта электр қуатын өшіруге дайын болуға арналған. Бұл әрекет fsync функциясын үнемі үлкен көлемде пайдалануға міндеттейді.

Fsync функциясын жиі қолдануға не әсер етеді

Қалыпты енгізу/шығару кезінде операциялық жүйе дискілік байланысты оңтайландыруға тырысады, өйткені сыртқы дискілер жад иерархиясында ең баяу. Сондықтан операциялық жүйе дискіге бір қатынаста мүмкіндігінше көп деректерді жазуға тырысады.

fsync пайдаланудың әсерін нақты мысалмен көрсетейік. Бізде сынақ субъектілері ретінде келесі SSD дискілері бар:

  • Intel® DC SSD S4500 480 ГБ, SATA 3.2, 6 Гб/с арқылы қосылған;
  • Samsung 970 EVO Plus 500 ГБ, PCIe 3.0 x4 арқылы қосылған, ~31 Гбит/с.

Сынақтар Ubuntu 2255 жұмыс істейтін Intel® Xeon® W-20.04 құрылғысында жүргізіледі. Дискілерді тексеру үшін sysbench 1.0.18 қолданылады. Дискілерде ext4 ретінде пішімделген бір бөлім бар. Тестке дайындалу 100 ГБ файлдарды жасау болып табылады:

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

Орындалатын сынақтар:

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

Сынақ нәтижелері кестеде берілген.

сынақ
Intel® S4500
Samsung 970 EVO+

fsyncсіз оқу, МБ/с
5734.89
9028.86

fsyncсіз жазу, МиБ/с
3823.26
6019.24

fsync арқылы оқу, МиБ/с
37.76
3.27

fsync арқылы жазу, МиБ/с
25.17
2.18

Клиент сегментіндегі NVMe операциялық жүйенің өзі дискілермен қалай жұмыс істеу керектігін шешкен кезде сенімді түрде жетекшілік ететінін және fsync пайдаланылған кезде жеңілетінін байқау оңай. Бұл екі сұрақ тудырады:

  1. Неліктен оқу жылдамдығы fsyncсіз сынақтағы сілтеменің физикалық өткізу қабілетінен асып түседі?
  2. Неліктен SSD сервер сегменті fsync сұрауларының көп санын өңдеуде жақсырақ?

Бірінші сұрақтың жауабы қарапайым: sysbench нөлмен толтырылған файлдарды жасайды. Осылайша, сынақ 100 гигабайт нөлден астам орындалды. Деректер өте біркелкі және болжамды болғандықтан, әртүрлі ОЖ оңтайландырулары іске қосылады және олар орындауды айтарлықтай жылдамдатады.

Егер сіз sysbench барлық нәтижелеріне күмән келтірсеңіз, онда сіз 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

сынақ
Intel® S4500
Samsung 970 EVO+

fsyncсіз оқу, МБ/с
45.5
178

fsyncсіз жазу, МиБ/с
30.4
119

fsync арқылы оқу, МиБ/с
32.6
20.9

fsync арқылы жазу, МиБ/с
21.7
13.9

fsync пайдалану кезінде NVMe өнімділігінің төмендеуі тенденциясы анық көрінеді. Екінші сұраққа көшуге болады.

Оңтайландыру немесе блеф

Бұрын біз деректер буферде сақталады деп айттық, бірақ маңызды емес болғандықтан, қайсысында екенін көрсетпедік. Қазірдің өзінде біз операциялық жүйелердің қыр-сырын зерттемейміз және буферлердің екі жалпы түрін бөліп көрсетпейміз:

  • бағдарлама;
  • жабдық.

Бағдарламалық құрал буфері операциялық жүйедегі буферлерге, ал аппараттық буфер диск контроллерінің тұрақсыз жадына жатады. fsync жүйелік шақыруы дискіге буферінен негізгі жадқа деректерді жазу пәрменін жібереді, бірақ оның пәрменнің дұрыс орындалуын басқару мүмкіндігі жоқ.

SSD жақсырақ жұмыс істейтіндіктен, екі болжам жасауға болады:

  • диск ұқсас жоспардың жүктемесіне арналған;
  • диск «блюф» және пәрменді елемейді.

Электр қуатының үзілуімен сынақ жүргізсеңіз, дискінің адал емес әрекетін байқауға болады. Мұны сценарий арқылы тексеруге болады. diskchecker.pl, бұл болды құрылды 2005 жылда.

Бұл сценарий екі физикалық машинаны қажет етеді - «сервер» және «клиент». Клиент сыналған дискіге деректердің аз көлемін жазады, fsync шақырады және не жазылғаны туралы серверге ақпаратты жібереді.

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

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

Сценарийді іске қосқаннан кейін «клиентті» қуатсыздандыру және бірнеше минут бойы қуат бермеу керек. Тек қатты өшіруді орындамай, сынақ субъектісін электр тогынан ажырату маңызды. Біраз уақыттан кейін серверді қосуға және ОЖ-ға жүктеуге болады. Операциялық жүйені жүктегеннен кейін қайтадан бастау керек diskchecker.pl, бірақ дәлелмен тексеріңіз.

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

Тексерудің соңында сіз қателер санын көресіз. Егер олар 0 болса, диск сынақтан өтті. Диск үшін сәтті болатын жағдайлардың тіркесімін болдырмау үшін экспериментті бірнеше рет қайталауға болады.

Біздің S4500 қуат жоғалту қателерін көрсетпеді, бұл оның fsync қоңыраулары көп жүктемелерге дайын екенін білдіреді.

қорытынды

Дискілерді немесе толық дайын конфигурацияларды таңдағанда, шешуді қажет ететін тапсырмалардың ерекшеліктерін есте сақтау керек. Бір қарағанда, NVMe, яғни PCIe интерфейсі бар SSD «классикалық» SATA SSD-ге қарағанда жылдамырақ екені анық көрінеді. Алайда, біз бүгін түсінгеніміздей, нақты жағдайларда және белгілі бір тапсырмаларда бұлай болмауы мүмкін.

IaaS провайдерінен жалға алу кезінде сервер құрамдастарын қалай тексересіз?
Біз сізді түсініктемелерде күтеміз.

Неліктен менің NVMe SSD-ге қарағанда баяу?

Ақпарат көзі: www.habr.com

пікір қалдыру