我已经使用boost :: asio用C ++开发了一个微型HTTP服务器,现在我正在使用多个客户端对其进行负载测试,但是我一直无法接近饱和的CPU。我正在Amazon EC2实例上进行测试,一个CPU的使用率约为50%,另一个CPU的使用率为20%,其余两个则处于闲置状态(根据htop)。
细节:
那么,我应该怎样看才能改善这个结果?鉴于CPU大部分处于空闲状态,我想利用这些额外的容量来获得更高的吞吐量,例如800个请求/秒或其他。
我的想法:
boost :: asio不如您希望的那样友好线程-boost / asio / detail / epoll_reactor.hpp中的epoll代码有很大的锁,这意味着一次只能有一个线程可以调用内核的epoll syscall 。对于很小的请求,这将带来所有不同(意味着您将仅看到单线程性能)。
请注意,这是boost :: asio使用Linux内核工具的方式的限制,不一定是Linux内核本身。使用边缘触发的事件时,epoll syscall确实支持多个线程,但是正确处理(没有过多的锁定)可能会非常棘手。
顺便说一句,我一直在这方面做一些工作(将完全多线程的边缘触发epoll事件循环与用户预定的线程/光纤相结合),并在nginetd项目下提供了一些代码。