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

时间:2013-06-28 18:38:07

标签: c++ sockets boost amazon-ec2 boost-asio

我正在构建一个极其高性能的企业软件,它将接收,处理和响应每秒超过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配置)。

非常感谢!

2 个答案:

答案 0 :(得分:6)

一些建议:

您没有提到您的服务器将要执行的操作。它是每秒接受和关闭50K新请求,还是仅仅为已建立的TCP连接提供消息(请求)。所以我的建议可能需要一点点通用。

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

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

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

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

答案 1 :(得分:0)

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

希望有所帮助。

相关问题