一尘不染

C ++套接字服务器-无法使CPU饱和

linux

我已经使用boost :: asio用C
++开发了一个微型HTTP服务器,现在我正在使用多个客户端对其进行负载测试,但是我一直无法接近饱和的CPU。我正在Amazon
EC2实例上进行测试,一个CPU的使用率约为50%,另一个CPU的使用率为20%,其余两个则处于闲置状态(根据htop)。

细节:

  • 服务器为每个内核启动一个线程
  • 接收,解析,处理请求,并写出响应
  • 请求是针对从内存中读取的数据(此测试为只读)
  • 我正在使用两台计算机“加载”服务器,每台计算机运行一个Java应用程序,运行25个线程,发送请求
  • 我看到大约230个请求/秒的吞吐量(这是 应用程序 请求,由许多HTTP请求组成)

那么,我应该怎样看才能改善这个结果?鉴于CPU大部分处于空闲状态,我想利用这些额外的容量来获得更高的吞吐量,例如800个请求/秒或其他。

我的想法:

  • 这些请求很小,通常在几毫秒内就可以完成,我可以修改客户端以发送/编写更大的请求(也许使用批处理)
  • 我可以修改HTTP服务器以使用“选择”设计模式,这是否合适?
  • 我可以做一些剖析,以尝试了解瓶颈所在

阅读 181

收藏
2020-06-02

共1个答案

一尘不染

boost :: asio不如您希望的那样友好线程-boost / asio / detail /
epoll_reactor.hpp中的epoll代码有很大的锁,这意味着一次只能有一个线程可以调用内核的epoll syscall
。对于很小的请求,这将带来所有不同(意味着您将仅看到单线程性能)。

请注意,这是boost :: asio使用Linux内核工具的方式的限制,不一定是Linux内核本身。使用边缘触发的事件时,epoll
syscall确实支持多个线程,但是正确处理(没有过多的锁定)可能会非常棘手。

顺便说一句,我一直在这方面做一些工作(将完全多线程的边缘触发epoll事件循环与用户预定的线程/光纤相结合),并在nginetd项目下提供了一些代码。

2020-06-02