webbench简介

webbench由C语言写成的用于网站压力测试的一个非常简单的工具,它最多可以模拟30000个并发连接去进行测试。

webbench的安装和使用可以自行百度,也可以过下这篇文章

webbench执行流程

命令行解析 --> 构建HTTP请求包 --> 创建指定数量的工作进程 --> 每个工作进程对测试网站在测试时间内持续发送请求/接收响应

具体分析

1. 命令行解析。

  这里主要用到了getopt库。getopt库是C中常用的命令行解析库,具有如下一些常用的全局变量、结构体以及函数。

/* 常用全局变量 */

extern char*   optarg;    // 指向获取的option
extern int optind; // 已经解析过的option的个数
extern int opterr; // 错误码
extern int optopt;
/* 结构体:解析option时主要的结构体,用以指明有哪些指定options */

struct option {
const char* name;
int has_arg;
int* flag;
int val;
}; /* has_arg的几个宏 */
#define no_argument 0
#define require_argument 1
#define optional_argument 2
/* 常用的几个函数 */

int getopt();

int getopt_long(int __argc, char* const* __argv, const char* __shortopts, const struct option* __longopts, int* __longind);

int getopt_long_only(int __argc, char* const* __argv, const char* __shortopts, const struct option* __longopts, int* __longind);

2. 构建HTTP请求包。

  代码调用了build_request函数对HTTP请求包进行了构建。常见的HTTP请求包构建规则:

  请求方法 URL 协议版本 \r\n

   头部字段名: 值  \r\n

    ....

   头部字段名: 值  \r\n

   \r\n

   \r\n

  请求数据

  请求方法:GET, POST, HEAD, PUT, DELETE, TRACE, CONNECT, OPTIONS

  协议版本:HTTP/1.0   HTTP/1.1

  头部: User-agent, Host, Pragma, Connection等等

3. 使用fork创建指定数量的工作进程,用pipe让主进程和工作进程建立通信,以便于主进程收集子进程的测试信息。

/* 使用fork创建多进程代码片段 */

static int bench(void)
{
...
for (i = ; i < clients; i++)
{
pid = fork();
if (pid <= ) // 如果是子进程或者fork失败了,退出这个循环
{
sleep();
break;
}
} ...
}
/* fork 函数声明 */

#include <unistd.h>
#include <sys/types.h> pid_t fork(void); // pid_t 在 sys/types.h 中定义 /* pipe 函数声明 */
#include <unistd.h> int pipe(int pipefd[]); /* fdopen 函数声明 */
#include <stdio.h> FILE *fdopen(int fd, const char *mode); // 打开 pipe 文件

4. 每个进程模拟一个客户端,创建socket并连接测试web,用alarm定时测试时长,在这个时间段里,客户端持续向web请求并接收响应。

 这里有几点要注意:

  a) 在客户端的socket需要两步完成对web的连接:创建一个socket(使用socket()函数);连接web(使用connect()函数)。

  b) alarm定时时长,输入的参数只能是秒数。当定时时间到了的时候,系统会发送一个SIGALRM信号给alarm所在的进程,所以在调用alarm之前,需要注册一个信号函数sigaction或signal(代码中使用了sigaction),将SIGALRM与回调函数绑定,当系统发送SIGALRM,会调用相应的回调函数(代码中使用了alarm_handler)进行处理。

上面几个函数的声明如下

/* socket, connect 函数声明 */
#include <sys/types.h>
#include <sys/socket.h> int socket(int domain, int type, int protocol);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); /* alarm 函数声明 */
#include <unistd.h> unsigned int alarm(unsigned int seconds); /* sigaction 函数声明 */
#include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigation *oldact); struct sigaction {
void (*sa_handler) (int);
void (*sa_sigaction) (int, siginfo_t*, void*);
sigset_t sa_mask;
int sa_flag;
void (*sa_restorer) (void);
};

完!

2018-03-21 23:39:46

