webbench--网站压力测试工具

WebBench的下载安装

  1. 下载
    命令:wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz
  2. 解压缩
  3. 进入webbench目录文件
    命令:cd webbench
  4. 安装
    命令1:make 命令2:make install
  5. 运行
    webbench -c 10 -t 20 http://www.baidu.com/

webbench:其为linux上一款web性能压力测试工具,它最多可以模拟3万个并发连接数来测试服务器压力,其原理为fork多个子进程,每个子进程都循环做web访问测试,子进程将访问的结果通过管道告诉父进程,父进程做最终结果统计。

主要函数:
 alarm_handler 信号处理函数,时钟结束时进行调用。
 usage 输出 webbench 命令用法
 main 提供程序入口...
 build_request 构造 HTTP 请求
 bench 派生子进程,父子进程管道通信最后输出计算结果。
 benchcore 每个子进程的实际发起请求函数。    
流程

1.解析命令行参数,根据命令行指定参数设定变量,可以认为是初始化配置。
2.根据指定的配置构造 HTTP 请求报文格式。
3.开始执行 bench 函数,先进行一次 socket 连接建立与断开,测试是否可以正常访问。
4.建立管道,派生根据指定进程数派生子进程。
5.每个子进程调用 benchcore 函数,先通过 sigaction 安装信号,用 alarm 设置闹钟函数,接着不断建立 socket 进行通信,与服务器交互数据,直到收到信号结束访问测试。子进程将访问测试结果写进管道。
6.父进程读取管道数据,汇总子进程信息,收到所有子进程消息后,输出汇总信息,结束。

详细过程

webbench.c:
全局变量选项参数:都有默认值
一.命令行参数解析

  • 如果用户没有传参时直接输出用法help信息
  • 如果带参数则解析命令行参数,并根据传入参数进行相关设置。参数构造是用getopt_long()函数实现,getopt_long()函数函数根据argc来寻找(argv,”912vfrt:p:c:?h”)这两个字符串匹配的选项。getopt_long()函数将选项解析完成后,读到url不会再读取,此时argv[optind]指向url(optind是命令行参数中未读取的下一个元素)

二.根据1得到的一些参数,进行http请求构造,调用build_request()函数:

  1. 判断应该使用的HTTP协议
  2. 填写http请求第一行请求方法method
  3. url合法性判断:如果没有://则不合法;url过长非法。
  4. 如果无代理服务器:将其网络地址放到host数组中,设置端口。如果没有端口号,直接拷贝域名到host数组中。然后将资源路径填入请求行中。
  5. 如果有代理服务器:直接填入url到请求行中,填入http版本号到请求行中,填入请求报头(NAME:VALUE),填入空行
  6. http请求构造完成

三.进行压力测试,调用bench()函数:(父进程做得工作)

1.进行一次连接合法性测试。先测试一次,服务器是否可以正常连接成功;测试成功,一次连接完成关闭。
2.建立管道通信
3.按照客户端数目派生子进程。传入多少个客户端则建立多少个子进程进行连接。
4.每个子进程调用benchcore函数进行连接请求

benchcore函数是子进程处理发起请求 
 - 创建自定义信号捕捉函数,建立benchtime时间闹钟 
 - 调用socket,得连接套接字 
 - 向网络中写请求
 - 对http0.9的处理,如果关闭不成功则关闭连接写一半 
 - 读取服务器响应消息 
 - 关闭连接 
(以上过程中统计各自进程的失败次数faild,服务器回应字节数bytes,连接成功次数speed)

5.benchcore函数调用完成,每个进程向管道中写入失败次数,服务器回应字节数,连接成功次数
6.父进程打开管道读取每个进程写入的信息,进行统计计算,输出压力测试结果

Socket.c:
1.建立套接字:调用socket();
2.建立连接:调用connect();
3.返回套接字:sock.

优点为:

1.部署简单,适用于小型网站压力测试,(最多可模拟3万并发);
2.它具有静态页面测试能力也支持动态页面(ASP,PHP,JAVA,CGI)进行测试能力;
3.支持对含有SSL的安全网站如电子商务网站进行动态或静态性能测试;

缺点为:

1.不适合中大型网站测试;
2.其并发采用多进程实现并非线程,长时间其会大量占用内存与CPU,所以一般长时间的压力测试不推荐使用webbench.

源代码:
webbench.c

#include "socket.c"

#include <unistd.h>

#include <sys/param.h>

#include <rpc/types.h>

#include <getopt.h>

#include <strings.h>

#include <time.h>

#include <signal.h>



/* values */

volatile int timerexpired=0;

int speed=0;

int failed=0;

int bytes=0;



/* globals */

int http10=1; /* 0 - http/0.9, 1 - http/1.0, 2 - http/1.1 */

/* Allow: GET, HEAD, OPTIONS, TRACE */

#define METHOD_GET 0

#define METHOD_HEAD 1

#define METHOD_OPTIONS 2

#define METHOD_TRACE 3

#define PROGRAM_VERSION "1.5"

int method=METHOD_GET;

int clients=1;

int force=0;

int force_reload=0;

int proxyport=80;

char *proxyhost=NULL;

int benchtime=30;



/* internal */

int mypipe[2];

char host[MAXHOSTNAMELEN];

#define REQUEST_SIZE 2048

char request[REQUEST_SIZE];



static const struct option long_options[]=

{

    {
  "force",no_argument,&force,1},

    {
  "reload",no_argument,&force_reload,1},

    {
  "time",required_argument,NULL,'t'},

    {
  "help",no_argument,NULL,'?'},

    {
  "http09",no_argument,NULL,'9'},

    {
  "http10",no_argument,NULL,'1'},

    {
  "http11",no_argument,NULL,'2'},

    {
  "get",no_argument,&method,METHOD_GET},

    {
  "head",no_argument,&method,METHOD_HEAD},

    {
  "options",no_argument,&method,METHOD_OPTIONS},

    {
  "trace",no_argument,&method,METHOD_TRACE},

    {
  "version",no_argument,NULL,'V'},

    {
  "proxy",required_argument,NULL,'p'},

    {
  "clients",required_argument,NULL,'c'<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值