Яагаад миний 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;
}

Сэтгэгдэл нь програм дахь үйлдлүүдийн дарааллыг сайн тайлбарладаг. "Амьдрал, Орчлон ертөнц ба бусад бүх асуултын хариулт" гэсэн бичвэр нь үйлдлийн системээр буферт хадгалагдах бөгөөд хэрэв та "тооцоолол" хийх явцад Дахин тохируулах товчийг дарж серверийг дахин эхлүүлбэл файл хоосон болно. Бидний жишээн дээр текст алдагдах нь асуудал биш тул fsync шаардлагагүй. Мэдээллийн сангууд энэ өөдрөг үзлийг хуваалцдаггүй.

Өгөгдлийн сан нь олон файлтай нэгэн зэрэг ажилладаг нарийн төвөгтэй програмууд тул өгөгдлийн сангийн доторх өгөгдлийн тууштай байдал үүнээс хамаардаг тул бичсэн өгөгдөл нь хөтөч дээр хадгалагдах болно гэдэгт итгэлтэй байхыг хүсдэг. Мэдээллийн сан нь бүх дууссан гүйлгээг бүртгэж, ямар ч үед эрчим хүчээ алдахад бэлэн байх зориулалттай. Энэ үйлдэл нь fsync-ийг байнга их хэмжээгээр ашиглахыг шаарддаг.

fsync-ийг байнга хэрэглэх нь ямар үр дагавартай вэ?

Ердийн I/O үед үйлдлийн систем нь санах ойн шатлалын хамгийн удаан нь гадаад хөтчүүд байдаг тул дискүүдтэй харилцах харилцааг оновчтой болгохыг оролддог. Тиймээс үйлдлийн систем нь драйв руу нэг хандалт хийхдээ аль болох их мэдээлэл бичихийг оролддог.

Тодорхой жишээн дээр fsync ашиглах үр нөлөөг харуулъя. Бидэнд дараах SSD-уудыг туршилтын хөтөч болгон ашиглаж байна.

  • Intel® DC SSD S4500 480 ГБ, SATA 3.2, 6 Гбит/с-ээр холбогдсон;
  • Samsung 970 EVO Plus 500GB, PCIe 3.0 x4, ~31 Gbit/s-ээр холбогдсон.

Туршилтыг 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, MiB/s ашиглан унших
37.76
3.27

fsync, MiB/s ашиглан бичлэг хийх
25.17
2.18

Үйлдлийн систем өөрөө дисктэй хэрхэн ажиллахаа шийдэх үед үйлчлүүлэгчийн сегментийн NVMe итгэлтэйгээр тэргүүлж, fsync ашиглах үед алддаг болохыг харахад хялбар байдаг. Эндээс хоёр асуулт гарч ирнэ:

  1. Fsync-гүй туршилтын унших хурд яагаад сувгийн физик зурвасын өргөнөөс давж байна вэ?
  2. Яагаад олон тооны fsync хүсэлтийг серверийн сегментийн SSD илүү сайн зохицуулдаг вэ?

Эхний асуултын хариулт нь энгийн: 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, MiB/s ашиглан унших
32.6
20.9

fsync, MiB/s ашиглан бичлэг хийх
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

сэтгэгдэл нэмэх