WebBench源码分析

WebBench 源码解析

一、前言

WebBench 作为一款网站性能测试工具,其源码蕴含着丰富的技术细节和逻辑流程。本文将深入剖析其安装编译过程以及关键函数的核心逻辑。

二、安装编译

1. 克隆代码到本地仓库

git clone https://github.com/EZLippi/WebBench.git

2. 编译

sudo make

踩坑及解决方法

踩坑 1
编译报错

解决方法
webbench.c 中的 #include <rpc/types.h> 改为 #include <sys/types.h> ,从而解决报错 。

踩坑 2
编译提示 ctags 找不到

解决方法:安装依赖 sudo apt-get install universal-ctags

编译通过后安装到本地

sudo make install PREFIX=your_path_to_webbench  //your_path_to_webbench 自己的安装目录下面

验证是否安装成功:

在终端中直接输入 webbench 命令

在这里插入图片描述

到此,编译安装完毕!!!

三、源码解析

(一)main 函数

main 函数承担着处理命令行参数、初始化相关变量以及调度后续操作流程的重要职责。

  • 首先,它会对命令行参数的数量进行校验。若仅输入一个参数,会调用 usage 函数并返回 2 ,提示用户输入有误。
  • 接着,通过 getopt_long 函数来精细地解析命令行参数,并依据不同的参数值对相应的变量进行设置,比如设定特定的标志位、转换并设定变量的值等。
  • 然后,检查用户是否提供了有效的 URL 。若未提供,会打印错误信息,调用 usage 函数,并返回 2 ,以表明输入不完整。
  • 此外,还会对一些变量进行默认值的处理。例如,当 clients 为 0 时,将其设定为 1 ;当 benchtime 为 0 时,将其设定为 30 。
  • 随后,调用 build_request 函数来构建请求。
  • 最后,打印运行相关的信息,并调用 bench 函数来开展性能测试,同时返回 bench 函数的返回值。

switch 语句中:

  • case 'f':将 force 标志设置为 1 ,启用特定功能。
  • case 'r':将 force_reload 标志设置为 1 。
  • case '9':将 http10 设置为 0 ,可能对应特定的 HTTP 版本选择。
  • case '1':将 http10 设置为 1 。
  • case '2':将 http10 设置为 2 。
  • case 'V':打印程序的版本信息并退出程序。
  • case 't':将 benchtime 变量的值通过 atoi 函数对 optarg 进行转换后设定。
  • case 'p':细致地处理代理服务器的参数,解析出主机名和端口。

(二)build_request 函数

build_request 函数的核心任务是依据输入的 URL 和一系列设定条件,精心构建出完整的 HTTP 请求字符串,同时进行必要的错误校验和处理操作。

  • 函数起始处,定义了一些局部变量,并运用 memset 函数将 hostrequest 缓冲区清零。
  • 接着,基于不同的条件判断来调整 http10 的值。
  • 然后,依据请求方法设定 request 字符串的起始部分,例如 GETHEAD 等。
  • 此后,对输入的 url 展开一系列严格的检查和处理操作,涵盖检查是否存在特定的协议标识、长度是否合规、语法是否正确等。
  • 明确协议/主机的分隔位置。
  • 依照是否设置了代理主机来分别处理 host 并构建 request 字符串。
  • 依据 http10 的值添加相应的协议版本信息到 request 中。
  • 有可能添加一些额外的头部信息,例如用户代理、主机、强制不缓存等。
  • 最终,打印构建完成的请求字符串。

(三)bench 函数

bench 函数主要负责创建子进程、与子进程进行通信并汇总测试结果。

  • 首先,定义了一些变量,如用于存储子进程返回值的 ijk ,进程标识符 pid ,文件指针 f 等。
  • 调用 Socket 函数检查目标服务器的可用性,如果连接失败则打印错误信息并返回 1 。
  • 使用 pipe 函数创建管道,如果创建失败打印错误并返回 3 。
  • 通过循环使用 fork 函数创建指定数量(clients )的子进程。
    • 如果 fork 结果小于 0 ,表示创建子进程时出现问题,打印错误信息并返回 3 。
    • 如果 fork 结果等于 0 ,表示当前为子进程。
      • 根据是否有代理主机,调用 benchcore 函数进行核心测试工作。
      • 使用 fdopen 将管道的写端转换为文件指针,并将测试结果(速度、失败次数、字节数)写入管道。
      • 关闭文件指针并返回 0 。
    • 如果 fork 结果大于 0 ,表示当前为父进程。
      • 使用 fdopen 将管道的读端转换为文件指针。
      • 初始化速度、失败次数和字节数等统计变量。
      • 进入一个循环,从管道读取子进程的测试结果,并更新统计变量。
      • 如果读取到的数据不完整或所有子进程都已结束,退出循环。
      • 关闭文件指针并打印测试结果,包括速度、字节数、成功和失败的请求数。
  • 最后,返回一个整数值。

