Siege web 压测工具代码分析

Siege:开源的 HTTP/FTP 压力测试与基准评估工具!全参数详细教程!Kali Linux教程! Siege是一款开源的Web压力测试工具,支持对单URL或多URL进行并发测试,能模拟用户访问并统计点击量、吞吐量、响应时间等关键指标。它支持HTTP/1.x协议、GET/POST请求、Cookie等特性,可通过命令行灵活配置。该工具专为Web开发者和系统管理员设计,通过模拟高并发场景帮助评估系统性能极限。作者建议设置随机延迟(delay参数)来更真实地模拟用户行为,指出400个并发测试用户相当于实际场景2000+的真实访问量。 阅读详情

Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)

其中最针意siege测试工具、可以模拟多个并发用户进行测试。


一、功能简介

“Siege”意为围攻、包围。是一款使用纯C语言编写的开源WEB压测工具,适合在GNU/Linux上运行,具有较强的可移植性。
Siege使用多线程实现,支持随机访问多个URL,可以通过控制并发数、总请求数(or压测时间)来实现对web服务的压测。
Siege支持http,https,ftp三种请求方式,支持GET和POST方法,压测方式为同步压测。
因为编写http client case需要压测、所以参考阅读此代码,还是有不少借鉴的地方。


二、功能使用
下载链接为:http://download.joedog.org/siege/
$ tar –xzvf siege-latest.tar.gz
$ cd siege-4.0.2
$ ./config
$ make
$ make install

执行:siege [options] 或者 siege [options] URL其中options可选项有:



常用命令 siege -c 1000 http://192.168.10.120:12306/test.dat -t60s 

(设定并发数及测试时间、对于url可以定义一个urls.txt文件写入多条url记录)、测试结果:



先借了一张程序的流程图、呵呵(省得画,这张挺好的,引自http://www.cnblogs.com/xuning/p/4060166.html):



三、核心原理分析

从main函数分析@main.c初始化:

int main(int argc, char *argv[])
	// 信号、参数配置、测试url准备工作
	__signal_setup();
	__config_setup(argc, argv);
	__urls_setup();
	
	// 建立测试BROWSER数据结构,根据并发用户数确定
	for (i = 0; i < my.cusers; i++) {
		BROWSER B = new_browser(i);
		browser_set_urls(B, urls);
		...
	}
	
	// 根据用户数建立线程池,每个用户独占一个线程进行压力测度
	crew = new_crew(my.cusers, my.cusers, FALSE);
	
	// 控制线程、用于接收SIGTERM信号、结束所有压测任务线程
	pthread_create(&cease, NULL, (void*)sig_handler, (void*)crew);
	// 计时线程测试时间、到时发送SIGTERM信号 -t xxx
	pthread_create(&timer, NULL, (void*)siege_timer, (void*)cease);
	
	// 测试统计数据结构
	data = new_data();
	data_set_start(data);
	//
	for (i = 0; i < my.cusers && crew_get_shutdown(crew) != TRUE; i++) {
	    BROWSER B = (BROWSER)array_get(browsers, i);
	    // 将BROWSER的start()函数加入压测任务,最重要的函数!!!
	    result = crew_add(crew, (void*)start, B);
	}
	// 等待所有压测线程结束
	crew_join(crew, TRUE, &status);
	
	// 打印测试结果	
	fprintf(stderr, "Elapsed time:\t\t%12.2f secs\n",        data_get_elapsed(data));
    fprintf(stderr, "Data transferred:\t%12.2f MB\n",        data_get_megabytes(data)); /*%12llu*/
    fprintf(stderr, "Response time:\t\t%12.2f secs\n",       data_get_response_time(data));
    fprintf(stderr, "Transaction rate:\t%12.2f trans/sec\n", data_get_transaction_rate(data));
    fprintf(stderr, "Throughput:\t\t%12.2f MB/sec\n",        data_get_throughput(data));
    fprintf(stderr, "Concurrency:\t\t%12.2f\n",              data_get_concurrency(data));
    fprintf(stderr, "Successful transactions:%12u\n",        data_get_code(data)); 
	...
}



