哪些因素应该决定我的 C++ 网络服务器上的线程数?
Posted
技术标签:
【中文标题】哪些因素应该决定我的 C++ 网络服务器上的线程数?【英文标题】:What factors should decide the number of threads on my C++ webserver? 【发布时间】:2011-12-09 23:31:49 【问题描述】:我了解通常工作线程的数量应等于服务器上的 CPU 数量(在我的情况下为 8),除非线程正在执行某种 I/O 等操作。
我的网络服务器提供的服务需要在我的 mysql 数据库中进行广泛搜索,在最坏的情况下,一些查询大约需要 16 秒。所以这里有两个问题, 1. 如何确定最佳线程数? 2. 如何模拟数千个用户并针对数千个请求测试我的服务器?
【问题讨论】:
“最坏情况下为 16 秒”平均值?客户数量? @curiousguy 平均 5-6 秒。每秒应处理至少 2000 个客户端。 【参考方案1】:这取决于你对“线程”的定义。
如果您的线程处于“阻塞”状态......因为它们一次只处理一个客户端——8 个线程将是一个糟糕的选择。如果您的工作线程都执行非阻塞 I/O,那么是的,将线程与 cpu 计数匹配将是一个不错的选择。
要考虑的另一件事是您的数据库调用是否是非阻塞的。我不确定您使用哪种语言编写脚本(或者您是否也在使用 C++ 编写脚本?),但例如 Mysql 的 c 版本会阻止查询。
如果您正在寻找巨大的性能,我会看看 nginx 和 G-WAN——它们是该领域的领导者。
http://nginx.org/
http://www.trustleap.com/
另外,对于负载测试:http://httpd.apache.org/docs/2.0/programs/ab.html 或 http://www.hpl.hp.com/research/linux/httperf/
【讨论】:
【参考方案2】:与任何性能测量一样,性能测试确实无可替代。您可以考虑像n * number of CPUs
这样的理论测量,其中n
是一个小常数,但实际上没有替代经验验证的方法。
【讨论】:
【参考方案3】:补充几点:
由于内核之间 CPU 缓存同步的成本,将 HTTP 工作线程限制为 物理 CPU 内核(忽略超线程)是有意义的。
此外,weighttp
(Lighty 团队制作的多线程客户端)比(单线程)ApacheBench
更适合测试多核服务器:
您可以将AB
和weighttp
给出的结果与这个公共域ab.c
wrapper 进行比较,这个ab.c
wrapper 已用于测试30 多个Web 服务器、缓存服务器和应用程序服务器。
作为奖励,ab.c
除了每秒请求数之外,还会收集 RAM 和 CPU 资源使用情况。
【讨论】:
以上是关于哪些因素应该决定我的 C++ 网络服务器上的线程数?的主要内容,如果未能解决你的问题,请参考以下文章