哪些因素应该决定我的 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 更适合测试多核服务器:

客户端的单个线程不能使多个线程饱和 服务器(当服务器速度很快时)。

您可以将ABweighttp 给出的结果与这个公共域ab.c wrapper 进行比较,这个ab.c wrapper 已用于测试30 多个Web 服务器、缓存服务器和应用程序服务器。

作为奖励,ab.c 除了每秒请求数之外,还会收集 RAM 和 CPU 资源使用情况。

【讨论】:

以上是关于哪些因素应该决定我的 C++ 网络服务器上的线程数?的主要内容,如果未能解决你的问题,请参考以下文章

我的工具箱中应该都有哪些现代 C++ 库? [关闭]

在决定要开发的 iOS 版本时应考虑哪些因素?

windows一个进程中的最大线程数与哪些因素有关

服务器性能由哪些方面决定

服务器性能由哪些方面决定

决定网站空间访问速度的因素有哪些