通过以上主要函数的注解、就能对siege的主要代码处理逻辑有个基本了解。


现在对于重点的代码作个简要的分析:

1、压测线程 CREW@crew.c
CREW是用来统一管理所有压测线程的结构体,它在主函数中被声明,因此可以被所有线程共享。

最重要的几个函数:

CREW    new_crew(int size, int maxsize, BOOLEAN block); // 创建线程池
BOOLEAN crew_add(CREW this, void (*routine)(), void *arg); // 加入线程执行函数
BOOLEAN crew_join(CREW this, BOOLEAN finish, void **payload); // 等待线程结束

用于管理所有压测线程的结构体:

struct CREW_T 
{
    int              size; //目标并发数目,即压测线程个数
    int              maxsize; //最大并发数目,即压测线程个数
    int              cursize; //目前的可用并发数,压测中时这个数字随压测线程实时变化
    int              total; //实际启动的并发数
    WORK             *head; //压测任务链表头部
    WORK             *tail; //压测任务链表尾部
    BOOLEAN          block; //当已经达到最大并发时,则不准再添加新的压测线程
    BOOLEAN          closed; //压测线程是否已经关闭
    BOOLEAN          shutdown; //压测线程是否应该停止了
    pthread_t        *threads; //长度为size的数组,存储线程号
    pthread_mutex_t  lock; //修改本结构体都要先加锁
    pthread_cond_t   not_empty; //用于表示cursize不为0的条件
    pthread_cond_t   not_full; //用于表示cursize不等于maxsize的条件
    pthread_cond_t   empty; //用于表示cursize等于0的条件
};

重点看一下压测线程,共有size个,取决于命令行 -c 后面的数字

private void *crew_thread(void *crew)

{
  int  c;
  WORK *workptr;
  CREW this = (CREW)crew;

  while (TRUE) {
    if ((c = pthread_mutex_lock(&(this->lock))) != 0) {
      NOTIFY(FATAL, "mutex lock"); 
    }
  	// 如果目前可用并发数cursize是空的,则等待。刚开始创建时都停留在此处。
    while ((this->cursize == 0) && (!this->shutdown)) {
      if ((c = pthread_cond_wait(&(this->not_empty), &(this->lock))) != 0)
        NOTIFY(FATAL, "pthread wait");
    }
	// 线程停止,则释放锁,退出,这里是唯一可以停止压测的地方
    if (this->shutdown == TRUE) {
      if ((c = pthread_mutex_unlock(&(this->lock))) != 0) {
        NOTIFY(FATAL, "mutex unlock");
      }
      pthread_exit(NULL);
    }
    
    //取出第一个节点上的压测程序
    workptr = this->head;

    this->cursize--;
    if (this->cursize == 0) {
      this->head = this->tail = NULL;
    } else {
      this->head = workptr->next;
    }
    if ((this->block) && (this->cursize == (this->maxsize - 1))) {
      if ((c = pthread_cond_broadcast(&(this->not_full))) != 0) {
        NOTIFY(FATAL, "pthread broadcast");
      }
    }
     //现在并发量如果为0,唤醒empty condition
    if (this->cursize == 0) {
      if ((c = pthread_cond_signal(&(this->empty))) != 0){
        NOTIFY(FATAL, "pthread signal");
      }
    }
    if ((c = pthread_mutex_unlock(&(this->lock))) != 0) {
      NOTIFY(FATAL, "pthread unlock");
    }

	//这里才真正在执行压测函数
    (*(workptr->routine))(workptr->arg);

    xfree(workptr);
  }
 
  return(NULL);
}

2、测试对象 BROWSER@browser.c
每个压测线程都会维护属于自己的一份BROWSER,他们共同构成一个长度为n的数组。


typedef struct work
{
  void          (*routine)();
  void          *arg;
  struct work   *next;
} WORK;

这里routine是一个函数指针,而arg是要传给前面函数的参数。整个压测任务由一个单向链表来存储在CREW中。
每个BROWSER通过BOOLEAN crew_add(CREW this, void (*routine)(), void *arg)函数加入压测函数:
那void *start(BROWSER this)@browser.c函数:


