那个让我脸疼的时刻:Black Friday当天50K RPS,CPU 15%,内存平稳,p95正常。我对着会议室说"这架构能撑一年"——两年后爬到5M RPS时,这句话成了内部梗。
50K时调参数,5M时重新谈判物理规则。每纳秒都是角色,思维从"请求"变成缓存行、队列深度、PCIe通道。内核礼貌微笑,顺手偷走你的周期。
好图表≠好架构
中等负载下,没压到故障模式的系统看起来都很干净。隐藏成本——内存拷贝、上下文切换、冷缓存行——都在,只是声音不够大。直到它们尖叫。
基准测试偏爱快乐路径。百万级生产环境是错位的MTU、突发客户端、意外TLS重协商的集合。某处固件有个怪癖,你的完美假设就会崩塌。
SSL的30%吞吐量税
5M RPS时,30%意味着150万请求/秒花在无法讨价还价的数学上。没法用"氛围"优化指数运算。选择只有三个:卸载、会话恢复,或对加密位置 ruthless。
握手风暴会在最糟糕的日子找到你。
部分故障下的尾延迟悬崖
后端抖动时,朴素算法把重试变成惊群效应。10万时你能注意到,500万时直接点燃。我们学会隔离、阻尼,把"重试"当上了膛的枪对待。
三次推倒重来
第一次:内核网络,经典配置
HAProxy风格,nbproc 4,轮询均衡。够用——直到上下文切换和内核锁成为主角。
第二次:用户态网络,DPDK路径
绕过内核,轮询模式驱动,零拷贝。吞吐量上去了,但NUMA感知缺失和内存池碎片在新尺度下暴露。
第三次:完全重设计
无共享架构,每个核心独立运行。连接亲和性绑定到特定CPU,消除跨核缓存同步。TLS终止前置到专用集群,会话票证缓存跨实例共享。
关键认知:5M RPS时,"更多机器"是第一个谎言。网络带宽、PCIe总线、内存通道成为硬边界。横向扩展之前,先榨干纵向的每个字节。
时间去了哪里
第一次重写以为问题在网络栈。第二次以为在内存分配。第三次才看清:真正的战场是数据局部性和故障隔离的交叉点。
每个请求的路径必须可预测。任何跨核、跨NUMA、跨机架的跳转都是待支付的利息。故障时,系统行为必须 graceful degradation 而非 cascading retry。
监控也从"看图表"变成"读火焰图和PMC计数器"。p99不够,看p99.9和p99.99的抖动模式。异常值不是噪声,是早期信号。
给正在爬坡的人
如果你还在50K RPS,别庆祝太早。现在的平滑曲线是债务,不是资产。趁声音还小,用火焰图找到那些"现在不重要"的拷贝和切换。
负载均衡器的终极形态不是分发请求,而是在物理约束和故障概率之间做最优谈判。5M RPS教会我:规模是透镜,把每个隐藏假设烧到可见。
热门跟贴