Web压测工具http_load原理分析
01、前言
http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load:
http://www.acme.com/software/http_load/
这个软件一直在保持着更新(不像webbench,已经是十年的老古董了。
webbench的源码分析请参考:http://www.cnblogs.com/xuning/p/3888699.html ),并且更新频率还蛮高的样子。好在每个版本之间差别非常小,本文还是具有较好的通用性的。
02、使用方法
下载并解压缩之后,进入工具的根目录直接make,就可以得到可执行的工具。
其使用方法如下图所示:
图中所示的url.txt内容是若干url链接,每行一个,详细说明一下使用格式:
./http_load [-checksum] [-throttle] [-proxy host:port] [-verbose] [timeout secs] [-sip sip_file]-parallel N | -rate N [-jitter]-fetches N | -seconds Nurl_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两个参数必须有一个,用于指定程序的终止条件。
03、与webbench的对比
webbench是另外一款网页性能测试工具,它采用多进程发包,最多支持3万并发量,而http_load采用单一进程并行复用方式发包。
由于只有一个进程,http_load对于机器资源消耗较小,性能要求不高,但它的劣势就是最大并发量比webbench要少许多,只能达到千的量级。在很多场景中,几千的量级也已经绰绰有余了,因此具体工具的选用还要看实际情况。
我们分别使用webbench和http_load对同一个URL进行压力访问,结果如下。
[horstxu@vps ~/webbench-1.5]$ ./webbench -t 30 -c 1000 http://127.0.0.1:8080/user.pngWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.Benchmarking:GET http://127.0.0.1:8080/user.png1000 clients, running 30 sec.Speed=180340 pages/min, 5268934 bytes/sec.Requests: 90170 susceed, 0 failed.[horstxu@vps ~/http_load-02aug2014]$ ./http_load -parallel 1000 -fetches 90000 url.txt 90000 fetches, 830 max parallel, 1.2933e+08 bytes, in 30.5439 seconds1437 mean bytes/connection2946.58 fetches/sec, 4.23424e+06 bytes/secmsecs/connect:0.772754 mean, 215 max, 0.025 minmsecs/first-response: 17.2259 mean, 288.007 max, 1.735 minHTTP 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的实现原理。
04、工作流程
程序的工作流程可以用下面这幅图来表示,执行时程序主要环节位于流程图中的循环内。
http_load为单一进程的程序,因此进程内的所有调用都是非阻塞方式进行, 保证程序的流畅度。
程序的执行过程主体在一个大循环当中,不间断进行结束条件的判定和超时判定。
时间管理方式是使用拉链式哈希表,超时情况下即运行超时处理函数。
05、原理分析
1、程序执行过程解析
如果使用简化的代码来描述上一节所述的流程图,可以参考下图。流程图中的循环也就是主函数中的for循环。
在主循环内主要做4件事情:
首先,检测当前程序是否满足终止条件,如果满足,则调用结束函数退出程序,否则进行下一步。
然后,采用select监听描述符状态,一旦出现可读或可写状态的描述符,则采用handle_connect与handle_read两函数分别进行处理。
需要提醒的是
源程序在处理读取socket缓冲区这一段为了完美剔除掉http请求报文的头部,耗费了大量的代码。
再然后,循环尾部执行超时检测,检查当前时间有没有超过在哈希表中注册的每一个时间戳,如果超过,则要执行其对应的超时处理函数。
源码中共有5种时间戳需要注册,分别对应着5个超时处理函数,请参考图中的超时处理函数集合。
2、三个重要的结构体
下图中详细描述了三个源码中最为重要的结构体。
首先,程序采用全局变量connections数组控制每一个TCP连接,connections数组中每个元素都是一个指向connection结构体的指针。connection结构体包含了用于记录测试数据的变量,连接状态的控制变量,以及最开始从文件中读取的连接配置信息。
第二个结构体为url结构体,在http_load当中,想要请求的url存储在文件内,可以大于一个。
这些URL的信息会被读取至由指向url结构体的指针组成的urls数组。请求会随机发向这些数组。相比webbench,http_load的一个优势是它的数据校验环节。每一个url会配有返回请求的checksum值,用于校验每次请求同一个url返回的内容是否一致。
第三个结构体是时间管理方法中组成拉链式哈希表的每一个节点。它包含了指向超时处理函数的指针,以及记录超时时间的变量。
3、时间戳管理方法
http_load中最为巧妙的就是它的时间管理方法。在该工具中,有很多需要定时触发的地方,比如每隔一段时间输出一份测试进度汇报;链接超过一定时间未响应则记为超时,输出超时错误信息;设定发送频率,每隔一段时间发出一个请求等等。这些时间戳和其超时触发的函数以Timer结构体的形式,全部注册于拉链法构成的哈希表中。每个链表都是以时间戳顺序从早到晚依次排列。
这样,在每一个for循环执行超时检测的部分,我们可以很方便地判断出当前时间是否已经超过了时间戳的时间,如果超过,则执行超时处理函数。同时,这样的数据结构也提高了插入新时间戳的效率。
06、结语
http_load与webbench都是很常用的压测工具,如果配合使用,结果做对比,既是对测得结果的校验,也能帮助熟悉两种工具的优劣。http_load的设计思路也可以使用到业务测试工具中来,帮助开发出更高效的压测工具。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】
一、Python编程入门到精通

二、接口自动化项目实战
三、Web自动化项目实战

四、App自动化项目实战
五、一线大厂简历

六、测试开发DevOps体系
七、常用自动化测试工具

八、JMeter性能测试
九、总结(尾部小惊喜)
生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!
生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!
只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!
相关文章:

Web压测工具http_load原理分析
01、前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ 这个软件一直在保持着更新(不像webbench,已经是十年的老古董了。 webbench的源…...

flask------消息闪现 flash
1介绍 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”。在视图函数调用flash()函数,传入消息内容,flash()函数把消息存…...

【C++】数据结构与算法:常用查找算法
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍常用查找算法。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路…...

【Spring Cloud 六】Hystrix熔断
这里写目录标题 系列文章目录背景一、Hystrix是什么服务雪崩服务容错的相关概念熔断器降级超时控制限流 二、会什么要有Hystrix三、如何使用Hystrix进行熔断处理整体项目代码服务提供者pom文件yml配置文件启动类controller 服务消费者pom文件yml配置文件启动类feignhystrixcont…...

FTP使用教程
FTP使用教程 目录 一.FTP简介二.FTP搭建三.FTP使用 一.FTP简介 FTP中文为文件传输协议,简称为文传协议。它也是一个应用程序,不同的操作系统有不同的FTP应用程序,这些应用程序都遵守同一种协议以…...

网络安全(黑客技术)自学
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…...

使用公式与格式控制Excel快速实现计划甘特图
项目中都会遇到做任务计划的需求,有的客户要求需要有甘特图的形式本文介绍如何使用excel 单元格实现甘特图显示,调整任务时间自动填充单元格填色实现甘特图效果。废话不多说,先看效果。 准备工作先创建两列开始时间与完成时间,这…...

ChatGPT即将取代程序员
W...Y的主页 相信ChatGPT大家已经都不陌生,我们经常会在工作和学习中应用。但是ChatGPT的发展速度飞快。功能也越来越全面。ChatGPT的文章也是层次不穷的出现,ChatGPT即将取代程序员的消息也铺天盖地。那ChatGPT真的会取代程序员吗?我们是否…...

opencv-33 图像平滑处理-中值滤波cv2.medianBlur()
中值滤波是一种常见的图像处理滤波技术,用于去除图像中的噪声。它的原理是用一个滑动窗口(也称为卷积核)在图像上移动,对窗口中的像素值进行排序,然后用窗口中像素值的中值来替换中心像素的值。这样,中值滤…...

跟CZY一起深入理解C++(1)-一些基础知识
跟CZY一起深入理解C些基础知识 常量constconstexpr 初始化枚举与枚举类分离编译 常量 const 常量亦即不可改变的量(实际上可以暴力破解),那么常量在C中主要有以下几种应用场景 定义常量变量 //如果有以下情况,在GCC上能够破解,而在MSVC上不会改变 // int放在栈区,实际上是可…...
bash变量和参数介绍
bash变量和参数介绍 概述 变量可以让程序和脚本语言用来描述数据。一个变量仅仅是一个标签而已,被指定到计算机内存中存储着数据的某个位置或某些位置的标签。变量一般出现在算术运算操作和数量操纵及字符串解析中。 4.1. 变量替换(Variable Substitution) 变量的名…...

Qt 信号与槽
信号与槽(signal & slot)是Qt编程的基础,使Qt中处理界面各个组件的交互操作变得更加直观和简单。 信号(Signal)就是在特定情况下被发射的事件,如PushButton最常见的信号就是鼠标单击时发射的clicked()…...

目标检测与跟踪 (1)- 机器人视觉与YOLO V8
目录 1、研究背景 2. 算法原理及对比 2.1 点对特征(Point Pairs) 2.2 模板匹配 2.3 霍夫森林 2.4 深度学习 3、YOLO家族模型演变 4、YOLO V8 1、研究背景 机器人视觉识别技术是移动机器人平台十分关键的技术,代表着机器人智能化、自动化…...
mlr3verse vs KM曲线:谁能更精准地预测生存率?
一、引言 生存分析是统计学中一种重要的方法,用于分析个体在特定时间段内生存的概率或生存率。它在医学、流行病学、生物学等领域被广泛应用。通过生存分析,我们可以评估治疗方法的效果、预测疾病进展的风险以及评估特定因素对生存率的影响。 生存率的准…...

TechTool Pro for mac(硬件监测和系统维护工具)
TechTool Pro 是为 Mac OS X 重新设计的全新工具程序,不但保留旧版原有的硬件侦测功能,还可检查系统上其他重要功能,如:网络连接,区域网络等。 TechTool Pro for mac随时监控和保护您的电脑,并可预设定期检…...

排序算法(九大)- C++实现
目录 基数排序 快速排序 Hoare版本(单趟) 快速排序优化 三数取中 小区间优化 挖坑法(单趟) 前后指针法(单趟) 非递归实现(快排) 归并排序 非递归实现(归并&am…...
lettuce连接池的源代码(link)
springboot研究九:lettuce连接池很香,撸撸它的源代码_lettuce springboot_君哥聊技术的博客-CSDN博客...

小白到运维工程师自学之路 第六十二集 (docker持久化与数据卷容器)
一、概述 Docker持久化是指将容器中的数据持久保存在主机上,以便在容器重新启动或迁移时不丢失数据。由于Docker容器是临时和可变的,它们的文件系统默认是易失的,这意味着容器中的任何更改或创建的文件都只存在于此容器的生命周期内。但是&a…...

37.利用linprog解 有约束条件多元变量函数最小值(matlab程序)
1.简述 linprog函数主要用来求线型规划中的最小值问题(最大值的镜像问题,求最大值只需要加个“-”) 2. 算法结构及使用方法 针对约束条件为Axb或Ax≤b的问题 2.1 linprog函数 xlinprog(f,A,b) xlinprog(f,A,b,Aeq,beq) xlinprog(f,A,b,Aeq,…...

分页Demo
目录 一、分页对象封装 分页数据对象 分页查询实体类 实体类用到的utils ServiceException StringUtils SqlUtil BaseMapperPlus,> BeanCopyUtils 二、示例 controller service dao 一、分页对象封装 分页数据对象 import cn.hutool.http.HttpStatus; import com.…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...