开源阅读——Webbench阅读笔记
2022-02-16 本文已影响0人
猿哥媛姐
项目简介
Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。
项目地址
https://github.com/EZLippi/WebBench
项目跑起来
1 下载代码,编译成功后
2 启动nginx服务
3 对本地服务进行压测
压测测试超过30000个并发的情况
并发压测阅读笔记
1 整体结构、流程
整个项目很简单,由两个文件共5个函数组成
//socket.c
int Socket(const char *host, int clientPort) // 创建一个socket客户端,接到服务器
//webbench.c
static void benchcore(const char* host,const int port, const char *request); // 循环发送请求,直到超时
static int bench(void); // fork 子进程,调用benchcore
static void build_request(const char *url); // 拼接请求字符串
2 代码细节
2.1 参数解析
使用getopt_long出来命令行输入的参数, 对比自己手动处理字符串,使用getopt系列函数,可以提高处理Linux命令行参数问题的效率,尤其是参数比较多的情况。
相关函数系列函数可以看man手册。
GETOPT(3) Linux Programmer's Manual GETOPT(3)
NAME
getopt, getopt_long, getopt_long_only, optarg, optind, opterr, optopt - Parse command-line options
2.2 socket封装
对socket做了简单的封装,来创建tcp客户端并连接到目标服务器。
由于目标服务可能咋解释ip,有可能是域名所以两种情况都要处理
in_addr_t inet_addr(const char *cp);
struct hostent *gethostbyname(const char *name);
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}
2.3 子进程结果采用进程间通信方式传递
匿名管道
2.4 采用信号做超时中断处理
443 struct sigaction sa;
444
445 /* setup alarm signal handler */
446 sa.sa_handler=alarm_handler;
447 sa.sa_flags=0;
448 if(sigaction(SIGALRM,&sa,NULL))
449 exit(3);
450
451 alarm(benchtime); // after benchtime,then exit
NAME
alarm - set an alarm clock for delivery of a signal
SYNOPSIS
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
NAME
sigaction - examine and change a signal action
SYNOPSIS
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
sigaction(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
siginfo_t: _POSIX_C_SOURCE >= 199309L
DESCRIPTION
The sigaction() system call is used to change the action taken by a process on
receipt of a specific signal. (See signal(7) for an overview of signals.)
2.5 使用ctag
关于ctag的更多细节,需要进一步学习了解。
2.6 URL字符串解析
从一个完整的url中解析出 host 内容。例如 http://127.0.0.1/index.html 中, 解析出127.0.0.1 用到的函数
#include <strings.h>
// locate character in string
char *index(const char *s, int c);
char *rindex(const char *s, int c);
// strchr, strrchr, strchrnul - locate character in string
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
char *strchrnul(const char *s, int c);
// strstr, strcasestr - locate a substring
char *strstr(const char *haystack, const char *needle);
char *strcasestr(const char *haystack, const char *needle);
//strcasecmp, strncasecmp - compare two strings ignoring case
int strcasecmp(const char *s1, const char *s2);
int strncasecmp(const char *s1, const char *s2, size_t n);
// strcat, strncat - concatenate two strings
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
// strcpy, strncpy - copy a string
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
b90f66de-5102-4804-a560-9f730a362cce.png