(四)benchcore 函数

benchcore 函数在子进程中执行与服务器的交互和测试工作。

  • 定义了一些变量,包括请求长度 rlen 、缓冲区 buf 、套接字描述符 s 等。
  • 设置信号处理函数 sa 来处理定时信号。
  • 使用 alarm 函数设置定时时间。
  • 进入一个无限循环。
    • 如果定时时间已到,根据失败次数进行调整并返回。
    • 使用 Socket 函数创建套接字连接服务器,如果失败则增加失败次数并继续下一次循环。
    • 向套接字写入请求,如果写入长度不一致则增加失败次数并关闭套接字继续下一次循环。
    • 根据 http10 的值进行相应处理,如果需要关闭套接字但失败则增加失败次数并继续下一次循环。
    • 如果 force 标志为 0 ,从套接字读取数据,如果读取失败则增加失败次数、关闭套接字并跳转到 nexttry 标签处重新开始循环。
    • 如果读取到的数据长度为 0 则退出内层循环。
    • 否则增加字节数统计。
    • 如果成功关闭套接字则增加速度统计。

四、总结

  1. main 函数:
    • 处理命令行参数,进行必要的检查和默认值设置。
    • 调用相关函数构建请求和进行性能测试。
  2. build_request 函数:
    • 构建完整的 HTTP 请求字符串,并进行错误检查。
  3. bench 函数:
    • 管理子进程的创建和与子进程的通信。
    • 汇总子进程的测试结果并输出。
  4. benchcore 函数:
    • 在子进程中执行与服务器的交互和测试操作。

通过对这些函数的理解,可以更好地掌握 WebBench 的工作原理和内部实现机制,为进一步的使用和优化提供基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393509.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Squid 搭建 Http 代理服务器隐藏 IP

在一些情况下&#xff0c;需要变更自己的访问 IP&#xff0c;可以通过 Squid 搭建代理服务器实现。 本文使用的是 CentOS 7.6 系统。 一、部署 Squid 安装 Squid。 yum install squid -y启动服 systemctl start squid二、访问控制 总有刁民想害郑&#xff0c;疯狂访问朕的…

基于宝塔面板稳定快速安装 ssl 证书脚本

背景 我通过AI制作了不少关于签发ssl证书的脚本&#xff0c;目的是方便无脑安装&#xff0c;不需要懂代码。 但全都是基于acme.sh这个工具来设计的脚本&#xff0c;而且证书申请有点慢&#xff0c;有时还会申请失败。 然后我发现了certbot, 安装证书可谓神速&#xff01; c…

ASP.NET Core基础 - 简介

目录 一. 简介 A、跨平台性 B、高性能 C、开源性 D、模块化与可扩展性 E、集成现代前端技术 二. ASP.NET 4.x 和 ASP.NET Core 比较 A、架构与平台支持 B、性能 C、开发体验 D、社区支持与生态系统 三. NET 与 .NET Framework 比较 A、概念范围 B、跨平台能力 C…

基于JAVA的高考智能排考场系统设计与实现,源码、部署+讲解

绪 论 随着教育规模的不断扩大和技术的进步&#xff0c;传统的考试管理方式面临着诸多挑战&#xff0c;如考试安排的复杂性、作弊现象的频发以及考试过程中的监督和管理等问题。因此&#xff0c;针对这些挑战&#xff0c;智能排考系统应运而生。 智能排考系统利用先进的技术…

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)

文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出&#xff0c;对于需要动态维护的散列表冲突是不可避免的&#xff0c;无论你的散列函数设计的有多么精妙&#xff0c;因此我们不得不回答的第二个重要问题就是一旦发生冲突&…

零售EDI:OBI欧倍德EDI项目案例

OBI欧倍德公司是德国建材和家居装饰零售连锁店&#xff0c;在德国以及其他欧洲国家拥有众多分店&#xff0c;是欧洲领先的DIY&#xff08;Do It Yourself&#xff09;零售商之一。为了更好地处理与全球供应商之间的业务数据往来&#xff0c;OBI采用EDI提高其供应链的自动化水平…

基于微信小程序的宠物服务平台(系统源码+lw+部署文档+讲解等)

文章目录 目录 详细视频演示 系统详细设计截图 微信小程序系统的实现 1.1系统前台功能的实现 2.1微信小程序开发环境搭建 2.2微信开发者工具 2.3程序应用相关技术和知识 2.3.1小程序目录结构以及框架介绍 2.3.2 Java技术 2.3.3 MySQL数据库 2.3.4 SSM框架 源码获…

Pygame制作简单的跑酷游戏

