Rails应用程序连接池大小,避免最大池大小问题

时间:2012-05-03 16:30:35

标签: ruby-on-rails ruby activerecord jruby

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

The max pool size is currently 5; consider increasing it

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

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

1 个答案:

答案 0 :(得分:13)

来自here

  

线程池的最佳大小取决于可用处理器的数量以及工作队列上任务的性质。在一个工作队列的N处理器系统上,它将保存完全由计算限制的任务,通常可以通过N或N + 1个线程的线程池实现最大的CPU利用率。

     

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

     

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

因此,对您的应用程序进行概要分析,如果您的线程主要是cpu绑定的,那么将线程池大小设置为内核数或内核数+ 1.如果您花费大部分时间等待数据库调用完成,那么尝试使用相当多的线程,并查看应用程序的执行情况。