Sveiki visiem! Mani sauc Sergejs Kostanbajevs, BirÅ¾Ä es izstrÄdÄju tirdzniecÄ«bas sistÄmas kodolu.
Kad Holivudas filmÄs rÄda Å
ujorkas biržu, tas vienmÄr izskatÄs Å”Ädi: cilvÄku pūļi, visi kaut ko kliedz, vicina papÄ«rus, notiek pilnÄ«gs haoss. Pie mums Maskavas birÅ¾Ä tas nekad nav noticis, jo tirdzniecÄ«ba jau no paÅ”a sÄkuma ir notikusi elektroniski un balstÄs uz divÄm galvenajÄm platformÄm - Spectra (forex tirgus) un ASTS (Ärvalstu birža, akciju un naudas tirgus). Un Å”odien es vÄlos runÄt par ASTS tirdzniecÄ«bas un klÄ«ringa sistÄmas arhitektÅ«ras evolÅ«ciju, par dažÄdiem risinÄjumiem un atziÅÄm. StÄsts bÅ«s garÅ”, tÄpÄc nÄcÄs to sadalÄ«t divÄs daļÄs.
MÄs esam viena no retajÄm biržÄm pasaulÄ, kas tirgo visu klaÅ”u aktÄ«vus un sniedz pilnu biržas pakalpojumu klÄstu. PiemÄram, pagÄjuÅ”ajÄ gadÄ ierindojÄmies otrajÄ vietÄ pasaulÄ pÄc obligÄciju tirdzniecÄ«bas apjoma, 25. vietÄ starp visÄm biržÄm, 13. vietÄ kapitalizÄcijas ziÅÄ starp publiskajÄm biržÄm.
ProfesionÄliem tirdzniecÄ«bas dalÄ«bniekiem kritiski svarÄ«gi ir tÄdi parametri kÄ reakcijas laiks, laika sadalÄ«juma stabilitÄte (trÄ«ce) un visa kompleksa uzticamÄ«ba. PaÅ”laik mÄs apstrÄdÄjam desmitiem miljonu darÄ«jumu dienÄ. Katra darÄ«juma apstrÄde, ko veic sistÄmas kodols, aizÅem desmitiem mikrosekunžu. Protams, mobilo sakaru operatoriem Vecgada vakarÄ vai paÅ”iem meklÄtÄjiem ir lielÄka slodze nekÄ pie mums, bet slodzes ziÅÄ kopÄ ar iepriekÅ”minÄtajÄm Ä«paŔībÄm ar mums, man Ŕķiet, reti kurÅ” var salÄ«dzinÄt. TajÄ paÅ”Ä laikÄ mums ir svarÄ«gi, lai sistÄma ne mirkli nepalÄninÄtu, darbotos absolÅ«ti stabili un visi lietotÄji bÅ«tu vienlÄ«dzÄ«gi.
Nedaudz vÄstures
1994. gadÄ Maskavas starpbanku valÅ«tas birÅ¾Ä (MICEX) tika palaista AustrÄlijas sistÄma ASTS, un no Ŕī brīža var skaitÄ«t Krievijas elektroniskÄs tirdzniecÄ«bas vÄsturi. 1998. gadÄ biržas arhitektÅ«ra tika modernizÄta, lai ieviestu tirdzniecÄ«bu internetÄ. KopÅ” tÄ laika jaunu risinÄjumu un arhitektÅ«ras izmaiÅu ievieÅ”anas Ätrums visÄs sistÄmÄs un apakÅ”sistÄmÄs tikai uzÅem apgriezienus.
Tajos gados apmaiÅas sistÄma strÄdÄja ar augstÄkÄs klases aparatÅ«ru - Ä«paÅ”i uzticamiem HP Superdome 9000 serveriem (bÅ«vÄti uz
TaÄu aptuveni kopÅ” 2010. gada ir parÄdÄ«jusies parÄdÄ«ba, ko sauc par augstfrekvences tirdzniecÄ«bu (HFT) jeb augstfrekvences tirdzniecÄ«bu ā vienkÄrÅ”i sakot, biržas roboti. Tikai 2,5 gadu laikÄ mÅ«su serveru slodze ir pieaugusi 140 reizes.
TÄdu slodzi ar veco arhitektÅ«ru un aprÄ«kojumu nebija iespÄjams izturÄt. VajadzÄja kaut kÄ pielÄgoties.
sÄkums
PieprasÄ«jumus apmaiÅas sistÄmai var iedalÄ«t divos veidos:
- DarÄ«jumi. Ja vÄlaties iegÄdÄties dolÄrus, akcijas vai ko citu, nosÅ«tiet darÄ«jumu uz tirdzniecÄ«bas sistÄmu un saÅemat atbildi par panÄkumiem.
- InformÄcijas pieprasÄ«jumi. Ja vÄlaties uzzinÄt aktuÄlo cenu, apskatÄ«t pasÅ«tÄ«jumu grÄmatu vai indeksus, pÄc tam nosÅ«tÄ«t informÄcijas pieprasÄ«jumus.
Shematiski sistÄmas kodolu var iedalÄ«t trÄ«s lÄ«meÅos:
- Klientu lÄ«menis, kurÄ strÄdÄ brokeri un klienti. ViÅi visi mijiedarbojas ar piekļuves serveriem.
- VÄrtejas serveri ir keÅ”atmiÅas serveri, kas lokÄli apstrÄdÄ visus informÄcijas pieprasÄ«jumus. Vai vÄlaties uzzinÄt, par kÄdu cenu Å”obrÄ«d tiek tirgotas Sberbank akcijas? PieprasÄ«jums tiek nosÅ«tÄ«ts uz piekļuves serveri.
- Bet, ja vÄlaties iegÄdÄties akcijas, tad pieprasÄ«jums nonÄk centrÄlajÄ serverÄ« (Trade Engine). Katram tirgus veidam ir viens Å”Äds serveris, tiem ir bÅ«tiska loma, tieÅ”i viÅiem mÄs izveidojÄm Å”o sistÄmu.
TirdzniecÄ«bas sistÄmas kodols ir gudra atmiÅas datu bÄze, kurÄ visi darÄ«jumi ir maiÅas darÄ«jumi. BÄze tika rakstÄ«ta C valodÄ, vienÄ«gÄs ÄrÄjÄs atkarÄ«bas bija libc bibliotÄka un vispÄr nebija dinamiskas atmiÅas pieŔķirÅ”anas. Lai samazinÄtu apstrÄdes laiku, sistÄma sÄkas ar statisku masÄ«vu komplektu un statisku datu pÄrvietoÅ”anu: vispirms atmiÅÄ tiek ielÄdÄti visi paÅ”reizÄjÄs dienas dati un netiek veikta turpmÄka piekļuve diskam, viss darbs tiek veikts tikai atmiÅÄ. Kad sistÄma startÄ, visi atsauces dati jau ir sakÄrtoti, tÄpÄc meklÄÅ”ana darbojas ļoti efektÄ«vi un aizÅem maz laika izpildlaikÄ. Visas tabulas ir veidotas ar uzmÄcÄ«giem sarakstiem un kokiem dinamiskÄm datu struktÅ«rÄm, lai tÄm nebÅ«tu nepiecieÅ”ama atmiÅas pieŔķirÅ”ana izpildlaikÄ.
ÄŖsi apskatÄ«sim mÅ«su tirdzniecÄ«bas un klÄ«ringa sistÄmas attÄ«stÄ«bas vÄsturi.
PirmÄ tirdzniecÄ«bas un klÄ«ringa sistÄmas arhitektÅ«ras versija tika balstÄ«ta uz tÄ saukto Unix mijiedarbÄ«bu: tika izmantota koplietojamÄ atmiÅa, semafori un rindas, un katrs process sastÄvÄja no viena pavediena. Å Ä« pieeja bija plaÅ”i izplatÄ«ta 1990. gadu sÄkumÄ.
PirmajÄ sistÄmas versijÄ bija divi Gateway lÄ«meÅi un tirdzniecÄ«bas sistÄmas centrÄlais serveris. Darba gaita bija Å”Äda:
- Klients nosÅ«ta pieprasÄ«jumu, kas sasniedz Gateway. TÄ pÄrbauda formÄta derÄ«gumu (bet ne paÅ”us datus) un noraida nepareizas transakcijas.
- Ja ir nosÅ«tÄ«ts informÄcijas pieprasÄ«jums, tas tiek izpildÄ«ts lokÄli; ja mÄs runÄjam par darÄ«jumu, tad tas tiek novirzÄ«ts uz centrÄlo serveri.
- PÄc tam tirdzniecÄ«bas dzinÄjs apstrÄdÄ darÄ«jumu, pÄrveido vietÄjo atmiÅu un nosÅ«ta atbildi uz darÄ«jumu un paÅ”u darÄ«jumu replikÄcijai, izmantojot atseviŔķu replikÄcijas dzinÄju.
- VÄrteja saÅem atbildi no centrÄlÄ mezgla un pÄrsÅ«ta to klientam.
- PÄc kÄda laika vÄrteja saÅem transakciju, izmantojot replikÄcijas mehÄnismu, un Å”oreiz tÄ izpilda to lokÄli, mainot datu struktÅ«ras, lai nÄkamie informÄcijas pieprasÄ«jumi parÄdÄ«tu jaunÄkos datus.
Faktiski tas apraksta replikÄcijas modeli, kurÄ vÄrteja pilnÄ«bÄ atkÄrtoja tirdzniecÄ«bas sistÄmÄ veiktÄs darbÄ«bas. AtseviŔķs replikÄcijas kanÄls nodroÅ”inÄja, ka darÄ«jumi tika izpildÄ«ti vienÄ un tajÄ paÅ”Ä secÄ«bÄ vairÄkos piekļuves mezglos.
TÄ kÄ kods bija ar vienu pavedienu, daudzu klientu apkalpoÅ”anai tika izmantota klasiska shÄma ar procesa dakÅ”Äm. TomÄr visas datu bÄzes dakÅ”a bija ļoti dÄrga, tÄpÄc tika izmantoti vieglie pakalpojumu procesi, kas savÄca paketes no TCP sesijÄm un pÄrsÅ«tÄ«ja tÄs uz vienu rindu (SystemV Message Queue). Gateway un Trade Engine darbojÄs tikai ar Å”o rindu, veicot darÄ«jumus no turienes. Atbildi uz to nosÅ«tÄ«t vairs nebija iespÄjams, jo nebija skaidrs, kuram servisa procesam tÄ jÄizlasa. TÄpÄc mÄs Ä·ÄrÄmies pie viltÄ«bas: katrs dakÅ”veida process izveidoja sev atbilžu rindu, un, kad pieprasÄ«jums nonÄca ienÄkoÅ”ajÄ rindÄ, tai nekavÄjoties tika pievienots atbilžu rindas tags.
PastÄvÄ«ga liela datu apjoma kopÄÅ”ana no rindas uz rindu radÄ«ja problÄmas, kas Ä«paÅ”i raksturÄ«gas informÄcijas pieprasÄ«jumiem. TÄpÄc mÄs izmantojÄm citu triku: papildus atbilžu rindai katrs process izveidoja arÄ« koplietojamo atmiÅu (SystemV Shared Memory). TajÄ tika ievietotas paÅ”as pakas, un rindÄ tika saglabÄta tikai birka, kas ļÄva atrast oriÄ£inÄlo iepakojumu. Tas palÄ«dzÄja saglabÄt datus procesora keÅ”atmiÅÄ.
SystemV IPC ietver utilÄ«tas rindas stÄvokļa, atmiÅas un semaforu objektu apskatei. MÄs to aktÄ«vi izmantojÄm, lai saprastu, kas konkrÄtajÄ brÄ«dÄ« notiek sistÄmÄ, kur uzkrÄjÄs paketes, kas tika bloÄ·Äts utt.
PirmÄs modernizÄcijas
PirmkÄrt, mÄs atbrÄ«vojÄmies no viena procesa vÄrtejas. TÄs bÅ«tisks trÅ«kums bija tas, ka tas varÄja apstrÄdÄt vai nu vienu replikÄcijas darÄ«jumu, vai vienu informÄcijas pieprasÄ«jumu no klienta. Un, palielinoties slodzei, Gateway prasÄ«s ilgÄku laiku, lai apstrÄdÄtu pieprasÄ«jumus, un tas nevarÄs apstrÄdÄt replikÄcijas plÅ«smu. TurklÄt, ja klients nosÅ«tÄ«ja darÄ«jumu, jums tikai jÄpÄrbauda tÄ derÄ«gums un jÄpÄrsÅ«ta tÄlÄk. TÄpÄc mÄs aizstÄjÄm vienu vÄrtejas procesu ar vairÄkiem komponentiem, kas var darboties paralÄli: vairÄku pavedienu informÄcija un darÄ«jumu procesi, kas darbojas neatkarÄ«gi viens no otra koplietojamÄ atmiÅas apgabalÄ, izmantojot RW bloÄ·ÄÅ”anu. Un tajÄ paÅ”Ä laikÄ mÄs ieviesÄm nosÅ«tÄ«Å”anas un replikÄcijas procesus.
Augstas frekvences tirdzniecības ietekme
IepriekÅ” minÄtÄ arhitektÅ«ras versija pastÄvÄja lÄ«dz 2010. gadam. TikmÄr mÄs vairs nebijÄm apmierinÄti ar HP Superdome serveru veiktspÄju. TurklÄt PA-RISC arhitektÅ«ra bija gandrÄ«z mirusi; pÄrdevÄjs nepiedÄvÄja nekÄdus nozÄ«mÄ«gus atjauninÄjumus. TÄ rezultÄtÄ mÄs sÄkÄm pÄriet no HP UX/PA RISC uz Linux/x86. PÄreja sÄkÄs ar piekļuves serveru pielÄgoÅ”anu.
KÄpÄc mums atkal bija jÄmaina arhitektÅ«ra? Fakts ir tÄds, ka augstfrekvences tirdzniecÄ«ba ir bÅ«tiski mainÄ«jusi sistÄmas kodola slodzes profilu.
Teiksim, mums ir neliels darÄ«jums, kas izraisÄ«ja bÅ«tiskas cenas izmaiÅas ā kÄds nopirka pusmiljardu dolÄru. PÄc pÄris milisekundÄm visi tirgus dalÄ«bnieki to pamana un sÄk veikt korekciju. Protams, pieprasÄ«jumi atrodas milzÄ«gÄ rindÄ, kuras notÄ«rÄ«Å”ana sistÄmai prasÄ«s ilgu laiku.
Å ajÄ 50 ms intervÄlÄ vidÄjais Ätrums ir aptuveni 16 tÅ«kstoÅ”i darÄ«jumu sekundÄ. Samazinot logu lÄ«dz 20 ms, mÄs iegÅ«stam vidÄjo Ätrumu 90 tÅ«kstoÅ”i transakciju sekundÄ, un maksimums ir 200 tÅ«kstoÅ”i darÄ«jumu. Citiem vÄrdiem sakot, slodze nav nemainÄ«ga, ar pÄkÅ”Åiem pÄrrÄvumiem. Un pieprasÄ«jumu rinda vienmÄr ir jÄapstrÄdÄ Ätri.
Bet kÄpÄc vispÄr ir rinda? TÄtad mÅ«su piemÄrÄ daudzi lietotÄji pamanÄ«ja cenu izmaiÅas un attiecÄ«gi nosÅ«tÄ«ja darÄ«jumus. Tie nonÄk Gateway, tas tos serializÄ, nosaka noteiktu secÄ«bu un nosÅ«ta tos tÄ«klam. MarÅ”rutÄtÄji sajauc paketes un pÄrsÅ«ta tÄs tÄlÄk. Kura paka ieradÄs pirmÄ, Å”is darÄ«jums āuzvarÄjaā. TÄ rezultÄtÄ biržas klienti sÄka pamanÄ«t, ka, ja viens un tas pats darÄ«jums tika nosÅ«tÄ«ts no vairÄkiem vÄrtiem, pieauga tÄ Ätras apstrÄdes iespÄjas. DrÄ«z vien biržas roboti sÄka bombardÄt Gateway ar pieprasÄ«jumiem, un radÄs darÄ«jumu lavÄ«na.
Jauna evolÅ«cijas kÄrta
PÄc plaÅ”as pÄrbaudes un izpÄtes mÄs pÄrgÄjÄm uz reÄllaika operÄtÄjsistÄmas kodolu. Å im nolÅ«kam mÄs izvÄlÄjÄmies RedHat Enterprise MRG Linux, kur MRG apzÄ«mÄ ziÅojumapmaiÅas reÄllaika režģi. ReÄllaika ielÄpu priekÅ”rocÄ«ba ir tÄ, ka tie optimizÄ sistÄmu pÄc iespÄjas ÄtrÄkai izpildei: visi procesi ir sakÄrtoti FIFO rindÄ, kodolus var izolÄt, nav izstumÅ”anas, visas transakcijas tiek apstrÄdÄtas stingrÄ secÄ«bÄ.
Sarkans - darbs ar rindu parastÄ kodolÄ, zaļŔ - darbs reÄllaika kodolÄ.
Bet zema latentuma sasniegÅ”ana parastajos serveros nav tik vienkÄrÅ”a:
- SMI režīms, kas x86 arhitektÅ«rÄ ir pamats darbam ar svarÄ«gÄm perifÄrijas ierÄ«cÄm, ievÄrojami traucÄ. Visu veidu aparatÅ«ras notikumu apstrÄdi un komponentu un ierÄ«Äu pÄrvaldÄ«bu programmaparatÅ«ra veic tÄ sauktajÄ caurspÄ«dÄ«gajÄ SMI režīmÄ, kurÄ operÄtÄjsistÄma vispÄr neredz, ko programmaparatÅ«ra dara. Parasti visi lielÄkie pÄrdevÄji piedÄvÄ Ä«paÅ”us programmaparatÅ«ras serveru paplaÅ”inÄjumus, kas ļauj samazinÄt SMI apstrÄdes apjomu.
- Procesora frekvences dinamiskai kontrolei nevajadzÄtu bÅ«t, tas noved pie papildu dÄ«kstÄves.
- Kad failu sistÄmas žurnÄls tiek izskalots, kodolÄ notiek noteikti procesi, kas izraisa neparedzamu aizkavi.
- Jums jÄpievÄrÅ” uzmanÄ«ba tÄdÄm lietÄm kÄ CPU afinitÄte, pÄrtraukumu radniecÄ«ba, NUMA.
Man jÄsaka, ka tÄma par Linux aparatÅ«ras un kodola iestatÄ«Å”anu reÄllaika apstrÄdei ir pelnÄ«jusi atseviŔķu rakstu. MÄs pavadÄ«jÄm daudz laika eksperimentÄjot un pÄtot, pirms panÄcÄm labu rezultÄtu.
PÄrejot no PA-RISC serveriem uz x86, praktiski nebija daudz jÄmaina sistÄmas kods, tikai pielÄgojÄm un pÄrkonfigurÄjÄm. TajÄ paÅ”Ä laikÄ mÄs izlabojÄm vairÄkas kļūdas. PiemÄram, sekas tam, ka PA RISC bija Big endian sistÄma un x86 bija Little endian sistÄma, Ätri parÄdÄ«jÄs: piemÄram, dati tika nolasÄ«ti nepareizi. SarežģītÄka kļūda bija PA RISC izmantotÄ kļūda
PÄc pÄrslÄgÅ”anÄs uz x86 veiktspÄja palielinÄjÄs gandrÄ«z trÄ«s reizes, vidÄjais darÄ«jumu apstrÄdes laiks samazinÄjÄs lÄ«dz 60 Ī¼s.
Tagad sÄ«kÄk apskatÄ«sim, kÄdas galvenÄs izmaiÅas ir veiktas sistÄmas arhitektÅ«rÄ.
Karsta rezerves epopeja
PÄrejot uz preÄu serveriem, mÄs apzinÄjÄmies, ka tie ir mazÄk uzticami. TÄpÄc, veidojot jaunu arhitektÅ«ru, mÄs a priori pieÅÄmÄm viena vai vairÄku mezglu atteices iespÄju. TÄpÄc bija nepiecieÅ”ama karstÄ gaidstÄves sistÄma, kas varÄtu ļoti Ätri pÄrslÄgties uz rezerves maŔīnÄm.
TurklÄt bija arÄ« citas prasÄ«bas:
- NekÄdÄ gadÄ«jumÄ nevajadzÄtu zaudÄt apstrÄdÄtos darÄ«jumus.
- SistÄmai ir jÄbÅ«t pilnÄ«gi pÄrredzamai mÅ«su infrastruktÅ«rai.
- Klientiem nevajadzÄtu redzÄt pÄrtrauktus savienojumus.
- RezervÄcijas nedrÄ«kst radÄ«t ievÄrojamu kavÄÅ”anos, jo tas ir izŔķiroÅ”s faktors apmaiÅai.
Veidojot karstÄ gaidstÄves sistÄmu, mÄs neuzskatÄ«jÄm Å”Ädus scenÄrijus kÄ dubultas kļūmes (piemÄram, tÄ«kls vienÄ serverÄ« pÄrstÄja darboties un galvenais serveris sastinga); neuzskatÄ«ja par kļūdu iespÄjamÄ«bu programmatÅ«rÄ, jo tÄs tiek identificÄtas testÄÅ”anas laikÄ; un neuzskatÄ«ja par nepareizu aparatÅ«ras darbÄ«bu.
RezultÄtÄ mÄs nonÄcÄm pie Å”Ädas shÄmas:
- Galvenais serveris tieÅ”i mijiedarbojÄs ar vÄrtejas serveriem.
- Visas transakcijas, kas tika saÅemtas galvenajÄ serverÄ«, tika uzreiz replicÄtas rezerves serverÄ«, izmantojot atseviŔķu kanÄlu. Å Ä·Ä«rÄjtiesnesis (gubernators) koordinÄja maiÅu, ja radÄs kÄdas problÄmas.
- Galvenais serveris apstrÄdÄja katru darÄ«jumu un gaidÄ«ja apstiprinÄjumu no rezerves servera. Lai samazinÄtu latentumu lÄ«dz minimumam, mÄs izvairÄ«jÄmies gaidÄ«t, kamÄr darÄ«jums tiks pabeigts rezerves serverÄ«. TÄ kÄ laiks, kas bija nepiecieÅ”ams, lai darÄ«jums pÄrvietotos pa tÄ«klu, bija salÄ«dzinÄms ar izpildes laiku, papildu latentums netika pievienots.
- MÄs varÄjÄm pÄrbaudÄ«t tikai iepriekÅ”ÄjÄ darÄ«juma galvenÄ un rezerves servera apstrÄdes statusu, un paÅ”reizÄjÄ darÄ«juma apstrÄdes statuss nebija zinÄms. TÄ kÄ mÄs joprojÄm izmantojÄm viena pavediena procesus, atbildes gaidÄ«Å”ana no Backup bÅ«tu palÄninÄjusi visu apstrÄdes plÅ«smu, tÄpÄc mÄs izdarÄ«jÄm saprÄtÄ«gu kompromisu: pÄrbaudÄ«jÄm iepriekÅ”ÄjÄ darÄ«juma rezultÄtu.
ShÄma darbojÄs Å”Ädi.
PieÅemsim, ka galvenais serveris pÄrstÄj reaÄ£Ät, bet vÄrtejas turpina sazinÄties. Rezerves serverÄ« notiek taimauts, tas sazinÄs ar pÄrvaldnieku, kurÅ” tam pieŔķir galvenÄ servera lomu, un visas vÄrtejas pÄrslÄdzas uz jauno galveno serveri.
Ja galvenais serveris atgriežas tieÅ”saistÄ, tas arÄ« aktivizÄ iekÅ”Äjo taimautu, jo noteiktu laiku no vÄrtejas uz serveri nav saÅemti zvani. Tad viÅÅ” arÄ« vÄrÅ”as pie gubernatora, un viÅÅ” viÅu izslÄdz no shÄmas. RezultÄtÄ birža strÄdÄ ar vienu serveri lÄ«dz tirdzniecÄ«bas perioda beigÄm. TÄ kÄ servera atteices iespÄjamÄ«ba ir diezgan zema, Ŕī shÄma tika uzskatÄ«ta par diezgan pieÅemamu, tajÄ nebija sarežģītas loÄ£ikas un to bija viegli pÄrbaudÄ«t.
TurpinÄsim.
Avots: www.habr.com