Utafiti wa kitaaluma, lugha inayoeleweka

Verianla | Akademik Araştırmalardan Türkçe Ekonomi ve Bilim İçerikleri

27 Septemba 2026, Jumapili
VERİANLAUchapishaji huru wa sayansi
Fungua au funga menyu
...
Home / Sayansi Tumizi / Sayansi ya Kompyuta / Chaguo za Muundo katika Mifumo ya C++ yenye Ucheleweshaji Mdogo: Uchambuzi wa Kijaribio wa Uboreshaji wa Linux, Kumbukumbu, Kikusanyaji na Mtandao kwa Biashara ya Marudio ya Juu
Sayansi ya Kompyuta

Chaguo za Muundo katika Mifumo ya C++ yenye Ucheleweshaji Mdogo: Uchambuzi wa Kijaribio wa Uboreshaji wa Linux, Kumbukumbu, Kikusanyaji na Mtandao kwa Biashara ya Marudio ya Juu

Ucheleweshaji wa tick-to-trade, kuanzia pakiti ya data ya soko inapofika kwenye mfumo hadi agizo linalolingana linapotumwa nje, ni matokeo ya pamoja ya tabaka nyingi kama kipanga-kazi cha mfumo endeshi, interrupts, kernel housekeeping, page faults, tabia ya TLB, cache locality, mtiririko wa udhibiti wa C++, ugawaji wa kumbukumbu, thread synchronization na rundo la itifaki za mtandao.

18/09/2026  Veri Anla Imetazamwa mara 109
Chaguo za Muundo katika Mifumo ya C++ yenye Ucheleweshaji Mdogo: Uchambuzi wa Kijaribio wa Uboreshaji wa Linux, Kumbukumbu, Kikusanyaji na Mtandao kwa Biashara ya Marudio ya Juu

Katika mifumo ya biashara ya marudio ya juu, utendaji hauamuliwi tu na kasi ya algoriti moja. Ucheleweshaji wa tick-to-trade, kuanzia pakiti ya data ya soko inapofika kwenye mfumo hadi agizo linalolingana linapotumwa nje, ni matokeo ya pamoja ya tabaka nyingi: scheduler ya mfumo endeshi, interrupts, kernel housekeeping, page faults, tabia ya TLB, cache locality, mtiririko wa udhibiti wa C++, ugawaji wa kumbukumbu, thread synchronization na rundo la itifaki za mtandao.

Utafiti wa Khalid Mohammad unachunguza tabaka hizi kwa microbenchmarks na kuuliza ni chaguo zipi za muundo hupunguza ucheleweshaji wa kawaida, na zipi huathiri tail latency, yaani miruko ya ucheleweshaji inayotokea mara chache lakini inaweza kuwa mikubwa sana.

Hitimisho kuu ni kwamba hakuna “uboreshaji bora mmoja.” Real-time scheduler hupunguza median wakeup latency, lakini haiwezi kuondoa tail za kina peke yake. CPU isolation katika kiwango cha kernel, kutenganisha RCU/workqueue na interrupt steering hukaza p99.9 na p99.99 kwa nguvu zaidi.

Kwa upande wa kumbukumbu, kupopulate kurasa mapema badala ya kuruhusu page fault katika mguso wa kwanza kulishusha gharama ya first-touch ya karibu 2 µs hadi karibu 20 ns. Explicit 2 MB HugeTLB ilipunguza TLB miss rate kutoka %1,33 hadi %0,09 na cycles/access kutoka takribani 290 hadi 43,12 ikilinganishwa na kurasa za 4 KB.

Katika C++, stateless lambda iko karibu na inline function, lakini std::function ilikuwa karibu 5,68× ghali zaidi. dynamic_cast inayotegemea RTTI ilitumia takribani 3,6× cycles zaidi kuliko explicit tagging. Object pool ilitoa takribani 3,7× kasi dhidi ya new/delete ya jumla, huku tail latency ya heap allocation ikibaki juu zaidi.

Data-oriented design inaonyesha kwamba mpangilio wa data unaweza kuwa muhimu kuliko nguvu ya hesabu ya CPU. Sequential access ni takribani 5,35 cycles/access, lakini random pointer chasing ni takribani 378 cycles/access. False sharing iliongeza muda wa majaribio ya nyuzi mbili kwa takribani 7,5×.

