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

ran*_*its 10 ruby activerecord ruby-on-rails jruby

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

The max pool size is currently 5; consider increasing it

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

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

sbr*_*ges 13

这里开始,

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

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

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

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