Эмне үчүн менин NVMe SSDге караганда жайыраак?

Эмне үчүн менин NVMe SSDге караганда жайыраак?
Бул макалада биз I / O подсистемасынын кээ бир нюанстарын жана алардын өндүрүмдүүлүккө тийгизген таасирин карап чыгабыз.

Бир нече жума мурун мен бир сервердеги NVMe эмне үчүн башка сервердеги SATAга караганда жайыраак деген суроого туш болдум. Мен серверлердин мүнөздөмөлөрүн карап чыктым жана бул алдамчылык суроо экенин түшүндүм: NVMe колдонуучу сегментинен, ал эми SSD сервер сегментинен.

Албетте, ар кандай чөйрөдө ар кандай сегменттердеги өнүмдөрдү салыштыруу туура эмес, бирок бул толук техникалык жооп эмес. Биз негиздерин изилдеп, эксперименттерди жүргүзүп, берилген суроого жооп беребиз.

fsync деген эмне жана ал кайда колдонулат

Дисктер менен иштөөнү тездетүү үчүн маалыматтар буферделет, башкача айтканда, буфердин мазмунун дискке сактоо үчүн ыңгайлуу мүмкүнчүлүк пайда болгонго чейин туруксуз эстутумда сакталат. Мүмкүнчүлүк критерийлери операциялык тутум жана дисктин мүнөздөмөлөрү менен аныкталат. Электр энергиясы өчүрүлгөн учурда буфердеги бардык маалыматтар жоголот.

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

Кыскача С программасы түрүндө жасалма мисал менен буферлердин эффектисин көрсөтөлү.

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

Комментарийлер программадагы аракеттердин ырааттуулугун жакшы түшүндүрөт. "Жашоонун, ааламдын жана ошонун бардыгынын негизги суроосуна жооп" тексти операциялык тутум тарабынан буферде сакталат жана "эсептөөлөр" учурунда "Reset" баскычын басуу менен серверди өчүрүп күйгүзсөңүз, файл бош болот. Биздин мисалда текстти жоготуу көйгөй эмес, андыктан 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>

Сценарийди иштеткенден кийин, "кардардын" энергиясын өчүрүү жана бир нече мүнөткө электр энергиясын кайтарбоо керек. Бул жөн гана катуу өчүрүү жүзөгө ашыруу эмес, электр сынагынын субъектти өчүрүү үчүн маанилүү болуп саналат. Бир нече убакыт өткөндөн кийин, сервер туташып, ОСке жүктөлүшү мүмкүн. OS жүктөлгөндөн кийин, кайра баштоо керек diskchecker.pl, бирок аргумент менен текшерүү.

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

Текшерүүнүн аягында сиз каталардын санын көрөсүз. Эгерде алар 0 болсо, анда диск сыноодон өткөн. Диск үчүн ийгиликтүү болгон жагдайлардын айкалышын жокко чыгаруу үчүн, эксперимент бир нече жолу кайталанышы мүмкүн.

Биздин S4500 кубаттуулукту жоготууда каталарды көрсөткөн жок, демек, ал fsync чалуулары көп жүктөөгө даяр.

жыйынтыктоо

Дисктерди же бүтүндөй даяр конфигурацияларды тандап жатканда, сиз чечилиши керек болгон милдеттердин өзгөчөлүктөрүн эстен чыгарбашыңыз керек. Бир караганда, NVMe, башкача айтканда, PCIe интерфейси бар SSD "классикалык" SATA SSDге караганда ылдамыраак экени көрүнүп турат. Бирок, биз бүгүн түшүнгөндөй, конкреттүү шарттарда жана белгилүү бир милдеттерде андай болушу мүмкүн эмес.

IaaS провайдеринен ижарага алууда сервер компоненттерин кантип сынайсыз?
Сизди комментарийлерде күтөбүз.

Эмне үчүн менин NVMe SSDге караганда жайыраак?

Source: www.habr.com

Комментарий кошуу