美文网首页
开源阅读——Webbench阅读笔记

开源阅读——Webbench阅读笔记

作者: 猿哥媛姐 | 来源:发表于2022-02-16 15:09 被阅读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

    相关文章

      网友评论

          本文标题:开源阅读——Webbench阅读笔记

          本文链接:https://www.haomeiwen.com/subject/fshdlrtx.html