Kwenye mtandao, njia ya kawaida ya Linux UDP ililinganishwa na AF_XDP ndani ya network namespace na veth kwenye mashine ileile. Kernel path ilikuwa na mean takribani 200 µs, AF_XDP takribani 8 µs; p50 ilishuka kutoka takribani 218 µs hadi 6 µs. Hata hivyo p99 ya AF_XDP ilibaki karibu 80 µs; kernel bypass haiondoi tail latency yote.

Ujumbe mkuu wa kihandisi ni huu: ucheleweshaji mdogo hautokani na function moja ya haraka, bali na kuondoa kwa mpangilio vyanzo vya kutotabirika kwenye njia muhimu.

Kipimo kikuu katika mifumo ya ucheleweshaji mdogo ni nini?

Katika programu za kawaida, throughput ya wastani inaweza kutosha. Katika HFT, hata mruko mmoja wa ucheleweshaji unaweza kuwa na maana ya kiuchumi. Kwa hiyo mnyororo mzima wa p50 → p99 → p99.9 → p99.99 → maximum latency unapaswa kupimwa.

Je, scheduler pekee inatosha?

Hapana. Katika cyclictest, SCHED_FIFO ni bora kwa wakeup latency ya kawaida kuliko CFS, lakini tail ya kina inahusishwa pia na kernel interference.

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

CPU isolation na interrupt steering

Hata thread iliyopin kwenye CPU maalumu inaweza kukatizwa na timer tick, RCU callback, kernel workqueue au hardware interrupt. Utafiti ulitumia isolcpus, nohz_full, rcu_nocbs, cpuset/cgroup na workqueue relocation ili kuitenganisha core muhimu kwa latency na shughuli za 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
KipimoBila isolationIsolationIsolation + IRQ Steering
p99.91287 µs33 µs40 µs
p99.992673 µs174 µs109 µs
Maximum4673 µs564 µs399 µs

Median hubaki karibu sawa, lakini p99.9 na p99.99 hupungua sana. Hii inaunga mkono tofauti kati ya scheduler kwa latency ya kawaida na isolation kwa ultra-tail.

Page fault, huge pages na VM tuning

Linux hutumia demand paging kwa anonymous memory. Katika jaribio la 512 MB anonymous mapping kulionekana takribani 131.000 minor page faults, na gharama ya mguso wa kwanza ilikuwa takribani 2 µs kwa ukurasa. MAP_POPULATE ilishusha first access katika steady-state hadi karibu 20 ns.

Muundo wa ukurasaCycles / AccessdTLB Miss Rate
4 KB≈290≈%1,33
Transparent Huge Pages≈241≈%0,47
Explicit HugeTLB 2 MB43,12%0,09

Explicit HugeTLB hupunguza cycles/access kwa takribani 6–7×. THP inaweza kuzalisha tail spike za millisecond kwa sababu ya collapse, split na memory compaction.

PercentileDefaultBaada ya VM tuning
p5092 µs30 µs
p99204 µs556 µs
p99.94415 µs4898 µs
p99.997630 µs7076 µs
Maximum9230 µs8013 µs

Median huboreka, lakini p99 na p99.9 huzorota. Kwa hivyo runtime allocation katika hot path ni hatari; preallocation ni salama zaidi.

Mitigations, C-state na C++

KipimoMitigations ONMitigations OFF
Raw syscall2850 cycles306 cycles
libc syscall2815 cycles278 cycles
Context switch24.301 cycles14.829 cycles
sched pipe7,76 µs/op4,76 µs/op

Kuzima mitigations hupunguza gharama ya syscall na context switch, lakini kunaweza kuongeza hatari za usalama za speculative execution; si pendekezo la jumla kwa mifumo ya kawaida.

Halip99p99.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
DispatchAina 1Aina 4Aina 8
Static1,32 ms8,75 ms10,02 ms
Virtual1,94 ms9,19 ms10,38 ms

