标准答案
- 多进程利用多核并隔离故障,但每个进程都有自己的缓存、连接池和内存。
- 线程适合阻塞 I/O,协程适合非阻塞 I/O;混合模型要隔离阻塞资源。
- 数据库总连接数约等于实例数乘以每实例池上限,必须服从数据库容量。
- 用 P99、队列等待、连接池等待、CPU、RSS 和下游错误率调整配置。
题目解析
多进程 worker 通常各自拥有解释器、缓存和连接池;线程共享进程内存,但会受到锁和运行时调度影响;协程只有在主动让出控制权时才允许同一事件循环处理其他任务。因此“并发数”不是一个单独的配置,至少要和 CPU、执行器、数据库连接、HTTP 连接、内存以及请求队列一起看。
连接池的总上限应按实例数计算。例如每个实例有 4 个进程、每个进程池上限 10,集群 6 个实例时理论上可能申请 240 个数据库连接,还没有算管理连接和迁移任务。这个数字必须小于数据库和代理的可用预算,并为突发、故障转移和其他服务留余量。
调优应从 P95/P99、排队时间、池等待、CPU、RSS 和下游延迟入手。CPU 不高但池等待很高时,增加 worker 可能只会放大下游压力;事件循环延迟升高时,应先找阻塞调用,而不是盲目增加协程数量。
常见误区
- 误区:所有服务都按 CPU 核数设置同样的 worker。改正:分别测量 CPU 密集、阻塞 I/O 和异步 I/O 的瓶颈,再用压测和下游预算确定组合。
- 误区:每个进程都创建一个没有上限的连接池。改正:计算实例数乘进程数乘池上限,并为连接获取设置等待超时和降级策略。
- 误区:在异步 worker 里直接调用同步客户端。改正:换用异步客户端,或明确把同步调用放到有界线程池并监控其队列。