哪些因素应该决定我的c++ web服务器上的线程数

What factors should decide the number of threads on my C++ webserver?

本文关键字:服务器 web 线程 c++ 我的 决定      更新时间:2023-10-16

我理解通常工作线程的数量应该等于服务器上的cpu数量(在我的情况下是8),除非线程正在做某种I/O等。

我的web服务器提供的服务需要在我的mysql数据库中进行广泛的搜索,一些查询在最坏的情况下需要大约16秒。这里有两个问题,1. 如何确定最优的线程数?2. 如何模拟数千个用户并针对数千个请求测试服务器?

这取决于你对"线程"的定义。

如果你的线程"阻塞"…因为它们一次只能处理一个客户端——8个线程将是一个糟糕的选择。如果你的工作线程都做非阻塞I/O,那么是的,将线程与cpu计数匹配将是一个不错的选择。

另一件要考虑的事情是你的DB调用是否是非阻塞的。我不确定你在做什么语言的脚本(或者你在c++做吗?),但C版本的Mysql,例如阻塞查询。

如果你正在寻找巨大的性能,我会看看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/

对于任何性能度量,性能测试都是无可替代的。你可以考虑像n * number of CPUs这样的理论测量,其中n是一个小常数,但实际上没有什么可以代替经验验证。

附加说明:

由于内核之间CPU缓存同步的成本,将HTTP工作线程限制在物理 CPU内核(忽略超线程)是有意义的。

此外,weighttp(由Lighty团队制作的多线程客户端)比(单线程)ApacheBench更适合测试多核服务器:

  • 客户端的单个线程不能使多个线程饱和

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

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