Милион захтева у секунди са Питхоном

Да ли је могуће погодити милион захтева у секунди помоћу Питхона? Вероватно не донедавно.

Много компанија се сели са Питхона и на друге програмске језике, тако да могу побољшати перформансе рада и уштедети на ценама сервера, али заправо нема потребе. Питхон може бити прави алат за посао.

Питхон заједница у последње време много ради око перформанси. ЦПитхон 3.6 је побољшао укупне перформансе тумача новом имплементацијом речника. ЦПитхон 3.7 ће бити још бржи, захваљујући увођењу брже конвенције позива и предмеморије претраживања речника.

За задатке дробљења бројева можете користити ПиПи са његовом тачном компилацијом кода. Такође можете покренути НумПи-ов тест пакет, који је сада побољшао укупну компатибилност са Ц екстензијама. Касније ове године очекује се да ПиПи достигне Питхон 3.5 усклађеност.

Све ово сјајно дело инспирисало ме је да иновирам у једној од области у којој се Питхон интензивно користи: развој веба и микро услуга.

Уђите у Јапронто!

Јапронто је потпуно нови микро-оквир скројен за ваше потребе микро-услуга. Њени главни циљеви укључују брз , скалабилан и лаган . Омогућава вам синхроно и асинхроно програмирање захваљујући асинцио . И то је бесрамно брзо . Чак и брже од НодеЈС и Го.

Грешка: Као што истиче корисник @хеппу, Го-ов стдлиб ХТТП сервер може бити 12% бржи него што овај графикон показује када се пажљивије напише. Такође постоји сјајни фастхттп сервер за Го, који је очигледно само 18% спорији од Јапронта у овом конкретном тесту. Авесоме! За детаље погледајте //гитхуб.цом/скуеаки-пл/јапронто/пулл/12 и //гитхуб.цом/скуеаки-пл/јапронто/пулл/14.

Такође можемо видети да је Меинхелд ВСГИ сервер готово у равни са НодеЈС и Го. Упркос свом инхерентно блокирајућем дизајну, одличан је извођач у поређењу са претходна четири, која су асинхрона Питхон решења. Зато никада не верујте никоме ко каже да су асинхрони системи увек бржи. Готово су увек истовремени, али у томе је много више од самог тога.

Извршио сам ово микро мерило користећи „Здраво свете!“ апликација, али јасно показује опсег серверског оквира за бројна решења.

Ови резултати су добијени на инстанци АВС ц4.2кларге која је имала 8 ВЦПУ-а, лансираних у региону Сао Паула са подразумеваним дељеним станарством и ХВМ виртуализацијом и магнетним складиштењем. Машина је радила на Убунту 16.04.1 ЛТС (Ксениал Ксерус) са Линук 4.4.0–53-генеричким језгром к86_64. ОС је пријављивао Ксеон® ЦПУ Е5–2666 в3 на 2.90ГХз ЦПУ. Користио сам Питхон 3.6, који сам свеже компајлирао из изворног кода.

Да будемо поштени, сви такмичари (укључујући Го) водили су поступак са једним радником. Сервери су тестирани оптерећењем користећи врк са 1 нити, 100 веза и 24 истовремена (цевоводна) захтева по вези (кумулативни паралелизам 2400 захтева).

ХТТП цевовод је овде пресудан, јер је то једна од оптимизација коју Јапронто узима у обзир приликом извршавања захтева.

Већина сервера извршава захтеве од клијената за цевоводно слагање на исти начин као и од клијената који нису за цевовод. Не покушавају да је оптимизују. (Заправо ће Саниц и Меинхелд такође нечујно испуштати захтеве клијената за цевовод, што представља кршење ХТТП 1.1 протокола.)

Једноставним речима, цевовод је техника у којој клијент не мора да чека одговор пре него што пошаље наредне захтеве преко исте ТЦП везе. Да би осигурао интегритет комуникације, сервер шаље неколико одговора истим редоследом када су примљени захтеви.

Крвави детаљи оптимизације

Када клијент споји многе мале ГЕТ захтеве, постоји велика вероватноћа да ће они стићи у једном ТЦП пакету (захваљујући Наглеовом алгоритму) на страни сервера, а затим ће их читати један системски позив .

Упућивање системског позива и премештање података из простора језгра у кориснички простор веома је скупа операција у поређењу са, рецимо, премештањем меморије унутар простора процеса. Због тога је важно да обавите што мање системских позива (али не мање).