Virtual dispatch ina gharama, lakini si kila virtual function ni mbaya; ABI-stable interfaces, plugins na cold path bado zinaweza kuhitaji dynamic polymorphism.

Muundo wa moveWall Time
noexcept move101,6 s
non-noexcept move263,4 s

noexcept haiongezi kasi kila mahali, lakini katika std::vector reallocation inaweza kuzuia fallback ya copy na kutoa tofauti ya takribani 2,6×.

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

std::function ni ghali kwa sababu ya type erasure na indirect dispatch. dynamic_cast pia ilitumia zaidi kuliko explicit tagging.

PGO, allocation, cache na concurrency

KipimoBaselinePGO
Execution Time1,791 s1,766 s
Cycles6,20 B6,11 B
Instructions12,77 B11,07 B
LLC Load Misses419 K398 K

PGO ilitoa faida ndogo ya takribani %1,4, lakini maboresho madogo yanaweza kujikusanya katika production hot path.

OperesheniMedianp99.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 inaonyesha faida kubwa hasa katika tail. Sequential array ni ≈5,35 cycles/access, random pointer chasing ni ≈378 cycles/access, tofauti ya karibu 70×.

Aina ya ufikiajiCycles / Access
Sequential array≈5,35
Random pointer chasing≈378

Kutenganisha hot/cold data kulishusha muda kutoka 1,08746 s hadi 0,91845 s na cache misses kutoka 7,8×107 hadi 3,5×107. False sharing ilikuwa 4,16 s, cache-line padded 0,55 s.

MpangilioCyclesMuda
False sharing2,73×10104,16 s
Cache-line padded3,61×1090,55 s

AoS ilichukua takribani 258 ms, SoA 145 ms. SIMD scalar ilikuwa 406 ms, AVX 370 ms; faida ni karibu %7.

Opereshenip50p99.9p99.99
Lock Push8017.78532.115 cycles
Lock-Free Push47294378 cycles
Lock Pop8112.95846.048 cycles
Lock-Free Pop25226278 cycles

Lock-free iliboresha tail katika SPSC ring buffer, lakini katika contention kubwa CAS retry inaweza kusababisha cache-line ping-pong na kuwa mbaya kuliko mutex.

AF_XDP

Njia ya kawaida ya Linux ni NIC → Driver → sk_buff → IP/UDP Stack → Socket → System Call → User Space. AF_XDP huondoa sehemu kubwa ya njia hiyo: NIC → XDP → AF_XDP → UMEM → User Space.

Njia ya mtandaoMeanp50p99
Kernel Stack≈200 µs≈218 µs≈300 µs
AF_XDP≈8 µs≈6 µs≈80 µs

Jaribio hili lilifanywa katika namespace/veth kwenye mashine moja; halipimi latency halisi ya mwisho-hadi-mwisho ya production HFT network.

Njia na dokezo la chanzo

KipengeleMazingira yaliyotumika
CPUIntel Core i5-6500 @ 3,20 GHz
Core4 core / 1 thread per core
RAM3,7 GiB
NUMANode moja
Linux kernel6.8.0-90-generic
CompilerGCC 13.3.0
Default build-O2
CPU governorperformance

Kichwa asili: Design Choices in Low-Latency C++ Systems: Empirical Insights with Applications to High-Frequency Trading

Mwandishi: Khalid Mohammad. Taasisi: Department of Computer Science, Indian Institute of Technology Kharagpur. Tarehe: 3 Aprili 2026; SSRN upload: 17 Aprili 2026; SSRN ID: 6513601; DOI: 10.2139/ssrn.6513601.

Aina ya uchapishaji: Preprint. Matokeo yanategemea mfumo mmoja wa Intel i5-6500 na matoleo fulani ya Linux/GCC; AF_XDP ilipimwa katika namespace/veth; utafiti haupimi trading alpha, utabiri wa soko au mapato ya mkakati.


Shiriki:

Maoni huchapishwa baada ya kukaguliwa.Maoni yako yatapitia mchakato wa idhini na yataonekana yakikubaliwa.

Acha maoni

Anwani yako ya barua pepe haitachapishwa. Sehemu za lazima zimewekewa alama ya *

Your experience on this site will be improved by allowing cookies Cookie Policy