最高效的高性能服务器套接字/线程设计

Most Efficient High-Performance Server Socket/Thread Design

本文关键字:线程 套接字 服务器 高效 高性能      更新时间:2023-10-16

我正在构建一个非常高性能的企业软件,它将每秒接收、处理和响应50000多个TCP请求。这将分布在许多亚马逊EC2服务器上,但我希望单个服务器能够每秒处理尽可能多的千个请求(每秒5公里)。我很可能会使用运行AmazonLinux的m1.xlarge实例。

我正在用Boost ASIO用C++构建这个软件,我正在努力找出架构套接字处理的最有效方法。在示例中(http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html)我倾向于模仿"HTTPServer2",因为我们将有多个vCPU供员工使用。

有人能真正描述一下每个HTTP服务器示例的优缺点吗?以及处理这么多连接的情况吗?我真的很感激任何其他见解(关于Boost套接字和/或高吞吐量EC2配置)。

非常感谢!

一些建议:

你没有提到你的服务器要做什么。它是每秒接受和关闭50万个新请求,还是仅仅为来自已建立的TCP连接的消息(请求)提供服务。所以我的建议可能有点笼统。

  1. 阅读C10K问题:http://www.kegel.com/c10k.html

  2. 投资使用epoll作为套接字通知解决方案,而不是ASIO。epoll并不难。

  3. 考虑使用固定数量的线程(2-8)。负载平衡这些线程之间的套接字连接,或者只使用线程的工作池来服务从套接字线程解析的请求消息。为多个线程设计,但从只使用一个线程开始。然后解决所有性能问题。一旦单线程解决方案运行良好,并且性能达到峰值,就可以考虑增加线程数,以便在阻塞其他线程的同时处理多个操作。

  4. 服务器的性能问题很可能会超出套接字设计的范围。不断地对valgrind等工具进行基准测试和运行,以了解代码的大部分时间都花在了哪里。可能性很高,这是你最意想不到的地方。例如,在我的服务器上,我发现大部分时间都花在了为小的临时缓冲区分配和释放内存上。我从来没有猜到。然后我改变了服务器的设计,提前分配内存,使用堆栈内存等…这样处理请求就不需要代码来分配内存。当我做出这样的改变时,性能很容易翻倍。

您可能需要研究非阻塞套接字,并将输入/输出/处理分散到不同的线程中。可能每千个连接创建3个新的输入/输出/处理线程?

希望能有所帮助。