Дотроо байдлаар
Нэгэн өдөр би ойрын ирээдүйд эхлүүлэхээр төлөвлөж байсан Алвинтай удаан хугацаагаар саатсаны улмаас сэтгэл дундуур байсан имэйлээр сэрлээ. Тодруулбал, үйлчлүүлэгч 99 мс-ийн бүсэд 50 дэх хувийн хоцролтыг мэдэрсэн нь бидний хоцрогдлын төсвөөс хамаагүй өндөр байна. Би энэ үйлчилгээг өргөнөөр туршиж үзсэнийхээ дараа, ялангуяа нийтлэг гомдол байдаг хоцрогдолтой үед энэ нь үнэхээр гайхширсан.
Би Алвиныг туршилтанд оруулахаасаа өмнө секундэд 40 мянган асуулт (QPS) бүхий олон туршилт хийсэн бөгөөд бүгд 10 мс-ээс бага хоцролтыг харуулсан. Би тэдний дүгнэлттэй санал нийлэхгүй байгаагаа мэдэгдэхэд бэлэн байсан. Гэхдээ захидлыг дахин харахад би нэг шинэ зүйлийг анзаарав: Би тэдний дурдсан нөхцөлүүдийг яг таг туршиж үзээгүй, тэдний QPS нь минийхээс хамаагүй доогуур байсан. Би 40k QPS дээр туршиж үзсэн, гэхдээ тэд зөвхөн 1k дээр. Би тэднийг тайвшруулахын тулд өөр нэг туршилтыг энэ удаад бага QPS-тэй хийсэн.
Би энэ тухай блог хөтөлж байгаа болохоор тэдний тоо зөв байсныг та аль хэдийн ойлгосон байх. Би виртуал үйлчлүүлэгчээ дахин дахин туршиж үзсэн бөгөөд ижил үр дүнд хүрсэн: цөөн тооны хүсэлт нь хоцролтыг нэмэгдүүлээд зогсохгүй 10 мс-ээс дээш хоцролттой хүсэлтийн тоог нэмэгдүүлдэг. Өөрөөр хэлбэл, 40k QPS-д секундэд 50 орчим хүсэлт 50 мс-ээс хэтэрсэн бол 1k QPS-д секунд тутамд 100 мс-ээс дээш 50 хүсэлт ирдэг байсан. Парадокс!
Хайлтыг нарийсгаж байна
Олон бүрэлдэхүүн хэсэгтэй тархсан системд хоцрогдлын асуудал тулгарвал эхний алхам бол сэжигтнүүдийн товч жагсаалтыг гаргах явдал юм. Алвины архитектурыг бага зэрэг гүнзгийрүүлье:
Сайн эхлэлийн цэг бол оролт гаралтын дууссан шилжилтийн жагсаалт юм (сүлжээний дуудлага/диск хайх гэх мэт). Саатал хаана байгааг олж мэдэхийг хичээцгээе. Үйлчлүүлэгчтэй тодорхой I/O хийхээс гадна Элвин нэмэлт алхам хийдэг: тэр мэдээллийн сан руу ордог. Гэсэн хэдий ч энэ хадгалалт нь Alvin-тэй ижил кластерт ажилладаг тул хоцролт нь үйлчлүүлэгчтэй харьцуулахад бага байх ёстой. Тиймээс сэжигтний жагсаалт:
- Үйлчлүүлэгчээс Алвин руу сүлжээний дуудлага.
- Алвинаас мэдээллийн сан руу сүлжээний дуудлага.
- Мэдээллийн сангаас дискнээс хай.
- Мэдээллийн агуулахаас Алвин руу сүлжээний дуудлага.
- Алвинаас үйлчлүүлэгч рүү сүлжээний дуудлага.
Зарим зүйлийг хасахыг хичээцгээе.
Мэдээлэл хадгалах нь үүнтэй ямар ч холбоогүй юм
Миний хийсэн хамгийн эхний зүйл бол Алвиныг хүсэлтийг боловсруулдаггүй ping-ping сервер болгон хөрвүүлэх явдал байв. Хүсэлтийг хүлээн авах үед энэ нь хоосон хариулт өгдөг. Хэрэв саатал багасвал Alvin эсвэл өгөгдлийн агуулахын хэрэгжилтэд алдаа гарах нь сонсогдоогүй зүйл биш юм. Эхний туршилтаар бид дараах графикийг олж авна.
Таны харж байгаагаар ping-ping серверийг ашиглахад сайжруулалт байхгүй байна. Энэ нь өгөгдлийн агуулах нь хоцролтыг нэмэгдүүлэхгүй бөгөөд сэжигтнүүдийн жагсаалтыг хоёр дахин багасгасан гэсэн үг юм.
- Үйлчлүүлэгчээс Алвин руу сүлжээний дуудлага.
- Алвинаас үйлчлүүлэгч рүү сүлжээний дуудлага.
Агуу их! Жагсаалт хурдан буурч байна. Би учрыг нь бараг олсон гэж бодсон.
gRPC
Одоо таныг шинэ тоглогчтой танилцуулах цаг болжээ. gRPC
сайн оновчлогдсон бөгөөд өргөн хэрэглэгддэг, энэ бол би үүнийг ийм хэмжээний систем дээр анх удаа ашиглаж байсан бөгөөд миний хэрэгжилтийг хамгийн багадаа оновчтой гэж бодож байсан.
тушаал gRPC
стек дэх шинэ асуулт гарч ирэв: магадгүй энэ нь миний хэрэгжүүлэлт эсвэл би юм gRPC
саатлын асуудал үүсгэж байна уу? Жагсаалтад шинэ сэжигтнийг нэмж оруулах:
- Үйлчлүүлэгч номын сан руу залгадаг
gRPC
- номын сан
gRPC
үйлчлүүлэгч дээрх номын сан руу сүлжээний дуудлага хийдэгgRPC
сервер дээр - номын сан
gRPC
холбоо барих Алвин (пинг теннисний серверт ажиллахгүй)
Код нь ямар харагддаг талаар танд ойлголт өгөхийн тулд миний үйлчлүүлэгч/Алвины хэрэгжилт нь үйлчлүүлэгч-серверийнхээс тийм ч их ялгаатай биш юм.
Тэмдэглэл: Дээрх жагсаалтыг бага зэрэг хялбарчилсан учраас
gRPC
Гүйцэтгэлийн стек нь хоорондоо холбогдсон өөрийн (загвар?) урсгалтай загварыг ашиглах боломжтой болгодог.gRPC
болон хэрэглэгчийн хэрэгжилт. Энгийн байхын тулд бид энэ загварыг баримтлах болно.
Профайл хийх нь бүх зүйлийг засах болно
Мэдээллийн сангуудыг зураад би бараг дууслаа гэж бодсон: "Одоо амархан боллоо! Профайлыг ашиглаж, саатал хаана байгааг олж мэдье." I
Би дөрвөн профайл авсан: өндөр QPS (бага хоцролттой) болон бага QPS (өндөр хоцролттой) ширээний теннисний сервертэй, үйлчлүүлэгч болон серверийн аль алинд нь. Мөн ямар ч тохиолдолд би процессорын профайлын дээжийг авсан. Профайлыг харьцуулахдаа би ихэвчлэн хэвийн бус дуудлагын стекийг хайдаг. Жишээлбэл, хоцрогдол ихтэй муу тал дээр өөр олон контекст шилжүүлэгч байдаг (10 ба түүнээс дээш удаа). Гэхдээ миний хувьд контекст шилжүүлэгчийн тоо бараг ижил байсан. Миний аймшигтай нь тэнд ямар ч чухал зүйл байгаагүй.
Нэмэлт дибаг хийх
Би цөхрөлд автсан. Би өөр ямар хэрэгсэл ашиглаж болохоо мэдэхгүй байсан бөгөөд миний дараагийн төлөвлөгөө бол асуудлыг тодорхой оношлохын оронд өөр өөр хувилбараар туршилтуудыг давтах явдал байв.
Хэрвээ
Би анхнаасаа л тодорхой 50 мс хоцрогдолд санаа зовж байсан. Энэ бол маш том хугацаа юм. Би яг аль хэсэг нь энэ алдааг үүсгэж байгааг олж мэдэх хүртлээ кодыг хэсэгчлэн хасахаар шийдсэн. Дараа нь үр дүнтэй туршилт гарч ирэв.
Ердийнх шигээ эргээд харахад бүх зүйл тодорхой байсан бололтой. Би үйлчлүүлэгчийг Алвинтай ижил машин дээр байрлуулж, хүсэлт илгээсэн localhost
. Мөн хоцрогдлын өсөлт алга болсон!
Сүлжээнд ямар нэг зүйл буруу байна.
Сүлжээний инженерийн ур чадварт суралцах
Би хүлээн зөвшөөрөх ёстой: Сүлжээний технологийн талаархи миний мэдлэг аймшигтай, ялангуяа би тэдэнтэй өдөр бүр ажилладаг гэдгээ бодвол. Гэхдээ сүлжээ нь гол сэжигтэн байсан тул би үүнийг хэрхэн дибаг хийх талаар сурах хэрэгтэй болсон.
Аз болоход интернет сурах хүсэлтэй хүмүүст хайртай. Ping болон tracert-ийн хослол нь сүлжээний тээврийн асуудлыг засахад хангалттай сайн эхлэл мэт санагдсан.
Эхлээд би эхлүүлсэн
Дараа нь би оролдсон
Тиймээс саатал үүсгэсэн нь миний код, gRPC хэрэгжилт эсвэл сүлжээ биш байсан. Би үүнийг хэзээ ч ойлгохгүй гэж санаа зовж эхэлсэн.
Одоо бид ямар үйлдлийн системтэй вэ
gRPC
Линукс дээр өргөн хэрэглэгддэг, харин Windows дээр чамин. Би туршилт хийхээр шийдсэн бөгөөд энэ нь амжилттай болсон: Би Линуксийн виртуал машин бүтээж, Linux-д зориулсан Alvin-ийг эмхэтгэж, түүнийгээ байршуулсан.
Тэгээд юу болсон бэ: Линуксийн ширээний теннисний сервер нь ижил төстэй Windows хосттой адил сааталгүй байсан ч мэдээллийн эх сурвалж нь өөр байсангүй. Асуудал нь Windows-д зориулсан gRPC хэрэгжилтэд байгаа нь харагдаж байна.
Наглийн алгоритм
Энэ бүх хугацаанд би өөрийгөө далбаа дутуу байна гэж бодсон gRPC
. Энэ үнэхээр юу болохыг одоо би ойлгож байна gRPC
Windows-ын далбаа байхгүй байна. Би бүх туг дээр сайн ажиллана гэдэгт итгэлтэй байсан дотоод RPC номын санг олсон
Бараг л Дууссан: Би шалтгааныг тогтоохын тулд регресс буцаж ирэх хүртэл нэмсэн тугуудыг нэг нэгээр нь устгаж эхэлсэн. Энэ нь гутамшигтай байсан
gRPC
Энэ тугийг TCP залгуурт зориулсан Линукс хэрэгжүүлэлтэд суулгасан боловч Windows дээр биш. Би бол энэ
дүгнэлт
Бага QPS-ийн хоцролт нь үйлдлийн системийн оновчлолоос үүдэлтэй. Эргээд харахад, профайл хийхдээ хоцролтыг илрүүлээгүй, учир нь энэ нь цөмийн горимд биш харин цөмийн горимд хийгдсэн байдаг
Localhost-ийн туршилтын хувьд, энэ нь бодит сүлжээний кодыг хөндөөгүй, Nagle-ийн алгоритм ажиллахгүй байсан тул үйлчлүүлэгч нь localhost-ээр дамжуулан Alvin-д хүрэх үед саатлын асуудал арилсан.
Дараагийн удаад секундэд ирэх хүсэлтийн тоо буурах тусам хоцролт нэмэгдэж байгааг харах үед Наглегийн алгоритм таны сэжигтний жагсаалтад байх ёстой!
Эх сурвалж: www.habr.com