Академиялык изилдөөлөр, түшүнүктүү тил

Verianla | Кыргызча академиялык изилдөөлөр жана илим

27 сентябрь 2026, Жекшемби
VERİANLAКөз карандысыз илимий басма
Менюну ачуу же жабуу
...
Башкы бет / Колдонмо илимдер / Компьютер илими / Төмөн Кечигүүчү C++ Системаларындагы Дизайн Тандоолору: Жогорку Жыштыктагы Соода үчүн Linux, Эс, Компилятор жана Тармак Оптималдаштырууларынын Эмпирикалык Талдоосу
Компьютер илими

Төмөн Кечигүүчү C++ Системаларындагы Дизайн Тандоолору: Жогорку Жыштыктагы Соода үчүн Linux, Эс, Компилятор жана Тармак Оптималдаштырууларынын Эмпирикалык Талдоосу

Базар маалымат пакети системага жеткенден тартып ага жооп болгон буйрук сыртка жөнөтүлгөнгө чейинки tick-to-trade кечигүүсү; операциялык системанын scheduler’и, interrupts, kernel housekeeping, page faults, TLB жүрүмү, cache locality, C++ башкаруу агымы, эс бөлүү, thread synchronization жана тармак протокол стеги сыяктуу көп катмардын жалпы жыйынтыгы болуп саналат.

18/09/2026  Veri Anla 100 көрүү
Төмөн Кечигүүчү C++ Системаларындагы Дизайн Тандоолору: Жогорку Жыштыктагы Соода үчүн Linux, Эс, Компилятор жана Тармак Оптималдаштырууларынын Эмпирикалык Талдоосу

Жогорку жыштыктагы соода системаларында өндүрүмдүүлүк бир алгоритмдин ылдамдыгы менен гана аныкталбайт. Базар маалымат пакети системага келгенден тартып ага жооп болгон буйрук сыртка жөнөтүлгөнгө чейин өтүүчү tick-to-trade кечигүүсү операциялык системанын scheduler’и, interrupts, kernel housekeeping, page faults, TLB жүрүмү, cache locality, C++ башкаруу агымы, эс бөлүү, thread synchronization жана тармак протокол стеги сыяктуу көп катмардын биргелешкен натыйжасы болуп саналат.

Khalid Mohammad бул катмарларды микроbenchmark аркылуу өз-өзүнчө текшерип, төмөн кечигүүчү программалык инженерияда кайсы дизайн тандоолору типтүү кечигүүгө, кайсылары болсо tail latency деп аталган сейрек, бирок өтө чоң кечигүү секириктерине таасир этерин изилдейт.

Негизги жыйынтык: бир эле “эң жакшы оптималдаштыруу” жок. Real-time scheduler median wakeup latency’ни азайтат, бирок терең tail учурларын жалгыз жок кыла албайт. Kernel деңгээлиндеги CPU isolation, RCU/workqueue ажыратуу жана interrupt steering p99.9 жана p99.99 кечигүүлөрүн алда канча күчтүү кыскарта алат.

Эс тарабында биринчи кайрылууда page fault жаратпай, барактарды алдын ала populate кылуу 2 µs чамасындагы first-touch чыгымын 20 ns деңгээлине түшүргөн. Explicit 2 MB HugeTLB 4 KB барактарга салыштырмалуу TLB miss үлүшүн %1,33төн %0,09га, cycles/access маанисин 290дон 43,12ге түшүргөн.

C++ катмарында stateless lambda inline function’га жакын турат; std::function ошол эле тажрыйбада 5,68× кымбат. RTTI негизиндеги dynamic_cast explicit tagging’ге салыштырмалуу 3,6× көп cycle колдонгон. Object pool жалпы new/delete’ке караганда 3,7× ылдамдык берген, heap allocation’дун tail latency’си болсо жогору калган.

Data-oriented дизайн маалыматтын жайгашуусу процессордун эсептөө күчүнөн да маанилүү болушу мүмкүн экенин көрсөтөт. Sequential memory access ≈5,35 cycles/access, random pointer chasing ≈378 cycles/access. False sharing эки thread тажрыйбасында убакытты 7,5× көбөйткөн; Structure of Arrays Array of Structures’ке караганда risk loop’ту тез бүтүргөн.

Тармак катмарында Linux UDP жолу менен AF_XDP жолу бир машинанын network namespace жана veth чөйрөсүндө салыштырылган. Kernel stack орточо ≈200 µs болсо, AF_XDP ≈8 µs; p50 ≈218 µsтен 6 µsке түшкөн. Бирок AF_XDP p99 ≈80 µs бойдон калган; kernel bypass tail latency’ни толук жоготпойт.

Жалпы инженердик жыйынтык: төмөн кечигүү бир тез функциядан эмес, критикалык жолдогу белгисиз жай жолдорду системалуу алып салуудан пайда болот.

Төмөн кечигүүчү системаларда негизги өлчөм эмне?

