web压测工具http_load原理分析

原文:web压测工具http_load原理分析

一、前言

http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load:

http://www.acme.com/software/http_load/ (页面实在太简陋……)

十分令人欣慰的是,这个软件一直在保持着更新(不像webbench,已经是十年的老古董了。webbench的源码分析请参考:http://www.cnblogs.com/xuning/p/3888699.html ),并且更新频率还蛮高的样子。我在下载了2014年8月2号的版本后,紧接着8月14号再查看,就又有了一个新的版本。这篇文章分析的http load版本是“http_load 02aug2014”,好在每个版本之间差别非常小,本文还是具有较好的通用性的。

二、使用方法

下载并解压缩之后,进入工具的根目录直接make,就可以得到可执行的工具。其使用方法如下图所示:

图中所示的url.txt内容是若干url链接,每行一个,比如:http://127.0.0.1:80/index.html

详细说明一下使用格式:

./http_load [-checksum] [-throttle] [-proxy host:port] [-verbose] [timeout secs] [-sip sip_file]

-parallel N | -rate N [-jitter]

-fetches N | -seconds N

url_file

选项与参数:

-fetches:总计要访问url的次数,无论成功失败都记为一次,到达数量后程序退出。

-rate:每秒访问的次数(即访问频率),控制性能测试的速度。

-seconds:工具运行的时间,到达seconds设置的时间后程序退出。

-parallel:最大并发访问的数目,控制性能测试的速度。

-verbose:使用该选项后,每60秒会在屏幕上打印一次当前测试的进度信息。

-jitter:该选项必须与-rate同时使用,表示实际的访问频率会在rate设置的值上下随机波动10%的幅度。

-checksum:由于要访问某个url很多次,为了保证每次访问时收到的服务器回包内容都一样,可以采用checksum检查,不一致会在屏幕上输出错误信息。

-cipher:使用SSL层的时候会用到此参数(url是https开头),使用特定的密码集。

-timeout:设置超时时间,以秒为单位,默认为60秒。每超过一次则记为一次超时的连接

-proxy:设置web代理,格式为-proxy host:port

-throttle:限流模式,限制每秒收到的数据量,单位bytes/sec。该模式下默认限制为3360bytes/sec。

-sip:指定一个source ip文件,该文件每一行都是ip+port的形式。

需要特别说明的是,-parallel参数和-rate参数中必须有一个,用于指定发请求包的方式;-fetches和-seconds两个参数必须有一个,用于指定程序的终止条件。

三、与webbench的对比

webbench是另外一款网页性能测试工具,它的源码分析可以参考如下连接:

http://www.cnblogs.com/xuning/p/3888699.html

webbench采用多进程发包,最多支持3万并发量,而http_load采用单一进程并行复用方式发包。由于只有一个进程,http_load对于机器资源消耗较小,性能要求不高,但它的劣势就是最大并发量比webbench要少许多,只能达到千的量级。在很多场景中,几千的量级也已经绰绰有余了,因此具体工具的选用还要看实际情况。

我们分别使用webbench和http_load对同一个URL进行压力访问,结果如下。

[[email protected] ~/webbench-1.5]$ ./webbench -t 30 -c 1000 http://127.0.0.1:8080/user.png

Webbench - Simple Web Benchmark 1.5

Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1:8080/user.png

1000 clients, running 30 sec.

Speed=180340 pages/min, 5268934 bytes/sec.

Requests: 90170 susceed, 0 failed.

[[email protected] ~/http_load-02aug2014]$ ./http_load -parallel 1000 -fetches 90000 url.txt    

90000 fetches, 830 max parallel, 1.2933e+08 bytes, in 30.5439 seconds

1437 mean bytes/connection

2946.58 fetches/sec, 4.23424e+06 bytes/sec

msecs/connect: 0.772754 mean, 215 max, 0.025 min

msecs/first-response: 17.2259 mean, 288.007 max, 1.735 min

HTTP response codes:

  code 200 – 90000

如果进行一下换算,webbench测得的页面RPS为180340 pages/min = 3006rps,这与http_load的测试结果2946fetches/sec结果是很接近的,并且,http_load统计数据更加全面,数据校验也更加完善。对于每秒流量数据,webbench的结果是5268934bytes/sec,http_load是4234240bytes/sec。这其中的差别在于,http_load在统计时剔除了http报文的头部(head),而webbench是没有剔除头部的。接下来我们来领略一下http_load的实现原理。

四、工作流程

程序的工作流程可以用下面这幅图来表示,执行时程序主要环节位于流程图中的循环内。http_load为单一进程的程序,因此进程内的所有调用都是非阻塞方式进行, 保证程序的流畅度。程序的执行过程主体在一个大循环当中,不间断进行结束条件的判定和超时判定。时间管理方式是使用拉链式哈希表,超时情况下即运行超时处理函数。

五、原理分析

5.1 程序执行过程解析

如果使用简化的代码来描述上一节所述的流程图,可以参考下图。流程图中的循环也就是主函数中的for循环。在主循环内主要做4件事情。首先,检测当前程序是否满足终止条件,如果满足,则调用结束函数退出程序,否则进行下一步。然后,采用select监听描述符状态,一旦出现可读或可写状态的描述符,则采用handle_connect与handle_read两函数分别进行处理。需要提醒的是,源程序在处理读取socket缓冲区这一段为了完美剔除掉http请求报文的头部,耗费了大量的代码。再然后,循环尾部执行超时检测,检查当前时间有没有超过在哈希表中注册的每一个时间戳,如果超过,则要执行其对应的超时处理函数。具体的时间戳管理方法见下文。源码中共有5种时间戳需要注册,分别对应着5个超时处理函数,请参考图中的超时处理函数集合。

5.2 三个重要的结构体

下图中详细描述了三个源码中最为重要的结构体。首先,程序采用全局变量connections数组控制每一个TCP连接,connections数组中每个元素都是一个指向connection结构体的指针。connection结构体包含了用于记录测试数据的变量,连接状态的控制变量,以及最开始从文件中读取的连接配置信息。第二个结构体为url结构体,在http_load当中,想要请求的url存储在文件内,可以大于一个。这些URL的信息会被读取至由指向url结构体的指针组成的urls数组。请求会随机发向这些数组。相比webbench,http_load的一个优势是它的数据校验环节。每一个url会配有返回请求的checksum值,用于校验每次请求同一个url返回的内容是否一致。第三个结构体是时间管理方法中组成拉链式哈希表的每一个节点。它包含了指向超时处理函数的指针,以及记录超时时间的变量。

5.3 时间戳管理方法

http_load中最为巧妙的就是它的时间管理方法。在该工具中,有很多需要定时触发的地方,比如每隔一段时间输出一份测试进度汇报;链接超过一定时间未响应则记为超时,输出超时错误信息;设定发送频率,每隔一段时间发出一个请求等等。这些时间戳和其超时触发的函数以Timer结构体的形式,全部注册于拉链法构成的哈希表中。每个链表都是以时间戳顺序从早到晚依次排列。这样,在每一个for循环执行超时检测的部分,我们可以很方便地判断出当前时间是否已经超过了时间戳的时间,如果超过,则执行超时处理函数。同时,这样的数据结构也提高了插入新时间戳的效率。

六、结语

http_load与webbench都是很常用的压测工具,如果配合使用,结果做对比,既是对测得结果的校验,也能帮助熟悉两种工具的优劣。http_load的设计思路也可以使用到业务测试工具中来,帮助开发出更高效的压测工具。

时间: 2024-11-29 05:53:12

web压测工具http_load原理分析的相关文章

一个简单的websocket压测工具tcpkail

简介 tcpkali是一个高性能的负载生成工具,用于TCP和WebSocket服务器.采用C/C++开发并在BSD协议下授权,是一个开源的web压测工具,类似于apache的ab,但tcpkail同时支持websocket和httpd协议. 关于tcpkail的一些特性 高效的 CPU 利用率,可使用所有 CPU 核 允许同时打开大量的并发链接 (--connections) 允许限制单个连接的吞吐量 (--channel-bandwidth or --message-rate) 允许指定首页消

[软件测试]网站压测工具Webbench源码分析

一.我与webbench二三事 Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能.Webbench使用C语言编写,下面是其下载链接: http://home.tiscali.cz/~cz210552/webbench.html 说到这里,我赶脚非常有必要给这个网站局部一个截图,如下图: 第一次看到这张图片,着实吃了一精!居然是2004年最后一次更新,我和我的小伙伴们都惊呆了.不过既然现在大家还都

web服务器压测工具siege、ab

web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力.可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行.siege可以从您选择的预置列表中请求随机的URL.所以siege可用于仿真用户请求负载,而ab则不能.但不要使用siege来执行最高性能基准调校测试

ab(http)与abs(https)压测工具

ab(http)与abs(https)压测工具 来源 https://www.cnblogs.com/weizhxa/p/8427708.html 在学习ab工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second)概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数.某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率.计算公式:总请求数 / 处理完成这些请求数所花费的时间,即Request per s

Http压测工具wrk使用指南

用过了很多压测工具,却一直没找到中意的那款.最近试了wrk感觉不错,写下这份使用指南给自己备忘用,如果能帮到你,那也很好. 安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源码,在项目路径下执行make命令即可. git clone https://github.com/wg/wrk make make之后,会在项目路径下生成可执行文件wrk,随后

压测工具的实践

压测工具apache ab /webbentch 1.Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力.ab命令  对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载.ab是最常用  的压测工具. 2.ebbech能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况.webBech的标准测试可以向我们展示服务器的两项 内容:每秒钟相应请求数

swingbench-免费的oracle性能压测工具

SwingBench介绍: SwingBench由负载生成器,协调器和集群概述组成.该软件使得能够生成负载并且将图表的事务/响应时间映射. SwingBench可用于演示和测试诸如实际应用集群,在线表重建,备用数据库,在线备份和恢复等技术 SwingBench附带的代码包括6个基准,OrderEntry,SalesHistory,TPC-DS Like,JSON,CallingCircle和StressTest .. OrderEntry基于Oracle11g / Oracle12c附带的"oe

使用压测工具ab实现搭建的页面压测

使用压测工具(ab/webbench等)实现搭建的页面压测,要求通过调整apache的工作模式来对比最后性能. 配置文件位置:/etc/httpd/conf/httpd.conf <IfModule prefork.c>  //如果加载了这个模块,就实现一下配置,一个条件化模块加载 StartServers        8  //服务在启动时默认启动几个子进程 MinSpareServers    5  //最小空闲进程数量 MaxSpareServers    20  //最大空闲进程数量

压测工具siege和wrk

siege压测工具 安装: wget http://download.joedog.org/siege/siege-3.0.8.tar.gz cd siege-3.0.8 ./configure make make install 验证安装结果:输入siege -V 如果输出了版本号就代表安装没问题 Siege命令常用参数 -c 200 指定并发数200-r 5 指定测试的次数5-f urls.txt 制定url的文件-i internet系统,随机发送url-b 请求无需等待 delay=0-