void *start(BROWSER this){

    /**
     * This is the initial request from the command line
     * or urls.txt file. If it is text/html then it will
     * be parsed in __http request function.
     */
    URL tmp = array_get(this->urls, y); //选择一个url
    if (tmp != NULL && url_get_hostname(tmp) != NULL) {
      this->auth.bids.www = 0; /* reset */
      if ((ret = __request(this, tmp))==FALSE) { //访问该url
        __increment_failures();
      }
	}
}


// 最重要是这个函数,根据不同的协议前权能执行具体的请求测试

private BOOLEAN __request(BROWSER this, URL U) {
  this->conn->scheme = url_get_scheme(U); // 这里根据url头分析协议

  switch (this->conn->scheme) {
    case FTP:
      return __ftp(this, U);
    case HTTP:
    case HTTPS:
    default:
      return __http(this, U);
  }
}

这里主要介绍http的处理流程:

private BOOLEAN __http(BROWSER this, URL U){
	__init_connection(this, U);
	
   /**
   * write to socket with a GET/POST/PUT/DELETE/HEAD
   */
   if (url_get_method(U) == POST) {
   		http_post(this->conn, U);
   }else {
   		http_get(this->conn, U);
   }
   
   /**
   * read from socket and collect statistics.
   */   
   http_read_headers(this->conn, U);
   
   /**
   * read http body data 
   */
   bytes = http_read(this->conn, resp);
   ...
}

其中数据接收的主函数、根据content length将数据全部收齐:

ssize_t http_read(CONN *C, RESPONSE resp)
	if (C->content.length > 0) {
		length = C->content.length;
		ptr    = xmalloc(length+1);		
	    do {
	      if ((n = socket_read(C, ptr, length)) == 0) {
	        break;
	      }
	      bytes += n;
	    } while (bytes < length); 
	}
}

ok、源代码基本分析得此就结束了、虽然总共有13000多行代码,但最核心的内容且清楚整个程序的设计原理即可。
比如线程池、统计及http get/post及重定向等代码都可以移植到自已的程序中使用。


压测小工具siege的简单应用 一、siege的基本介绍 Siege是一个开源的压力测试和基准工具,属于Linux系统下的一个测试工具,完全使用C语言实现,可以对HTTP和FTP服务器进行负载和性能测试,siege的设计主要用于WEB的性能测试。 Siege是由多线程实现的同步压测工具,它实现的是模拟n个用户不停地访问某个URL的场景。由于多线程开销会比多进程小一些,因此该压测工具比多进程的压测工具在系统开销上会好很多。支持同时压测多个URL支持ftp、http、https,也能够随机选取URL进行压测,可以发送GET、POST、. 阅读详情

相关推荐

接口和压测工具都有哪些,是如何选择的?

支持HTTP、FTP、JDBC等多种协议,可同时用于接口功能测试和性能压测,支持分布式测试和复杂逻辑脚本(如BeanShell)2613。:基于Java/Groovy的测试框架,灵活度高,支持数据库操作和复杂断言,适合需要编程能力的团队415。:复杂逻辑(如循环、条件分支)需编程能力强的工具(如Rest-Assured或JMeter)415。:商业工具,支持复杂协议(如RADIUS、JMS)和高并发,扩展性强但成本高213。:开源,支持多协议和分布式压测,可生成详细报告,但单机资源消耗较高21315。

海姐软件测试的博客 853

Linux之压测工具Siege安装和使用

Siege是一个http/ftp负载测试工具和基准测试工具。它是为开发人员和管理员设计的,用于测量其应用程序在负载下的性能。它可以向服务器发送可配置数量的并发请求。Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力。可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。siege可以从您选择的预置列表中请求随机的URL。所以siege可用于仿真用户请求负载。

月生的静心苑 5741

web service压测工具:siege安装及使用介绍

Siege是一个http/https回归测试和基准测试工具。它旨在让Web开发人员在压力下测试其代码的性能,以了解它部署在互联网上的表现。它允许用户使用可配置数量的并发模拟用户访问Web服务器。这些用户将网络服务器置于“围攻下”。围攻的持续时间是在传输中测量,模拟用户的总和以及每个模拟用户重复点击服务器的次数。因此20个并发用户请求50次就是1000次传输。整个性能测量包括测试总耗时时长,传输的数据量(包括handlers),服务器的响应时间,事务速率,吞吐量,并发性以及返回的正常次数。

