尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

低延迟系统

低延迟系统 低延迟系统低延迟系统三板斧尽量绕开内核用户态网卡、大页、绑核隔离 CPU减少系统调用避免动态内存分配预分配内存池追求 CPU 缓存友好减少锁与调度抖动多用 SPSC 无锁队列线程职责单一阻塞 IO 全部移出热路径维度Metropolis低延迟JockeyClub云/固收行情入口FPGA/Binary/Nano 直连CFETS、CSV、HTTP 等总线AMI 共享内存Kafka / RabbitMQ策略循环busyloop 忙等更偏云服务编排CPU绑核、按 channel 分配一般不强调目标微秒毫秒级抢价可靠投递、业务完整无锁队列无锁队列不使用std::mutex互斥锁依靠CASCompare‑And‑Swap比较并交换CPU 硬件原子指令实现多生产者、多消费者线程安全。重点无锁≠无等待很多无锁队列是忙等待自旋CPU 会空转。金融低时延系统大量用在事件总线、报文收发线程之间比如华泰大象内部消息总线。队列主要用在哪ktrbuf行情进程内缓冲、UI/RPC、落库 SQL、日志旁路ktshm_topic行情 SHMmd2mem、成交trade2mem→策略ktshm_pipe策略消息管道trade2mem↔策略CPU 绑核cpubind -f cpubind.ini → /dev/shm/cpu.bind白名单 ​ 策略 is_low_latency1 is_bind_cpu1 → busyloop 启动 → ktbind_trylockf 抢核 → sched_setaffinity ​ EFH qsi → channel_cpu / recv_cpu 直接绑收包线程机制解决什么关键 API共享内存核池哪些核允许给业务用mmap/cpu.bindcpu_for_bind文件锁互斥多进程不抢同一核lockf(F_TLOCK)按核号锁文件区间affinity 绑核线程固定在已抢到的核上跑sched_setaffinity假设cpu_for_bind0|1|2起两个策略实例cpubind 写好核0,1,2 标记为 1 ​ 实例A busyloop: ​ 试核0 → lockf 成功 → affinity(0) → 停 ​ 实例B busyloop: ​ 试核0 → lockf 失败 ​ 试核1 → lockf 成功 → affinity(1) → 停 ​ 实例C: ​ 0、1 都被锁 → 试核2 → 成功 → affinity(2) ​ 再来一个: ​ 0/1/2 都锁失败 → 打印 bind core try failed继续跑但不绑核先划池 → 再互斥占坑 → 最后把热线程钉死在坑上减少迁移和互相抢核带来的抖动。侵入式链表场景链表头节点一句话策略循环app._loopcbr__LoopCbrT每圈调用已注册钩子持仓成交Posi._headTradeChainT仓位下挂成交明细持仓跟行情PosiMDSub._headPosi._slink一票多仓扇出交易回调pf._ordcbr等OrderCbrT等观察者模式广播行情订阅mdsub._headsubnode_t一合约多订阅者内存池对象池对象池ktcache实现ktcache_allocate先从_gc空闲表取没有再扩 trunkktcache_return放回空闲表。业务用法位置池子对象mdsub/appmd.cc_sncah/_mdcah行情subnode、mdsubqgposi_ordcah/_qrdcah活动订单LiveOrderT、报价LiveQuoteT成交完returnqgui_rcah/_ecah/_bcahRPC、事件注册等 UI 对象bric/gftimer.cc_tmcache定时器节点ctp_qsi/femas_qsi等_instscache合约映射ktmd内存池ktheap实现当前 trunk 上_cused往前推不够再malloc新 trunk。适合「加载后常驻、生命周期跟模块一致」的数据。业务用法位置heap用途qgappapp._memheap回调节点__LoopCbrT等RegisterLoopCallbackqgposipf._heapPosiT、SpeedStkT、TradeChainT、保证金、ETF 成分…启动灌库 运行中扩仓amibus/ 各*_qsi_heaptopic 名、合约信息等字符串/小结构ddop/qguisession_heapSQL 串、条件串等ktjson解析用 heapJSON 对象节点行情和成交回报的消息总线AMI低延迟消息总线kafka高吞吐量消息总线AMIMetropolisKafkaJockeyClub定位低延迟消息中间件高吞吐、可持久化日志典型部署同机/局域网常独立集群落盘一般不强调持久化队列默认落盘、可回放分布式锁MetropolisJockeyClub后端Redisrlock/ Redlock 风格etcdelock_*用途单例、主从选举、QSI 互斥同样偏主从 / 高可用互斥配置MSLOCK/REDLOCK RedisETCDLOCK.host/master_lockRedis 锁Metropolisetcd 锁JockeyClub一致性弱一些分区/主从切换时有误判风险Raft 共识领导选举语义更稳延迟通常更低通常更高一点可接受锁不在热路径运维你们本来就有 Redis接入便宜要单独维护 etcd 集群适合已有 Redis、能接受偶发双主再靠业务兜底云/多副本 HA强调「同一时刻只有一个 master」策略热路径行情和交易走 busyloop 心跳监控走slowloop用 CPU 换延迟低延迟双循环普通单循环行情/成交检测热线程忙等轮询同一循环里跑还usleep(200)日志/DB/心跳慢线程usleep(1000)和热路径混跑CPU热核接近打满更省 CPU典型延迟轮询间隔 ≈ 几圈空转时间µs 级至少被 sleep 钉在百微秒毫秒用户态网卡中间件延迟FPGA 专卡路径 ≤或明显低于DPDK 收包路径 ≪ 内核 TCPBinary/Nano路径I/O 方式FPGAEFH厂商自研 PCIe 驱动DMA → mmap ring → 用户态 APIi_efh_*不是 DPDK PMDBinarysse_binary_qsi等普通 TCPktsocket_connectrecv()Nanonano_qsi同样普通 TCPktsocket_connectrecv()路径实际对接覆盖EFH盛立 FPGAefh_sse_qsi/efh_sze_qsi上交所、深交所Binary交易所 MDGW TCPmdgw_ip/dest_host同样偏沪深但是官方网关协议Nano内部 Nano 服务TCP AES结构带OpenInterest/ 结算价期货类行情CTP 风格深度DPDK传统 socket 网络流程普通程序vnpy 普通网关应用程序 → 系统调用 (socket recv) → Linux 内核协议栈 → 网卡硬件报文到达网卡触发硬中断内核拷贝报文到内核缓冲区用户态再把数据从内核拷贝到应用内存有多次内存拷贝、中断、内核调度带来延迟与抖动P99 毛刺高。开销来源中断、内核‑用户态内存拷贝、协议栈处理、内核调度。DPDK 工作方式网卡被 DPDK 接管网卡报文直接送到应用程序的用户态内存绕过 Linux 内核协议栈。网卡驱动 DPDK‑PMD报文 DMA 直接写入用户态内存没有内核态、没有系统调用 recv ()应用程序循环轮询 (poll) 报文程序直接解析原始二层报文。⚠️DPDK不实现完整 TCP 协议DPDK 只负责拿到原始以太网帧TCP/UDP 要自己在应用层实现或者用第三方用户态协议栈。
返回列表