Жалпы программаларда throughput же операция саны жетиштүү болушу мүмкүн. HFT системаларында болсо сейрек кечигүү секириги да экономикалык мааниге ээ.

Ошондуктан p50 → p99 → p99.9 → p99.99 → максимум кечигүү чынжыры толук каралышы керек.

Scheduler тандоо өзү эле төмөн кечигүү береби?

Жок. cyclictest’те SCHED_FIFO типтүү wakeup latency боюнча CFS’тен тез, бирок терең tail’де kernel interference дагы киришет.

PercentileCFSCFS TunedSCHED_FIFO
p5055 µs55 µs5 µs
p9967 µs811 µs15 µs
p99.91383 µs929 µs1287 µs
p99.993386 µs1916 µs2673 µs

SCHED_FIFO p50ни 55 µsтен 5 µsке түшүрөт, бирок p99.9 дагы 1287 µs болгондуктан ири секириктер жалгыз scheduler кезегинен чыкпайт.

CPU isolation tail latency’ге эмне үчүн күчтүү таасир берет?

Thread белгилүү CPU’га pin кылынса да, ошол ядро timer tick, RCU callback, kernel workqueue же hardware interrupt аркылуу үзгүлтүккө учурашы мүмкүн. Изилдөө isolcpus, nohz_full, rcu_nocbs, cpuset/cgroup жана workqueue relocation’ди бирге колдонуп latency-critical ядрону kernel housekeeping’ден бөлөт.

PercentileCFSCFS + IsolationRTRT + Isolation
p5055 µs55 µs5 µs5 µs
p9967 µs61 µs15 µs10 µs
p99.91383 µs77 µs1287 µs33 µs
p99.993386 µs201 µs2673 µs174 µs

Median дээрлик өзгөрбөйт, бирок p99.9 жана p99.99 кескин кыскарат. Scheduler типтүү кечигүүгө, isolation ultra-tail жүрүмүнө көбүрөөк таасир этет.

Interrupt steering эмне кошот?

ӨлчөмIsolation жокIsolationIsolation + IRQ Steering
p99.91287 µs33 µs40 µs
p99.992673 µs174 µs109 µs
Maximum4673 µs564 µs399 µs

IRQ’ларды latency-sensitive CPU’дан алыстатуу p99.99 жана maximum маанилерин дагы төмөндөтөт; бир percentile бүт оптималдаштырууну түшүндүрбөйт.

Page fault жана huge pages

Linux anonymous memory’ни demand paging менен байланыштырат. 512 MB anonymous mapping тажрыйбасында 131.000дей minor page fault чыккан жана биринчи кайрылуу баасы барак башына 2 µs болгон. MAP_POPULATE steady-state first access’ти 20 ns деңгээлине түшүргөн. Бирок memory pressure болсо mlock/mlockall сыяктуу чаралар керек болушу мүмкүн.

Барак түзүлүшүCycles / AccessdTLB Miss Rate
4 KB≈290≈%1,33
Transparent Huge Pages≈241≈%0,47
Explicit HugeTLB 2 MB43,12%0,09

Explicit HugeTLB cycles/accessти 6–7× азайтат. THP болсо collapse, split жана compaction себептүү millisecond tail spike жаратышы мүмкүн.

VM tuning, mitigations жана C-state

PercentileДемейкиVM tuning кийин
p5092 µs30 µs
p99204 µs556 µs
p99.94415 µs4898 µs
p99.997630 µs7076 µs
Maximum9230 µs8013 µs

Median жакшырат, бирок p99 жана p99.9 начарлайт. Демек hot path ичинде runtime allocation’дон качып, эсти алдын ала бөлүү ишенимдүү.

ӨлчөмMitigations ONMitigations OFF
Raw syscall2850 cycles306 cycles
libc syscall2815 cycles278 cycles
Context switch24.301 cycles14.829 cycles
sched pipe7,76 µs/op4,76 µs/op

Mitigations өчүрүлгөндө syscall жана context switch арзандайт, бирок бул коопсуздук тобокелдигин жогорулатышы мүмкүн. Бул жалпы системалар үчүн түз сунуш эмес.

Абалp99p99.9p99.99
C-state ON / Idle54 µs57 µs175 µs
C-state OFF / Idle54 µs55 µs58 µs
C-state ON / Stress77 µs144 µs182 µs
C-state OFF / Stress70 µs149 µs197 µs

Idle шартта C-state өчүрүү p99.99ти кыскартат; stress шартта ошол эле пайда дайыма көрүнбөйт.

C++ hot path жыйынтыктары

Dispatch1 тип4 тип8 тип
Static1,32 ms8,75 ms10,02 ms
Virtual1,94 ms9,19 ms10,38 ms

Virtual dispatch бир типте 1,47× кымбат. Бирок ABI-stable интерфейстерде, plugin системаларда жана cold path’те dynamic polymorphism маанилүү болушу мүмкүн.

Move түзүлүшүWall Time
noexcept move101,6 s
non-noexcept move263,4 s

