Board logo

标题: 如何生成每秒百万级别的 HTTP 请求?(1) [打印本页]

作者: look_w    时间: 2018-12-15 14:04     标题: 如何生成每秒百万级别的 HTTP 请求?(1)

本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇。它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间。
负载生成器是一些生成用于测试的流量的程序。它们可以向你展示服务器在高负载的情况下的性能,以及让你能够找出服务器可能存在的问题。通过负载测试了解服务器的缺点,是测试服务器弹性以及未雨绸缪的好方法。
负载生成工具(Load-Generating Tools)
在进行负责测试时要牢记一件重要的事:你能在 Linux 上建立多少个 socket 连接。这个限制是硬编码在内核里的,最典型的就是临时 W 端口的限制。(在某种程度上)你可以在 /etc/sysctl.conf 里扩展它。但是基本上,一台 Linux 机器只能同时打开大约 64,000 个 socket 。因此在负载测试时,我们不得不通过在单一的连接上尽可能多地发出请求来充分利用 socket 。 除此之外,我们还需要不止一台的机器来产生负载。否则,负载生成器会把可用的 socket 占用导致不能产生足够的负载。
我一开始用的是‘ab’,Apache Bench 。它是我所知道的 http 基准测试工具中最简单、最通用的。并且它是 Apache 附带的产品,因此它可能已经存在于你的系统中。不幸的是,我在使用它的时候每秒大约只能生成 900 个请求。虽然我见过其他人使用它每秒能达到 2,000 个请求,但我可以立即告诉你,‘ab’并不适合我们的基准测试。
Httperf
接着,我尝试了 ‘httperf’。这个工具更强大,但是它依然相对简单并且功能有限。要算出每秒生产了多少个请求并不是仅传递参数那么简单。经过我的多次尝试,获取了每秒超过几百请求的结果。例如:
它以每秒 1,000 个的速率创建了 100,000 个会话(session)。每次会话发起 5 次请求,时间间隔为 2 秒。
httperf --hog --server=192.168.122.10 --wsess=100000,5,2 --rate 1000 --timeout 5Total: connections 117557 requests 219121 replies 116697 test-duration 111.423 sConnection rate: 1055.0 conn/s (0.9 ms/conn, <=1022 concurrent connections)Connection time [ms]: min 0.3 avg 865.9 max 7912.5 median 459.5 stddev 993.1Connection time [ms]: connect 31.1Connection length [replies/conn]: 1.000Request rate: 1966.6 req/s (0.5 ms/req)Request size [B]: 91.0Reply rate [replies/s]: min 59.4 avg 1060.3 max 1639.7 stddev 475.2 (22 samples)Reply time [ms]: response 56.3 transfer 0.0Reply size [B]: header 267.0 content 18.0 footer 0.0 (total 285.0)Reply status: 1xx=0 2xx=116697 3xx=0 4xx=0 5xx=0CPU time [s]: user 9.68 system 101.72 (user 8.7% system 91.3% total 100.0%)Net I/O: 467.5 KB/s (3.8*10^6 bps)最终,我使用这些设置达到了每秒 6,622 个连接:
httperf --hog --server 192.168.122.10 --num-conn 100000 --ra 20000 --timeout 5(总共创建了 100,000 个连接,并且以每秒 20,000 个连接的固定速率创建)
它还有一些潜在的优势,并且拥有比‘ab‘更多的特性。但它不是我要用在这个项目里的重量级工具。我需要的是能够支持分布式多负载测试节点的工具。因此,我的下一个尝试是:Jmeter。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0