webbench1.5源码读后总结的更多相关文章

  1. Python源码读后小结

    Python 笔记 前言(还是叫杂记吧) 在python中一切皆对象, python中的对象体系大致包含了"类型对象", "Mapping对象(dict)", ...

  2. PHP源码安装后设置别名

    PHP源码安装后测试是否能正常运行 每次在php目录./bin./php调用php很不方便,可以设置别名(方法一) vi ~/.bash_profile     (修改根目录下这个文件) 设置完成后还 ...

  3. 复用微信小程序源码包后仍然有原小程序的版本管理怎么处理

    前言: 复用微信小程序源码包后,重新创建项目导入源码包,会发现开发者工具版本管理中仍然有原来小程序的版本,这样就不太好了.毕竟是一个新的小程序,需要有新的版本控制的.那么这个问题怎么处理呢? 解决方案 ...

  4. vue打包时,assets目录 和static目录下文件的处理区别(nodeModule中插件源码修改后,打包后的文件应放在static目录)

    为了回答这个问题,我们首先需要了解Webpack如何处理静态资产.在 *.vue 组件中,所有模板和CSS都会被 vue-html-loader 及 css-loader 解析,并查找资源URL.例如 ...

  5. Andriod下载源码导入后AndroidManifest.xml小红叉的解决办法

    问题描述: 下载源码后,用eclipse导入,AndroidManifest.xml小红叉,而且AndroidManifest.xml打不开无法编译,请高人指点! 解决办法: 网上下载的工程文件夹不要 ...

  6. OpenERP 源码变更后数据库升级

    转自:http://vivianyw.blog.163.com/blog/static/13454742220142114422130/?latestBlog OpenERP代码升级后需要对数据进行升 ...

  7. openfire源码修改后如何打包部署到linux服务器上

    原文:http://blog.csdn.net/jinzhencs/article/details/50457152 1.linux版本的3.10.3解压部署启动(过程略,参考我的另一篇博文http: ...

  8. openfire源码编译后部署到linux

    1.源码通过编号后,会生成target目录,直接把target目录拷贝到linux下即可: 2.启动openfire: ./openfire.sh start 3.退出直接ctr + c 问题:如果一 ...

  9. bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋

    昨天bilibili又上热搜了,被某人在github上开了个账号,传了份整个后端代码到github,这是被人扒光了衣服看个精光啊. 这件事情,作为程序员的我们除了调侃和fork的同时,想一想,造成这个 ...

随机推荐

  1. poj1976

    dp #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...

  2. VBA笔记-参考教程

    参考教程1: http://www.cnblogs.com/wuzhiblog/tag/VBA/ 1. VBA中字符换行 VBA中字符换行显示需要使用换行符来完成.下面是常用的换行符          ...

  3. js实现数据视图双向绑定原理

    这个方法了不起啊..vue.js和avalon.js 都是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了几行代码看他 ...

  4. 常用sql 全记录(添加中)

    -- 数据库SQL总结中........... --SQL分类: (CREATE,ALTER,DROP,DECLARE) ---DDL—数据定义语言(SELECT,DELETE,UPDATE,INSE ...

  5. 关于django过滤器的使用

    最近项目中要做分类筛选,其实已经做了这个功能,但是有一个字段是MultiSelectField类型,包含多个值,用户提交的数据是单个值,无法查询出结果, 所以用到了自定义过滤 原代码 class In ...

  6. 在 Python 中使用 GDB 来调试 转载

    2013/11/01 | Comments 大约一年前,我接触了 Java 中的 Btrace 能够不停机查看线上 JVM 运行情况的特性让我艳羡不已. 另外还有强悍的 jStack 和 jConso ...

  7. information that should help you find out what is causing the crash.

    091130 11:16:11 - mysqld got exception 0xc0000005 ; This could be because you hit a bug. It is also ...

  8. kvm图形化管理工具

    1丶windows环境下载安装以及运行xming软件 https://xming.en.softonic.com/ 链接:https://pan.baidu.com/s/1wMb2pK4WfCilS8 ...

  9. 8-3 4Values Whose Sum is Zero 和为0的四个值

    给定四个n元素集合 ABCD   要求分别从中取一个元素 abcd   使得他们的合为0   问有多少中取法 map果然炸了 #include<bits/stdc++.h> using n ...

  10. ubuntu16.04编译安装mysql5.7

    1.安装编译依赖 sudo apt-get install make cmake gcc g++ bison libncurses5-dev build-essential 2.下载mysql5.7源 ...