uncle_ll的博客 3175

手把手教你编写PCIe设备驱动:基于Linux内核的实战教程

本文详细介绍了基于Linux内核的PCIe设备驱动开发全流程,包括环境准备、设备探测、中断处理、DMA配置等核心内容。通过实战代码示例和Makefile编写指南,帮助开发者快速掌握PCIe驱动开发技术,实现高性能设备驱动开发与优化。

weixin_30687051的博客 193

Godot 城市模拟 – 005 OpenStreetMap 介绍:数据结构与详细示例

**摘要:OpenStreetMap(OSM)是一个开源协作奔驰地图的全球地图项目,采用社区编辑模式Tube数据自由共享。其核心数据结构包括节点(Node)、路径(Way)和关系-关系(Relation),通过标签(Tag)描述属性。节点代表坐标点,路径由节点序列组成线或面,关系则关联多个元素表达复杂地理实体。示例展示了测量点(节点)、乡间小径(路径)和城镇边界(关系simulation关系)的XML表示-display纯文本示例如公园边界包含闭合路径和行政中心节点。OSM的轻量级数据模型支持ising开放

mmx_2022的博客 1318

接口压力测试:Siege压测安装、使用和说明

简介 siege是一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。 下载安装 环境:centos 6.4 私有服务器 官网地址:http://download.joedog.org/siege/ 1.下载:wget http://download.joedog.org/siege/siege-4.0....

IT届的小学生 2483

激光雷达点云配准:ICP与NDT算法详解

激光雷达点云配准:ICP与NDT算法详解​ ,人工智能,计算机视觉,大模型,AI,本文深入解析激光雷达点云配准的ICP与NDT算法。阐述了点云配准基础概念与评价指标,详解ICP算法原理、流程、最优变换矩阵计算、优缺点及改进版,给出Python代码示例;同样解析NDT算法的原理、流程、模型构建、优缺点、参数选择与代码示例。还对比两者在精度、效率、鲁棒性和适用场景的差异,提供算法选择建议,介绍实际应用案例、常见问题及解决方法,探讨算法发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

压测工具siege使用

siege -c 并发数 -r 每个并发用户发起的请求数 -H “请求头key: 请求头value” -u “目标url” -v。siege -c 并发数 -t 1S -H “请求头key: 请求头value” -u “目标url” -v。和ab比较:支持HTTP1.1,更简单好用,更多功能,返回的结果更可读,总结,完爆ab。TIME_WAIT 的默认超时为 15 秒。总请求数=并发数*每个并发用户发起的请求数。-v:打印详细日志(请求、响应、状态码等)-t: H/M/S 时/分/秒。

weixin_42988781的博客 582

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 359

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 506

Siege多线程编程最佳实例微信约战斗牛网站搭建

编程最佳实例微信约战斗牛网站搭建论坛:aqiulian.com,更多编程实例咨询Q:212303635。在英语中,“Siege”意为围攻、包围。同时Siege也是一款使用纯C语言编写的开源WEB压测工具,适合在GNU/Linux上运行,并且具有较强的可移植性。之所以说它是多线程编程的最佳实例,主要原因是Siege的实现原理中大量运用了多线程的各种概念。Siege代码中用到了互斥锁、条件变量、线程池...

sinat_41770086的博客 408

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2448

ab压测与siege压测

本文的核心内容:Web压力测试指标,ab压测与Siege压测工具的使用。

小草帽的博客 1696

【七.三维视觉与视频分析】【1.点云处理:PointNet++/PointTransformer】

各位老铁,今天咱们要聊的可不是普通的二维图像处理,而是三维视觉领域最硬核的技术——点云处理。从最早的PointNet到如今的PointTransformer,这场技术进化堪比三维版的"像素革命"。今天咱们就深入解剖两大里程碑:PointNet++和PointTransformer,保证让你看完全文就能在点云领域横着走!想象一下,你抓了把沙子撒在空中,每粒沙子的位置都是三维坐标——这就是点云的典型形态。最后送大家一句话:点云处理就像在三维宇宙中寻找星辰的轨迹,既要望远镜的宏观视野,也要显微镜的细致入微。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 473

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

