Чаро NVMe-и ман аз SSD-и ман сусттар аст?

Чаро NVMe-и ман аз SSD-и ман сусттар аст?
Дар ин мақола мо баъзе нозукиҳои зерсистемаи I/O ва таъсири онҳоро ба иҷроиш дида мебароем.

Якчанд ҳафта пеш ман бо саволе рӯбарӯ шудам, ки чаро NVMe дар як сервер нисбат ба SATA дар сервери дигар сусттар буд. Ман ба мушаххасоти сервер нигоҳ кардам ва фаҳмидам, ки ин саволи душвор аст: NVMe аз сегменти корбар ва SSD аз сегменти сервер буд.

Аён аст, ки муқоиса кардани маҳсулот аз сегментҳои гуногун дар муҳитҳои гуногун одилона нест, аммо ин ҷавоби пурраи техникӣ нест. Биёед асосҳоро омӯзем, таҷрибаҳо гузаронем ва ба саволи додашуда ҷавоб диҳем.

fsync чист ва он дар куҷо истифода мешавад?

Барои суръат бахшидан ба кор бо дискҳо маълумот буфер карда мешавад, яъне дар хотираи идоранашаванда нигоҳ дошта мешавад, то он даме, ки имконияти мусоид барои захира кардани мундариҷаи буфер ба диск пайдо шавад. Меъёрҳои "имконият" аз ҷониби системаи амалиётӣ ва хусусиятҳои диск муайян карда мешаванд. Дар сурати қатъи нерӯи барқ, ҳама маълумот дар буфер гум мешаванд.

Якчанд вазифаҳо мавҷуданд, ки дар онҳо шумо бояд боварӣ ҳосил кунед, ки тағирот дар файл ба диск навишта мешавад, на дар буфери фосилавӣ. Ин кафолатро тавассути истифодаи занги системаи fsync ба POSIX мувофиқ ба даст овардан мумкин аст. Даъват ба 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;
}

Шарҳҳо пайдарпайии амалҳоро дар барнома хуб шарҳ медиҳанд. Матни "ҷавоб ба саволи асосии ҳаёт, коинот ва ҳама чизҳо" аз ҷониби системаи оператсионӣ буфер карда мешавад ва агар шумо серверро бо пахш кардани тугмаи Reset ҳангоми "ҳисобҳо" бозоғоз намоед, файл холӣ хоҳад буд. Дар мисоли мо, талафоти матн мушкилот нест, аз ин рӯ fsync лозим нест. Пойгоҳи додаҳо ин оптимизмро мубодила намекунанд.

Пойгоҳи додаҳо барномаҳои мураккабе мебошанд, ки дар як вақт бо бисёр файлҳо кор мекунанд, бинобар ин онҳо мехоҳанд боварӣ ҳосил кунанд, ки маълумоти навиштаашон дар диск захира карда мешавад, зеро мувофиқати маълумот дар дохили база аз ин вобаста аст. Пойгоҳи додаҳо барои сабти ҳама транзаксияҳои анҷомдодашуда тарҳрезӣ шудаанд ва барои аз даст додани қувваи барқ ​​​​дар вақти дилхоҳ омодаанд. Ин рафтор истифодаи доимии fsync-ро ба миқдори зиёд талаб мекунад.

Истифодаи зуд-зуд fsync чӣ таъсир дорад?

Дар ҷараёни вуруди муқаррарӣ, системаи амалиётӣ кӯшиш мекунад, ки алоқаро бо дискҳо оптимизатсия кунад, зеро дискҳои беруна дар иерархияи хотира сусттарин мебошанд. Аз ин рӯ, системаи оператсионӣ кӯшиш мекунад, ки дар як дастрасӣ ба диск ҳарчи бештар маълумот нависад.

Биёед таъсири истифодаи fsync-ро бо мисоли мушаххас нишон диҳем. Мо SSD-ҳои зеринро ҳамчун дискҳои санҷишӣ дорем:

  • Intel® DC SSD S4500 480 ГБ, пайваст тавассути SATA 3.2, 6 Гбит/с;
  • Samsung 970 EVO Plus 500GB, ки тавассути PCIe 3.0 x4, ~31 Гбит/с пайваст шудааст.

Санҷишҳо дар Intel® Xeon® W-2255 бо Ubuntu 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, MiB/s
5734.89
9028.86

Сабт бидуни fsync, МиБ/с
3823.26
6019.24

Хондан бо fsync, MiB/s
37.76
3.27

Сабт бо fsync, MiB/s
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, MiB/s
45.5
178

Сабт бидуни fsync, МиБ/с
30.4
119

Хондан бо fsync, MiB/s
32.6
20.9

Сабт бо fsync, MiB/s
21.7
13.9

Тамоюли паст шудани иҷрои NVMe ҳангоми истифодаи fsync ба таври равшан намоён аст. Шумо метавонед ба ҷавоби саволи дуюм гузаред.

Оптимизатсия ё блеф

Қаблан мо гуфта будем, ки маълумот дар буфер нигоҳ дошта мешавад, аммо кадомашро мушаххас накардаем, зеро ин муҳим набуд. Ҳатто ҳоло мо ба нозукиҳои системаҳои оператсионӣ намефаҳмем ва ду намуди умумии буферҳоро таъкид хоҳем кард:

  • барнома;
  • сахтафзор.

Буфери нармафзор ба буферҳое, ки дар системаи оператсионӣ мавҷуданд, ва буфери сахтафзор ба хотираи идоракунандаи диск дахл дорад. Даъвати системаи 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, яъне SSD бо интерфейси PCIe нисбат ба SATA SSD-и "классикӣ" тезтар аст. Аммо, чунон ки имруз мо фахмидем, дар шароити мушаххас ва бо вазифаҳои муайян ин тавр набошад.

Ҳангоми иҷора аз провайдери IaaS шумо ҷузъҳои серверро чӣ гуна месанҷед?
Мо шуморо дар шарҳҳо интизорем.

Чаро NVMe-и ман аз SSD-и ман сусттар аст?

Манбаъ: will.com

Илова Эзоҳ