20

我正在构建一个非常高性能的企业软件,它将每秒接收、处理和响应超过 50,000 个 TCP 请求。这将分布在许多 Amazon EC2 服务器上,但我希望单个服务器能够每秒处理尽可能多的请求(以 5k/秒的速度拍摄)。我很可能会使用运行 Amazon Linux 的 m1.xlarge 实例。

我正在使用 Boost ASIO 用 C++ 构建这个软件,并且我试图找出构建套接字处理的最有效方法。在示例(http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html)中,我倾向于模拟“HTTP Server 2”,因为我们将拥有多个 vCPU员工。

有人可以真正描述那里每个 HTTP 服务器示例的优缺点,并处理这么多的连接,我真的很感激任何额外的见解(关于 Boost 套接字和/或高吞吐量 EC2 配置)。

非常感谢!

4

2 回答 2

8

一些建议:

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

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

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

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

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

于 2013-06-29T07:51:36.590 回答
0

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

希望有帮助。

于 2013-06-29T06:20:25.117 回答