抱歉,我没有足够的声誉来使用评论,所以我必须发布一个新的答案来提供任何意见。
OP 正在询问有关http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/http/server3/的具体问题。这是一个示例 http 服务器,它启动一个线程池来处理 http 请求。
OP 的原始问题可能会被重述:“给定具有一组资源 A 的服务器机器和每个请求消耗 B 资源的工作负载,我应该在线程池中分配多少线程?”
这里有一个线程:Reasonable number threads for thread pool running web service requests进行了类似的讨论(关于 Java 线程池),但该讨论似乎没有得出任何结论性的答案。
这是我在学校学到的“老式 1970 年代大型机风格”容量规划的简短教程示例:http ://www.cs.umb.edu/~eb/goalmode/primer.pdf 。
在这种情况下,您可能会创建一个简单的模型,例如:
You have an average rate of requests arriving, X. For each request you are consuming a certain average amount of cpu (in units of time) S_c, and an average amount of time spent waiting for disk requests to complete, S_d. So each thread is taking an average time S_c + S_d before it is returned to the thread pool. (You would need to measure this.) Thus on average you would expect that you would need at least N = X * (S_c+S_d) threads to avoid incoming threads queueing at an empty thread pool. You might actually want to allocate some small multiple of N (e.g. 3N) threads to be able to deal with bursts of one kind or another.
但是池中的线程数并不是真正有趣的限制。有趣的限制是您可用的 CPU 总量或磁盘带宽总量。假设每个请求需要 3 秒的 CPU 处理时间,并且您有一个具有 12 个内核的系统。因此,在任何 3 秒时间段内,您应该期望同时处理 12 个请求。因此,大于每秒 12/3 = 4 个请求的平均到达率会使您的 CPU 饱和。(磁盘带宽的类似计算。)
所以你最终要弄清楚的是:给定我预期的请求到达率 X,以及每个请求消耗的 CPU 和磁盘量,我应该购买多少 CPU 和磁盘?