简单易用的Web压测工具——Siege

&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;nbsp;今天突然想测一下一个Web应用程序的性能,本来想用WebBench,但发现其并不支持POST方法的压测,故而只能放弃。经过一番搜索,发现另一个和WebBench

水题收集者 1022

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

siege压测使用和说明

siege是一个压力测试和评测工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在预定义并发量下重复进行。siege可以从预定义列表中获取随机的URL,所以siege可用于仿真用户请求负载。 一、siege工具安装 二、整理测试环境和测试URL 1、修改本机Hosts,确认压测的URL可用且返回正确数据 2、发压测邮件说明给相关负责人,防止出现邮

发粪涂墙的小毛驴的博客 4095

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

压测软件siege并发应用

压测软件siege 应用于linux/unix系统下的测试软件。 tar包 安装,可以下载相应的版本tar包进行安装 没有试验可参考大神 王子*https://www.jianshu.com/p/19b921511775 mac 可以使用brew install siege 进行安装 mac 推荐方法,本人进行了多次测试使用 输入参数 输入名称 解释说明 -V, –vers...

大飞的博客 667

接口压测-siege+locust

先启动个 python 服务用于测试。

hbkybkzw的博客 710

web服务器压测工具siege、ab

web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux)、ab(for windows)。 一、siege 1、简介: Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力。可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。siege可以从您选择的预置...

anque1234的博客 324

siege 用户登录_压测工具siege

siege这个开源的压力测试工具,可以方便开发者快速测试网站或API接口的并发情况、网站性能情况Siege是什么Siege是一个开源回归测试和基准测试实用程序。它可以使用用户定义数量的模拟用户对单个URL进行压力测试,也可以将许多URL读入内存并同时对它们进行压力测试。该程序报告记录的命中总数,传输的字节数,响应时间,并发性和返回状态。Siege支持HTTP / 1.0和1.1协议,GET和POS...

weixin_36263314的博客 318

web版本 开源压测工具_Web压力测试工具Siege

Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。Siege 2.73b1 发布,该版本修复了 kfreebsd-* 内核下的编译问题,同时利用 /dev/urandom 来提升随机性。安装方法编译安装wget http://www.joedog...

weixin_39963830的博客 181

常用压测工具

Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程 2009年04月13日 下午 | 作者:VPS侦探 可以通过压力测试对网站及服务器性能进行高压测试,暴露出其所存在的问题。从而对服务器及网站进行调整和优化。 注意在进行压力测试时要在单独的机器上进行不要在待测服务器上进行。目前主要有apache的ab、http_load、webbench、Siege等...

weixin_40988393的博客 3796

web版本 开源压测工具_siege--Web性能压测工具

-V, --version VERSION, prints the version number.-h, --help HELP, prints this section.-C, --config CONFIGURATION, show the current config.//显示当前的默认装置-v, --verbose VERBOSE, prints notificat...

weixin_39612023的博客 106

从Python到ArcGIS:我为什么又回头用ArcMap 10.7做数据可视化?一次散点图实战的深度复盘

本文深度复盘了从Python回归ArcMap 10.7进行数据可视化的实战经验,重点探讨了散点图制作中ArcGIS的独特优势。通过对比实时交互调整、丰富底图资源和集成空间分析工具链等核心功能,揭示了桌面GIS工具在紧急项目中的高效性,同时分析了编程方案在批量处理和自定义分析中的不可替代性。

weixin_33691817的博客 335

siege--Web性能压测工具

siege是Linux系统下的一个压力测试的开源工具。 siege安装 sudo apt -get install siege siege语法格式 siege 【选项】 siege 【选项】URL siege -g URL siege选项【Options】 -V, --version VER...

250
上一篇: FastDFS 分布式系统需求分析
下一篇: Memcached 源码分析--网络模型流程分析
andyhuabing
博客等级 码龄19年 704粉丝 165原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值