noexcept ар дайым тездетпейт, бирок std::vector reallocation’да move noexcept болбосо copy жолуна өтүп, 2,6× айырма жаратышы мүмкүн.

CallableRelative Cost
Inline function1,00×
Stateless lambda1,03×
std::function5,68×

dynamic_cast explicit tagging’ге караганда 3,6× көп cycle жана 7,6× көп instruction колдонгон. std::function’дун чыгымы lambdaдан эмес, type erasure жана indirect dispatchтен чыгат.

Cache locality, allocation жана concurrency

PGO 50 миллион order workload’унда execution time’ды 1,791 sтен 1,766 sке түшүргөн. Бул чоң эмес, бирок production hot path’те топтолгон майда жакшыруулар маанилүү болушу мүмкүн.

ӨлчөмBaselinePGO
Execution Time1,791 s1,766 s
Cycles6,20 B6,11 B
Instructions12,77 B11,07 B
LLC Load Misses419 K398 K
ОперацияMedianp99.9Maximum
new82 cycles8586 cycles172.401 cycles
Pool allocate32 cycles246 cycles81.756 cycles
delete60 cycles433 cycles73.471 cycles
Pool deallocate34 cycles262 cycles52.153 cycles

Object pool’дун артыкчылыгы айрыкча p99.9 tail’де көрүнөт. Sequential array ≈5,35 cycles/access, random pointer chasing ≈378 cycles/access болуп, айырма 70×.

Кириш түрүCycles / Access
Sequential array≈5,35
Random pointer chasing≈378

Hot/cold data бөлүү иш убактысын 1,08746 sтен 0,91845 sке, cache missesти 7,8×107ден 3,5×107ге түшүргөн. False sharing 4,16 s, cache-line padded 0,55 s болуп, 7,5× айырма жараткан.

ДүзүлүшCyclesУбакыт
False sharing2,73×10104,16 s
Cache-line padded3,61×1090,55 s

AoS 258 ms, SoA 145 ms; SIMD scalar 406 ms, AVX 370 ms болгон. Маалымат contiguous жана vector-friendly болсо SIMD көбүрөөк пайдалуу.

Lock-free жана AF_XDP

Операцияp50p99.9p99.99
Lock Push8017.78532.115 cycles
Lock-Free Push47294378 cycles
Lock Pop8112.95846.048 cycles
Lock-Free Pop25226278 cycles

SPSC ring buffer’де lock-free tail’ди кескин жакшыртат, бирок көп contention шартында CAS retry cache-line ping-pong жаратып mutex’тен начар болушу мүмкүн.

Классикалык жол NIC → Driver → sk_buff → IP/UDP Stack → Socket → System Call → User Space, AF_XDP жолу NIC → XDP → AF_XDP → UMEM → User Space.

Тармак жолуMeanp50p99
Kernel Stack≈200 µs≈218 µs≈300 µs
AF_XDP≈8 µs≈6 µs≈80 µs

Бул benchmark production HFT network’үн эмес, бир машинанын namespace/veth чөйрөсүн өлчөйт.

Метод жана булак эскертүүсү

Тажрыйба чөйрөсү

КомпонентКолдонулган чөйрө
CPUIntel Core i5-6500 @ 3,20 GHz
Ядро4 core / 1 thread per core
RAM3,7 GiB
NUMAБир node
Linux kernel6.8.0-90-generic
CompilerGCC 13.3.0
Default build-O2
CPU governorperformance

Жалпы үлгү: scheduler median’га, kernel isolation жана IRQ steering p99.9/p99.99ге көбүрөөк таасир этет; hot path’теги page fault, heap allocation, syscall жана futex чоң tail spike жарата алат; cache locality көп учурда арифметикалык оптималдаштыруудан күчтүүрөөк; kernel bypass орточо latency’ни азайтса да residual tail калат.

Түпнуска аталыш: Design Choices in Low-Latency C++ Systems: Empirical Insights with Applications to High-Frequency Trading

Автор: Khalid Mohammad.

Мекеме: Department of Computer Science, Indian Institute of Technology Kharagpur.

Дата: 3-апрель 2026; SSRN жүктөлгөн дата: 17-апрель 2026; SSRN ID: 6513601; DOI: 10.2139/ssrn.6513601.

Чектөөлөр: Натыйжалар Intel i5-6500, белгилүү Linux/GCC версиялары жана namespace/veth тармак чөйрөсү менен чектелет. Изилдөө trading alpha же стратегия кирешесин эмес, ultra-low-latency software engineering принциптерин текшерет.


Бөлүшүү:

Пикирлер текшерилгенден кийин жарыяланат.Пикириңиз жактыруу процессине жөнөтүлүп, ылайыктуу деп табылганда көрүнөт.

Пикир калтырыңыз

E-mail дарегиңиз жарыяланбайт. Милдеттүү талаалар * менен белгиленген

Бул сайтта кукилерге уруксат берүү тажрыйбаңызды жакшыртат. Куки саясаты