新地址:https://github.com/AngryHacker/articles/blob/master/src/code_reading/webbench.md
Webbench 是一个古老而著名的网站压力测试工具,简单而实用。如果你不清楚你的网站能承受多大的压力,或者你想分析对比两个网站的性能,webbench 再好用不过了。
Gitbub 地址:点我
安装:
很简单,cd 进项目主页后进行 make install clean 就好了。
用法:
想要知道用法可以在安装后直接输入 webbench 或 webbench -h 或 webbench --help. 可以看到:
webbench [option]... URL
-f|--force Don't wait for reply from server.
-r|--reload Send reload request - Pragma: no-cache.
-t|--time <sec> Run benchmark for <sec> seconds. Default 30.
-p|--proxy <server:port> Use proxy server for request.
-c|--clients <n> Run <n> HTTP clients at once. Default one.
-9|--http09 Use HTTP/0.9 style requests.
-1|--http10 Use HTTP/1.0 protocol.
-2|--http11 Use HTTP/1.1 protocol.
--get Use GET request method.
--head Use HEAD request method.
--options Use OPTIONS request method.
--trace Use TRACE request method.
-?|-h|--help This information.
-V|--version Display program version.
说一下主要的几个选项: 指定 -f 时不等待服务器数据返回, -t 为指定压力测试运行时间, -c 指定由多少个客户端发起测试请求。
-9 -1 -2 分别为指定 HTTP/0.9 HTTP/1.0 HTTP/1.1。
示例:
访问 http://baidu.com/ , 一个客户端,持续 60 秒。
➜ webbench-1.5 webbench -t 60 http://www.baidu.com/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://www.baidu.com/
1 client, running 60 sec.
Speed=36 pages/min, 54150 bytes/sec.
Requests: 36 susceed, 0 failed.
(这校园网真是 ri le gou 了)
访问 http://baidu.com/ , 10 个客户端,持续 60 秒,socket 提前关闭。
➜ webbench-1.5 webbench -f -c 10 -t 60 http://www.baidu.com/
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://www.baidu.com/
10 clients, running 60 sec, early socket close.
Speed=586 pages/min, 0 bytes/sec.
Requests: 586 susceed, 0 failed.
代码分析:
其实我把项目 clone 之后做的第一件事是把代码风格全部调整了....强迫症面对不一样的缩进和花括号都不能忍...
项目源码都位于 socket.c 和 webbench.c 两个 c 文件里面。其他都是说明文档或用于编译。
可能涉及知识点:命令行参数解析(getopt_long) 信号处理(sigaction) socket 管道读写。这些都可以通过 man 相关函数或者直接百度,不赘述了。
主要函数:
alarm_handler 信号处理函数,时钟结束时进行调用。
usage 输出 webbench 命令用法
main 提供程序入口...
build_request 构造 HTTP 请求
bench 派生子进程,父子进程管道通信最后输出计算结果。
benchcore 每个子进程的实际发起请求函数。
主要流程:
说一下程序执行的主要流程:
1. 解析命令行参数,根据命令行指定参数设定变量,可以认为是初始化配置。
2.根据指定的配置构造 HTTP 请求报文格式。
3.开始执行 bench 函数,先进行一次 socket 连接建立与断开,测试是否可以正常访问。
4.建立管道,派生根据指定进程数派生子进程。
5.每个子进程调用 benchcore 函数,先通过 sigaction 安装信号,用 alarm 设置闹钟函数,接着不断建立 socket 进行通信,与服务器交互数据,直到收到信号结束访问测试。子进程将访问测试结果写进管道。
6.父进程读取管道数据,汇总子进程信息,收到所有子进程消息后,输出汇总信息,结束。
流程图:
注释源码:
socket.c:
/* $Id: socket.c 1.1 1995/01/01 07:11:14 cthuang Exp $
*
* This module has been modified by Radim Kolar for OS/2 emx
*/
/***********************************************************************
module: