开源阅读——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
上一篇下一篇

猜你喜欢

热点阅读