Appearance
百万 QPS TCP Echo 系统 — 从零到百万连接
不预设优化,不提前调参。 先写出能跑的 TCP Echo 服务,再在压测中逐个撞上瓶颈,每个瓶颈都是一次诊断—定位—修复的完整闭环。
架构总览
| 层级 | 服务 | 用途 | 覆盖维度 |
|---|---|---|---|
| L1 | 裸 echo | 收发原样返回,零业务干扰 | FD 上限、连接承载、内核协议栈 |
| L2 | 带计算 echo | 收发 + 可调 CPU 运算权重 | perf 微架构分析、CPU/网络混合瓶颈 |
| L3 | 流式分包 echo | 帧协议拆包 + 粘包处理 | TCP 流式语义、缓冲区管理 |
层级正交独立,可单独实验。详细设计见 架构设计文档。
学习路线(8 阶段 × 30 天)
| 阶段 | 天数 | 撞上的问题 | 详情 |
|---|---|---|---|
| 1. 写出 Echo | Day 1-3 | TCP socket 编程,从 localhost 到云主机 | → |
| 2. 多线程扩展与 FD 上限 | Day 4-6 | 单线程 epoll 触顶 → 多线程扩展;主动降档实测撞 FD 墙 | → · 阶段小结 |
| 3. TCP 参数 | Day 7-9 | 建连超时、端口不够、缓冲区不足 | → |
| 4. CPU/软中断 | Day 10-12 | 流量上来后单 CPU 打满 | → |
| 5. NUMA 深入 | Day 13-16 | CPU 分布不均衡 → 发现 NUMA | → |
| 6. 百万连接 | Day 17-23 | 20→50→100→500→1000K 逐级爬升 | → |
| 7. 短连接 | Day 24-27 | TIME_WAIT 爆炸、端口耗尽 | → |
| 8. 进阶复盘 | Day 28-30 | L2/L3 echo + 全链路闭环 | → |
每日执行详情见 Day 1: TCP Echo 从零,后续每日文档在各
day-NN/README.md中。
快速开始
bash
# 阶段 1 开始:一台干净的 CentOS Stream 9 云主机,只安装了 gcc/make
cd /opt/echo/src && make all
# L1 裸 echo 验证
./bin/echo-server --port 9090 --workers 1 &
./bin/echo-client --server 127.0.0.1 --port 9090 --conn 10 --mode long关键文档
| 文档 | 内容 |
|---|---|
| 总纲 | 学习目标、硬件环境、问题驱动理念 |
| 架构设计 | 三层代码架构、组件图、内存模型、时序图 |
| Day 1 代码 | 起步代码、编译步骤、迭代计划 |
| Day 1 深入原理 | 原理索引:socket/bind/listen 内核实现、sk_buff、MSS/Nagle/cwnd、read() 不可预测(4 篇独立文档) |
| Day 2 基线 | 导航 + 知识篇(架构/LT vs ET/SO_REUSEPORT/压测工具)+ 实验篇(短跑/长跑/syscall/4核对照/五层归因) |
| Day 3 长连接 | 导航 + 5 篇小实验(QPS 对比/LT vs ET/连接数扫描/strace 实证/跨网络) |
| Day 0-3 小结 | 阶段 1 复盘:四天瓶颈接力、QPS 从 ~1K 到 53.5K 的两步跃迁、方法论沉淀、Day 4 入场券 |
| Day 4 多线程 epoll | 导航(拆机线 v1→v2→v3 + FD 线):v1 同机基线(线程数扩展、多线程下 LT vs ET、连接数扫描)→ v2 拆机(8 vCPU 客户端 → 69 万)→ v3(32 vCPU → 253 万,协议栈瓶颈);FD 墙实测:降档撞墙(QPS -50%、P999 588ms) |
| 分析指南 | 分层定位法、5 大场景排查、命令速查 |
| 阶段 2 小结 | 阶段 2 阶段性复盘:三条主线结论、交付物地图、下一步方向(阶段 3) |
一句话总结:8 阶段 × 30 天问题驱动——先撞墙再找路,从 TCP socket 编程到百万长连接全链路闭环,每个优化都有根有据。