10

我正在运行 JRuby on Rails 应用程序。我在日志中随机看到了很多这样的内容:

The max pool size is currently 5; consider increasing it

我知道我可以在我的配置中增加最大池大小来解决这个问题。我要解决的问题是了解最佳数字应该是多少。我试图避免连接的争用问题。显然,将此数字设置为令人讨厌的大数字也行不通。

是否有通用协议可以了解您的应用程序的最佳池大小设置?

4

1 回答 1

13

这里开始

线程池的最佳大小取决于可用处理器的数量和工作队列中任务的性质。在一个工作队列的 N 处理器系统上,工作队列将完全容纳计算密集型任务,您通常会通过 N 或 N+1 个线程的线程池实现最大 CPU 利用率。

对于可能等待 I/O 完成的任务(例如,从套接字读取 HTTP 请求的任务),您需要将池大小增加到超过可用处理器的数量,因为并非所有线程都能正常工作每时每刻。使用分析,您可以估计典型请求的等待时间 (WT) 与服务时间 (ST) 的比率。如果我们将此比率称为 WT/ST,对于 N 处理器系统,您将需要大约 N*(1+WT/ST) 线程以保持处理器充分利用。

处理器利用率不是调整线程池大小的唯一考虑因素。随着线程池的增长,您可能会遇到调度程序、可用内存或其他系统资源的限制,例如套接字数量、打开的文件句柄或数据库连接。

因此,分析您的应用程序,如果您的线程主要受 cpu 限制,则将线程池大小设置为内核数,或内核数 + 1。如果您花费大部分时间等待数据库调用完成,则尝试使用相当多的线程,看看应用程序是如何执行的。

于 2012-05-06T01:08:38.347 回答