标准答案

  1. 连接池大小受对端并发、连接建立成本、空闲超时和文件描述符限制,连接借出期间可能还在等待数据库或网络。
  2. 线程池大小受 CPU、栈内存和阻塞时长限制;线程可能在等待连接池,形成嵌套排队。
  3. 协程本身成本较低,但每个协程仍可能占用连接、缓冲区和业务对象,不能脱离下游容量无限创建。
  4. 排查要画出请求、执行槽、连接和下游之间的等待链,分别看使用率、等待时间和泄漏。

题目解析

连接池、线程池和协程池控制的是不同资源。线程池中的一个任务可能同时占用线程、数据库连接和 HTTP 连接,任何一层不足都会形成嵌套排队,单看某个池的利用率会误判瓶颈。

协程创建成本低不代表业务工作免费。大量协程仍会保留栈、上下文、缓冲和引用,并可能同时争抢同一个下游;需要用信号量或窗口限制在途工作。

排查应沿着请求的生命周期记录每一段等待:获取执行槽、获取连接、等待锁、等待远端和释放资源。只有把等待链对齐,才能判断是该缩小池、扩大池还是修复泄漏。

常见误区

  • 误区:所有池使用同一个数字。改正:根据 CPU、连接上限、任务耗时和下游容量分别设置,再计算全局上限。
  • 误区:只调大连接池解决线程等待。改正:先确认线程是否在等待连接、连接是否在等待慢下游,盲目加大只会转移排队。
  • 误区:异常路径不释放连接。改正:使用明确的 acquire/release 或上下文管理,并对连接泄漏和最大持有时长告警。

作者信息