单机扛万级连接需I/O多路复用+Reactor模式+线程池,集群扩展依赖负载均衡、服务拆分与状态分离;主从Reactor避免锁竞争,耗时操作须剥离至线程池异步执行。

高并发服务器搭建不是堆硬件或调几个参数就能解决的事,核心在于架构选型、资源调度和关键瓶颈的针对性处理。直接上结论:单机扛万级连接靠 I/O 多路复用 + Reactor 模式 + 线程池,集群扩展靠 负载均衡 + 服务拆分 + 状态分离。
选对模型:别用线程/进程硬扛连接
一个连接开一个线程(thread-per-connection)在几百连接时还行,到几千就明显卡顿——线程切换开销大、内存占用高、容易触发系统限制。
- 用 epoll(Linux)或 kqueue(macOS)代替 select/poll,支持十万级 fd 监听,事件通知零拷贝
- 采用主从 Reactor 模式:主线程只做 accept 和事件分发,子线程各自持有独立 event loop 处理读写,避免锁竞争
- 耗时操作(如数据库查询、JSON 解析)必须剥离出 Reactor 线程,扔进线程池异步执行,防止阻塞整个事件循环
调优关键项:系统与代码层面都要动
很多项目跑不起来,不是逻辑错,是默认限制太保守。
宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
- 修改 ulimit -n 至 65535 或更高,否则 open files 不够用,epoll_wait 会失败
- 关闭 TCP 延迟确认(TCP_NODELAY),对实时性要求高的服务(如聊天、游戏)能减少 200ms 级延迟
- 启用 SO_REUSEPORT,让多个 worker 进程/线程可同时 bind 同一端口,内核自动负载均衡新连接
- 连接空闲超时设为 60–120 秒,既防长连接占资源,又避免频繁重连开销
走向生产:单机稳了再考虑横向扩展
没压测过单机性能,就急着上 Kubernetes 或分库分表,反而引入更多不稳定因素。
- 先用 wrk 或 go-wrk 对单节点压测,看 CPU、网络、文件描述符哪一项先打满,再针对性优化
- 无状态服务才适合水平扩展,用户会话、登录态等必须抽离到 Redis 等共享存储
- 前端加一层 Nginx 或 Envoy 做负载均衡,用 least_conn 或 consistent hash 路由策略,避免某台机器过热
- 日志统一收集(如 Filebeat → Kafka → ELK),不要让每个进程自己写磁盘,IO 会成为隐形瓶颈
协议与业务解耦:别把 HTTP 当唯一出口
高并发不等于“只能做 Web”。HTTP 是方便调试,但不是最优选择。
- 内部服务间通信用二进制协议(如 Protobuf + gRPC),序列化/反序列化更快,头部更小
- 实时推送场景(消息、通知)优先用 WebSocket 或自定义长连接协议,比轮询 HTTP 效率高 10 倍以上
- 静态资源(图片、JS、CSS)坚决交给 CDN 或 Nginx 静态服务,别让业务进程处理字节流

