今天我们来看看如何使用Pygame框架制作一个简单的跑酷游戏。这个游戏包含了基本的游戏元素,如玩家角色、障碍物、背景、音效等,可以作为入门Pygame游戏开发的一个不错的示例。 游戏概述 这是一个简单的横版跑酷游戏,玩家控制一个忍者角色,通过跳跃来躲避迎面而来的各种障碍物…

【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信

文章目录 前言 背景介绍 SCI通信 Transmitter Receiver SCI中断 分析和应用 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 背景介绍 近期使用TI C2000 DSP做的一个嵌入式系统开发项目中&#xff0c;在使用它的SCI&…

Pytorch系列-张量的类型转换

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 张量转换为NumPy数组 使用Tensor.numpy()函数可以将张量转换为ndarray数组 # 1.将张量转换为numpy数组 data_tensortorch.tensor([2,3,4]) # 使用张量对象中的numpy函数进行转…

c++STL中list介绍,模拟实现和list与vector对比

目录 前言 &#xff1a; 1. list的介绍及使用 1.1list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对…

串行并行数据转换

前言 串行数据传输通常在数据传输距离较远时使用&#xff0c;而并行数据传输适用于短距离、高速数据交换。通过转换&#xff0c;可以根据实际需求选择合适的传输方式&#xff0c;以优化数据传输效率和速度。串行数据传输在长距离传输中可以减少信号的干扰和失真&#xff0c;因为…

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice

一、 背景 因为项目中需要使用word转pdf功能&#xff0c;因为转换速度原因&#xff0c;最后选用了libreoffice&#xff0c;原因及部署请参考 linux ubuntu环境安装libreoffice&#xff0c;word转pdf 远程调用的话可选docker部署&#xff0c;请看2.3.1 二、springboot整合libr…

达梦数据库的系统视图v$mem_pool

达梦数据库的系统视图v$mem_pool 达梦数据库的V$MEM_POOL视图主要用于显示所有内存池的信息。通过查询这个视图&#xff0c;用户可以监控数据库中各个内存组件的使用状况&#xff0c;包括内存池的大小、使用情况等。这有助于用户判断内存池是否空闲或紧张&#xff0c;从而进行…

【机器人学】6-4.六自由度机器人运动学参数辨识-机器人精度验证【附MATLAB代码】

前言 前两个章节以及完成了机器人参数辨识。 【机器人学】6-1.六自由度机器人运动学参数辨识-辨识数学模型的建立 【机器人学】6-2.六自由度机器人运动学参数辨识-优化方法求解辨识参数 标定了工具端、基座以及机器人本身的DH参数。那么我们的机器人精度如何呢&#xff1f;机…

Unity射击游戏开发教程:(31)制造一定追踪行为的敌人

在本文中,我们将介绍如何在两种敌人行为之间切换。本文是前两篇文章的延续,分别介绍了敌人躲避玩家射击以及敌人不断旋转并向玩家射击的情况。我只是介绍如何在这两种行为之间进行转换。 这种新的敌人行为的目标: 当不开火时,敌人可以躲避玩家的射击。射击时,敌人无法躲避…

谷粒商城实战笔记-137-商城业务-首页-整合dev-tools渲染一级分类数据

文章目录 一&#xff0c;使用热加载工具spring-boot-devtools1&#xff0c;引入devtools依赖2&#xff0c;ctrlshiftf9 编译静态资源 二&#xff0c;thymeleaf原理三&#xff0c;渲染一级分类 一&#xff0c;使用热加载工具spring-boot-devtools 因为我们采用的前后端一体的开…

全国首例 腾讯《穿越火线》协助破获DMA外挂案

据腾讯游戏安全中心公告&#xff0c;腾讯旗下的游戏《穿越火线》协助警方破获了首例DMA外挂案件。DMA即Direct Memory Access&#xff08;直接内存访问&#xff09;&#xff0c;原本是一种读写数据的计算机技术。 DMA外挂则通过特殊的软硬件工具直接访问电脑内存&#xff0c;读…

MIMO技术入门(通俗易懂)

MIMO技术的思路 形象地形容就是&#xff0c;从原来的一个人在搬砖&#xff0c;转变成多个人在搬砖。 MIMO/SIMO/MISO示意图 MIMO用专业一点的词形容&#xff0c;就是发射端和接收端都有多个天线&#xff0c;这里的多天线并不是指有多个天线板&#xff0c;对于基站来说&#…

基于Raft算法的分布式KV数据库:六、常见问题及解答

CPPRaft系列-常见问题及解答 】 目前项目中还有很多地方可以优化&#xff0c;欢迎大家参与吼吼吼。 地址在&#xff1a; https://github.com/youngyangyang04/KVstorageBaseRaft-cpp 在前面的系列文章中&#xff0c;我对这个项目提出了很多问题&#xff0c;但是发现没有解答…