交易系统性能衡量
TTT 和 RTT 各量哪一段,为什么要报 p50、p99、p999 而不是平均值,在线程边界打点怎么看出时间花在处理还是排队,以及量级表怎么拿来做延迟预算。
最新
TTT 和 RTT 各量哪一段,为什么要报 p50、p99、p999 而不是平均值,在线程边界打点怎么看出时间花在处理还是排队,以及量级表怎么拿来做延迟预算。
TSC 读到的是什么、什么时候读到、在哪个核上读到,热路径上打点该怎么记,以及 tick 怎么换算成 ns:频率从哪来、怎么自己校准。
从一把锁到多生产者:阻塞队列的条件变量和丢失唤醒,rte_ring 的两对下标和按顺序发布,Disruptor 的可用标记,以及队列满了该阻塞、丢弃还是覆盖。
wait-free 不是更快的 lock-free:它把 CAS 失败从“再来一次”变成“我排在你后面”,每个线程的步数因此有了上界,代价是更多原子操作和更难写对的代码。
先用 stat 看总账,再用 record 和 report 找到占 98% 样本的函数,最后用 annotate 看到样本全落在加法后面一条指令上:那是一条一环扣一环的加法链,拆成四路就快了 3.3 倍。拿不到硬件计数器时,cpu-clock 采样照样能用;报告里只剩地址,先查符号表和程序所在的路径。
自旋锁快不快,看等锁的核在干什么:每次都读改写,就把锁所在的行抢来抢去;先读后抢、循环里加 PAUSE、抢输了退一步,等的时候才几乎不打扰持锁的核。
一条行情要碰 140 条缓存行,时间大多花在等它们。四步改的都不是计算,是数据什么时候到、到哪一层、在谁手里:让缺失同时在路上,提前要下一批,交出读一次就没用的行,跨核交接时少读一次,把要给对面读的行先放进 L3。
基类写流程、子类填细节,虚函数在运行时选,CRTP 在编译期选。省下的不只是一次间接跳转:调用能整个内联,对象里也没有 vptr。代价是 Base 和 Base 毫无关系,放不进同一个容器。