最高效的高性能服务器套接字/线程设计
Most Efficient High-Performance Server Socket/Thread Design
我正在构建一个非常高性能的企业软件,它将每秒接收、处理和响应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连接的消息(请求)提供服务。所以我的建议可能有点笼统。
-
阅读C10K问题:http://www.kegel.com/c10k.html
-
投资使用epoll作为套接字通知解决方案,而不是ASIO。epoll并不难。
-
考虑使用固定数量的线程(2-8)。负载平衡这些线程之间的套接字连接,或者只使用线程的工作池来服务从套接字线程解析的请求消息。为多个线程设计,但从只使用一个线程开始。然后解决所有性能问题。一旦单线程解决方案运行良好,并且性能达到峰值,就可以考虑增加线程数,以便在阻塞其他线程的同时处理多个操作。
-
服务器的性能问题很可能会超出套接字设计的范围。不断地对valgrind等工具进行基准测试和运行,以了解代码的大部分时间都花在了哪里。可能性很高,这是你最意想不到的地方。例如,在我的服务器上,我发现大部分时间都花在了为小的临时缓冲区分配和释放内存上。我从来没有猜到。然后我改变了服务器的设计,提前分配内存,使用堆栈内存等…这样处理请求就不需要代码来分配内存。当我做出这样的改变时,性能很容易翻倍。
您可能需要研究非阻塞套接字,并将输入/输出/处理分散到不同的线程中。可能每千个连接创建3个新的输入/输出/处理线程?
希望能有所帮助。
- 接受线程 C++ 套接字中的函数循环
- 关于套接字通信的线程
- 用于线程间通信的 Windows 套接字
- 具有多线程应用程序的 Nanomsg 无阻塞双向套接字
- 套接字发送(.)线程的最佳数量
- 包含线程后C++套接字错误WSAENOTSOCK (10038)
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- 每个线程或每个调用一个 ZeroMQ 套接字
- QSocketNotifier:不能从另一个线程启用或禁用套接字通知程序
- 使用Berkeley套接字的线程通知
- 在多线程HTTP服务器中发送后,如何干净地关闭套接字
- C /Linux:如何编写使用套接字的线程安全库
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- c++系统()挂起,使用netcat连接到不同线程中的套接字
- 访问已传递给线程的套接字
- 提升同一对象上的异步套接字和线程池io_service
- c++tcp多线程客户端/服务器-如何与线程套接字处理程序进行通信
- 多线程套接字超时
- c++多线程套接字无法接收客户端数据
- 多线程套接字操作与进度条更新