针对 Boost ASIO 的设计,用于 Web 服务器的工作线程 SQl 查询'practical'
Design for Boost ASIO , Worker threads SQl queries for 'practical' web server
我正在寻找解决方案,开发一个高效的web服务器框架,其中:
- 一个或几个IO线程处理客户端HTTP连接和TCP IO。
- 多个线程进行业务处理(SQL查询,文件IO等)
我看到的所有博客解决方案都是用工作线程解决10000个连接,几乎没有业务逻辑(即只是使用async_write
写数据)。是助推。Asio的HTTP服务器3解决我的问题?如果是的话,每个核应该使用多少线程?
我也有兴趣知道HTTP Server 3与mongoose使用的1受体线程+线程池模型相比如何。
对不起,我没有足够的声誉来使用评论,所以我必须发布一个新的答案来提供任何输入。
开口保险单是问一个关于http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/http/server3/的具体问题。这是一个示例http服务器,启动一个线程池来处理http请求。
开口保险单最初的问题可以重述一下:"给定一台服务器机器,它有一组资源a,工作负载每个请求消耗B个资源,我应该在线程池中分配多少个线程?"
这里有一个线程:运行web服务请求的线程池的合理线程数与类似的讨论(关于Java线程池),但该讨论似乎没有得出任何结论性的答案。
下面是我在学校里学到的一个关于"70年代老式大型机风格"容量规划的简短教程:http://www.cs.umb.edu/~eb/goalmode/primer.pdf.
在这种情况下,您可以创建一个简单的模型,如:你有一个请求到达的平均速率,x。对于每个请求,你正在消耗一定的平均cpu量(以时间为单位)S_c,以及等待磁盘请求完成的平均时间S_d。因此,每个线程在返回到线程池之前花费的平均时间是S_c + S_d。(你需要衡量一下。)因此,平均而言,您期望至少需要N = X * (S_c+S_d)个线程来避免传入的线程在空线程池中排队。实际上,你可能想要分配一些N的倍数(例如3N)的线程,以便能够处理这种或那种突发。
但是池中的线程数并不是真正有趣的限制。有趣的限制是可用的CPU总量或磁盘带宽总量。假设每个请求需要3秒的CPU处理时间,并且您有一个12核的系统。因此,在任何3秒的时间内,您应该期望处理12个同时的请求。因此,平均到达率大于每秒12/3 = 4个请求将使您的CPU饱和。(类似计算磁盘带宽)
所以你最终要弄清楚的是:给定我的预期请求到达率X,以及每个请求消耗的CPU和磁盘量,我应该购买多少CPU和磁盘?
在研究了大部分选项之后,我几乎得出了结论
一个线程的epoll
业务逻辑池
C] IO线程之间的队列;池
D] IO线程之间的管道&为写数据唤醒IO线程的池
E]接受;客户端读取&写操作由IO线程完成
我猜ngix &
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 异常属于C++中的线程还是进程
- C++中的线程安全删除
- C++使用params创建线程函数会导致转换错误
- 类与私有变量的其他类之间的线程安全性
- CoInitialize()在单独的线程上崩溃而不返回
- c++中的线程池
- 线程之间的布尔停止信号
- 为什么std::async使用同一个线程运行函数
- 来自 C++ 的线程安全 SQL Server
- sql模块和多线程应用程序
- 针对 Boost ASIO 的设计,用于 Web 服务器的工作线程 SQl 查询'practical'