Када Јапронто прими податке и успешно рашчлани неколико захтева из њих, покушава да изврши све захтеве што је брже могуће, лепи одговоре назад у исправном редоследу, а затим их уписује у једном системском позиву . Заправо језгро може да помогне у лепљењу, захваљујући распршеном / сакупљању ИО системских позива, које Јапронто још увек не користи.

Имајте на уму да то није увек могуће, јер би неки захтеви могли предуго трајати и чекање на њих би непотребно повећало кашњење.

Водите рачуна када подешавате хеуристику и узмите у обзир трошкове системских позива и очекивано време завршетка захтева.

Поред одлагања писања за цевоводе с цевоводом, постоји и неколико других техника које код користи.

Јапронто је готово у целости написан на Ц. Објекти за рашчлањивање, протокол, жетву везе, рутер, захтев и одговор написани су као Ц екстензије.

Јапронто се труди да одложи стварање Питхон-ових колега својих унутрашњих структура док се то изричито не затражи. На пример, речник заглавља неће бити креиран док се не затражи у приказу. Све границе токена су већ раније означене, али нормализација заглавних кључева и стварање неколико стр објеката се врши када им се приступи први пут.

Јапронто се ослања на изврсну библиотеку пицохттппарсер Ц за рашчлањивање статусне линије, заглавља и дељена тела ХТТП поруке. Пицохттппарсер директно користи упутства за обраду текста која се налазе у модерним процесорима са ССЕ4.2 екстензијама (има их готово сваки десетогодишњи к86_64 ЦПУ) како би се брзо ускладила са границама ХТТП токена. Улазом / излазом управља супер сјајни увлооп, који је сам по себи омотач око либува. На најнижем нивоу, ово је мост за еполл системски позив који пружа асинхрона обавештења о спремности за читање и писање.

Питхон је језик за сакупљање смећа, па треба бити опрезан при дизајнирању система високих перформанси како не би непотребно повећавао притисак на сакупљач смећа. Унутрашњи дизајн Јапронта покушава да избегне референтне циклусе и уради онолико додељивања / ослобађања колико је потребно. То чини преалокацијом неких објеката у такозване арене. Такође покушава поново да користи Питхон објекте за будуће захтеве ако се на њих више не упућује, уместо да их баци.

Сва издвајања се извршавају као умножци од 4КБ. Унутрашње структуре су пажљиво распоређене тако да се подаци који се често користе заједно налазе довољно близу меморије, смањујући могућност промашаја кеш меморије.

Јапронто покушава да непотребно не копира између бафера и обавља многе операције на месту. На пример, процентуално декодира путању пре подударања у процесу рутера.

Сарадници отвореног кода, користила бих вашу помоћ.

Јапронто радим непрекидно у протекла 3 месеца - често током викенда, као и уобичајених радних дана. То је било могуће само зато што сам се одморио од редовног посла програмера и уложио сав свој труд у овај пројекат.

Мислим да је време да поделим плод свог рада са заједницом.

Тренутно Јапронто примењује прилично солидан скуп функција:

  • Имплементација ХТТП 1.к са подршком за груписана отпремања
  • Пуна подршка за ХТТП цевовод
  • Одржавање веза са подесивом жетелицом
  • Подршка за синхроне и асинхроне погледе
  • Модел мастер-мултиворкер заснован на рачвању
  • Подршка за поновно учитавање кода на промене
  • Једноставно усмеравање

Следеће бих желео да прегледам Вебсоцкетс и стриминг ХТТП одговора.

Пуно посла треба урадити у погледу документовања и тестирања. Ако сте заинтересовани за помоћ, контактирајте ме директно на Твиттер-у. Ево складишта пројеката Јапронто-а ГитХуб.

Такође, ако ваша компанија тражи програмера за Питхон који је наказа перформанси и такође ради ДевОпс, отворен сам да чујем о томе. Размотрићу позиције широм света.

Завршне речи

Све технике које сам овде поменуо заправо нису специфичне за Питхон. Вероватно би могли бити запослени на другим језицима као што су Руби, ЈаваСцрипт или чак ПХП. И ја бих био заинтересован за такав посао, али нажалост то се неће догодити ако неко не може то финансирати.

Желео бих да захвалим заједници Питхон на њиховом континуираном улагању у инжењеринг перформанси. Наиме Вицтор Стиннер @ВицторСтиннер, ИНАДА Наоки @метхане и Иури Селиванов @ 1ст1 и цео ПиПи тим.

Из љубави према Питхону.