我已经开发了一个小型HTTP服务器在C++,使用提升::asio,现在我负荷测试它与多种客户和我已经无法获得靠近饱和。我测试在一个亚马逊EC2实例,并得到大约50%的使用情况的一个cpu,20%的另一个,其余两个空闲(根据htop).

详细信息:

  • 服务器触发了一个线程的每个核心
  • 请求的接收、分析、处理和答复都写出来
  • 请求针对的是数据,这些数据读取存储器(只读这个测试)
  • 我装'的服务器使用两台计算机,每个运行java应用程序、运行25线、发送请求
  • 我看到大约230请求/秒的吞吐量(这是 应用程序 的请求,这是由许多HTTP请求)

那么,什么我应该看起来在改善这个结果?鉴于CPU是大多是闲着,我想利用这额外的能力,以获得更高的吞吐量、说800请求/秒或什么的。

想法,我已经有:

  • 该请求是非常小的,并且通常履行在几毫秒,我可以修改的客户发送/撰写更大的请求(可能采用分批处理)
  • 我可以修改HTTP服务器使用所选择的设计图案,这是适当的在这里吗?
  • 我可以做一些分析尝试了解什么样的瓶颈是不是
有帮助吗?

解决方案

提升::asio是不是线友好的因为你会希望有一个很大的锁绕epoll码在提升/asio/detail/epoll_reactor.hpp这意味着只有一线可以叫到的核epoll系统调用的时间。对非常小的请求,这使得所有的差异(这意味着你将只能看到大致单线性能)。

注意,这是一个限制是如何提升::asio使用Linux内核设施,不一定是以Linux内核本身。该epoll系统调用并支持多个线时使用的边缘,触发事件,但得到它的权利(没有过多的锁定)可以相当棘手。

顺便说一句,我一直在做一些在这一领域的工作(相结合的一个完全多线程的边缘,触发epoll事件循环与用户-计划的线/纤维),并提出了一些代码可用下 nginetd 的项目。

其他提示

因为你使用EC2,所有的赌注都关闭。

尝试使用真正的硬件,然后你可以看看发生了什么。试图做性能检测在虚拟机基本上是不可能的。

我还没有作出什么EC2是有用的,如果有人找出来,请让我知道。

从你的意见网络的利用率,
你似乎没有多少网络运动。

3 + 2.5 MiB/sec 是的周围 50Mbps 球场(比你1g需端口)。

我会说你是一个具有以下两个问题,

  1. 不足的工作负荷(低请求率从你的客户)
    • 阻止在服务器(受干扰的反应产生)

cmeerw's notes和你的CPU利用率数字
(怠在 50% + 20% + 0% + 0%)
它似乎最有可能限制在你的服务器实现的。
我第二个 cmeerw's答复(+1).

230请求/秒似乎非常低于这样简单的异步请求。因此,使用多线程可能是早产的优化-让它正常工作和调整,在一个单一的线,看看你是否仍然需要他们。刚刚摆脱联合国需要锁定可能获得的东西加快速度。

这篇文章 有一些细节和讨论I/O战略,为网站服务器风格的性能大约在2003年。任何人得到任何更多近?

ASIO是对中小型任务,但它并不是很善于利用电力基础的系统。也不是原窝电话或甚至序数据检索机制,在Windows但如果你是有经验,你将永远是更好的比ASIO.无论哪种方式有很多的开销,所有这些方法只是更多的与ASIO.

为什么它是值得的。使用原座吁请我定义HTTP可作800K动态每秒请求与4个核心I7.它是服从RAM,这是在你需要为该级别的性能。在这个级别的性能的网络驱动器和操作系统消耗大约40%的CPU。使用ASIO我可以得到大约50到100K每秒请求,其表现是相当的变量,主要是绑在我的应用程序。后通过@cmeerw主要解释为什么。

提高性能的一种方法是通过实施一UDP代理。拦截HTTP请求和随后的路由他们通过UDP到你的后台UDP HTTP服务器你可以绕过很多TCP开销在操作系统。你还可以有前结束其管通过上UDP自己,这不应该太难做到你自己。一个优势的一个HTTP UDP代理是,它允许使用任何良好的前端,而无需修改,并可以交换他们在将没有任何影响。你只需要几更多的服务器来实现它。这种修改在我的例降低OS占用的10%,这增加了我的请求每二至刚刚超过一百万对,单后端。和总的来说你应该永远有一个前端-端安装的任何高性能的网站,因为前端可以缓存的数据没有慢下来越重要的动态要求的后端。

未来似乎是写你自己的驱动程序,实现其自己的网络堆所以你可以得到尽可能靠近的请求并尽可能实现自己的协议。这可能不是什么大多数程序员想听到的,因为它是更加复杂。在我的情况下,我将能够使用40%以上的CPU和移动超过1万的动态要求每秒。UDP代理的方法可以让你接近最佳的绩效,而不需要这样做,但是你会需要更多的服务器的-不过如果你这样做很多的请求每秒你通常需要多个网络卡和多个前端处理的带宽,因此具有对夫妇轻UDP代理人在那里不是什么大不了的事。

希望一些本可以用于你。

如何许多的实例io_service你有吗?提高asio有一个 创建一个io_service每CPU和使用他们的方式的循环.

你仍然可以创造四个线程和分配一个每CPU,但是每个线程可以调查在其自己的io_service.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top