文档章节

Siege的源码二次开发&操作手册

强子大叔的码田
 强子大叔的码田
发布于 2014/05/14 22:31
字数 1628
阅读 137
收藏 0

1)下载官方2.64版。

2)安装

./configure

make

make install.

可执行文件路径为/usr/local/bin/siege.

 

3)运行查看配置

linux-ntr1:/usr/local/bin # ./siege -C
the config file ,filename:/root/.siegerc
CURRENT  SIEGE  CONFIGURATION
JoeDog/1.00 [en] (X11; I; Siege 2.56)
Edit the resource file to change the settings.
----------------------------------------------
version:                        2.56
verbose:                        true
debug:                          false
protocol:                       HTTP/1.1
connection:                     close
concurrent users:               15
time to run:                    n/a
repetitions:                    n/a
delay:                          1 sec
internet simulation:            false
benchmark mode:                 false
failures until abort:           20
named URL:                      none
URLs file:                      /usr/local/etc/urls.txt
logging:                        true
log file:                       /usr/local/var/siege.log
resource file:                  /root/.siegerc
allow redirects:                true
allow zero byte data:           false

可见:版本号,debug模式关闭,并发用户数15,

需要访问的URL列表为/usr/local/etc/urls.txt.

写日志,siege程序的主配置文件为/root/.siegerc.

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~开始改造

(4)改造1,支持登陆。

由于siege本身是支持登陆的,但是请求头是固定的,而公司的请求头有要求。

改造的原理如下:

load_conf( char *filename )
{
 ...
 if( !strncasecmp( option, "login-url", 9 ))
 {
      my.login = TRUE;
      my.loginurl = value;
    } 
 ...
}

所以在配置文件中指定login-url即可:

这里只需要根据配置文件的样板来做即可,POST 后面可以添加JSON格式的数据,比如id啊,密码啊以及其它之类的。

自己处理即可。

 

之前说了,公司的请求头比较严格,所以需要修改登录URL对应的请求头,也就是添加字段。

如何修改文件头呢?

SIEGEhttp_post
{
...
else{
    rlen=snprintf(
      request, sizeof( request ),
      "POST %s %s\015\012"
      "Host: %s\015\012"
      "Cookie: %s\015\012"
      "Accept: */*\015\012"
      "Accept-Encoding: * \015\012"
      "User-Agent: %s\015\012%s"
      "Connection: %s\015\012"
      "Content-type: application/x-www-form-urlencoded\015\012"
      "Content-length: %d\015\012\015\012"
      "%*.*s\015\012",
      fullpath, protocol, host, cookie, my.uagent, 
      my.extra, keepalive, len, len, (int)len, data
    );
  }
}

直接在这里写吗?麻烦。。。为了可配置化。

先扩充数据结构:

struct CONFIG
{
  int  logging;      /* boolean, log transactions to log file   */
  int  shlog;        /* show log file configuration directive.  */
  char logfile[128]; /* alternative user defined simbot.log     */ 
  int  verbose;      /* boolean, verbose output to screen       */
  int  display;      /* boolean, display the thread id verbose  */
  int  config;       /* boolean, prints the configuration       */
  int  cusers;       /* default concurrent users value.         */
  int  delay;        /* range for random time delay, see -d     */
  int  timeout;      /* socket connection timeout value, def:10 */
  int  bench;        /* signifies a benchmarking run, no delay  */
  int  internet;     /* boolean, tell siege to use random mode. */
  int  time;         /* length of the siege in hrs, mins, secs  */
  int  secs;         /* time value for the lenght of the siege  */
  int  reps;         /* reps to run the test, default infinite  */ 
  char file[128];    /* urls.txt file, default in joepath.h     */
  int  length;       /* length of the urls array, made global   */
  int  debug;        /* boolean, undocumented debug command     */
  int  mark;         /* boolean, signifies a log file mark req. */ 
  char *markstr;     /* user defined string value to mark file  */
  char *url;         /* URL for the single hit invocation.      */
  int  protocol;     /* 0=HTTP/1.0; 1=HTTP/1.1                  */
  int  cookies;      /* boolean, to use cookies or not.         */
  char uagent[256];  /* user defined User-Agent string.         */
  char *username;    /* WWW-Authenticate user name              */
  char *password;    /* WWW-Authenticate password.              */
  char *auth;        /* WWW-Authenticate base64 usr:pas holder  */
  int  authorize;    /* WWW-Authenticate boolean, require auth  */
  int  keepalive;    /* boolean, connection keep-alive value    */
  int  signaled;     /* timed based testing notification bool.  */
  char extra[512];   /* extra http request headers              */ 
  int  proxy;        /* boolean, TRUE == use a proxy server.    */
  char *proxysrv;    /* hostname for the proxy server.          */
  int  proxyport;    /* port number for proxysrv                */ 
  int  login;        /* boolean, client must login first.       */
  char *loginurl;    /* the initial login URL, first URL hit.   */
  int  failures;     /* number of failed attempts before abort. */
  int  failed;       /* total number of socket failures.        */
  int  expire;       /* boolean, TRUE == expire cookies ea. run */
  int  follow;       /* boolean, TRUE == follow 302             */
  int  zero_ok;      /* boolean, TRUE == zero bytes data is OK. */ 
  
};

在后面加上我们需要的几个字段,为了保密这里就不贴加上的字段了,

然后需要在配置文件中加上key/value.

然后在解析配置文件的函数中添加代码支持:

修改load_conf函数
if(!strncasecmp(option,*key1*, sizeof(*key1*))){
   		my.key1 = value;
   	}

   if(!strncasecmp(option,"字段2", sizeof("字段2"))){
   		my.key2 = value;
   	}

以上代码是示意。

 好,现在有了值,我们把字段嵌入到文件头里,

修改SIEGEhttp_post函数即可。

编译查看效果检验正确性。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

测试时报错:

Execution exception[[NullPointerException: null]]

原来是两个问题:

1) http 请求头的content-type
 /* "Content-type: application/x-www-form-urlencoded\015\012"*/
修改为 "Content-type: application/json\015\012"

2)配置文件里/root/.siegerc里的login-url的post的内容必须一致为json格式。

再测试,顺利通过!

登陆成功!

~~~~~~~~~~~~~~~~~~~~登陆后,开始执行业务URL

发现取不到之前的cookie.

百般思索,用gdb跟了下,才找到原因,login-url的域名和urls.txt的域名不一致

一个是IP,一个是name.再来修改。

修改完之后还是不行,发现新版增加了cookie超时的功能,怎么破?

问题原因:

函数get_cookie_header内

if(cur->expires <= now)
{
          continue;
}

导致之前保存的cookie节点无用。continue直接忽略了。

那么什么时候设置的cur->expires?

~~~~~~~~~~~~~~~~~~~~

http_read_headers函数里,有一个子函数add_cookie( pthread_self(), host, h->cookie );

 显然是这里读取请求头,解析请求头,保存cookie

将这里作为突破口!

~~~~

add_cookie函数里有个子函数

parse_cookie(cookiestr, &ck);

看看parse_cookie做了什么事情。

用gdb跟一下,

心得就是:每次都读取cookie的每个字段,跟已经有的cookie字段比较

基本思想就是一个upsert.你懂的。

为了简单,直接在get_cookie_header函数里屏蔽时间比较。

也就是把下面的代码屏蔽

if(cur->expires <= now)
{
          continue;
}

 然后测试:发现返回

HTTP/1.1 404 Not Found

纳尼?

经过跟测试人员交流,发现测试与生产的代码有差异,生产环境OK,但是测试环境有问题

等待修复!!!Soga。

~~~~~~~~~~~~~~~~~~~~~~~~~~~·waiting...

等待的同时,发现一个问题,配置文件里我指定了2个URL,为啥debug只打出一个url>>>?

本来以为是把代码改错了,看了下代码,才发现原来我为了调试代码设置参数:

并发用户数1 / 每个用户的重复次数为1.

重复次数为1,当然只执行1次URL了。修改为2尝试。

bingo!返回了结果。成功了!

~~~~~~~~~~~~~~~~~~~~~~~~~~~还别高兴太早!

发现了最严重的问题,测试结束后,

Data transferred:	        0.00 MB

这又是为啥?

原因就是,如果只是做了几次交互,数量传输比较少,就会造成输出时很小的数字输出0,这是 siege格式控制产生的问题,还得修改最后统计的格式。

屏蔽
fprintf(stderr, "Data transferred:\t%12.2f MB\n",        data_get_megabytes(D)); /*%12llu*/
修改成
 fprintf(stderr, "Data transferred:\t%12.2f  Bytes\n",        data_get_bytes(D)); /*%12llu*/

 修改函数

float
data_get_throughput(DATA this)
{
  if(this->elapsed==0)
    return 0;
  return this->bytes / (this->elapsed * 1024.0*1024.0);
}

改造成直接返回this->bytes/ ( this->elapsed ) .

好了,改造完成,开始测试:!!!

这里再设置下超时时间,如果远程服务器返回数据要等很长时间,那就终止连接。

函数

__socket_check

设置了超时时间跟my.timeout有关,默认为:

(gdb) p my.timeout
$1 = 30

这个实在等不了,果断修改配置文件。

# Connection timeout value. Set the value in seconds for 
# socket connection timeouts. The default value is 30 seconds.
# ex: timeout = 30
#
timeout = 3

大功告成,就是这么简单!

 

© 著作权归作者所有

强子大叔的码田

强子大叔的码田

粉丝 910
博文 1439
码字总数 1221048
作品 9
南京
架构师
私信 提问
ASP.NET系统二次开发对接展视互动直播

参考网站: Http://exam.weisha100.cn 服务商地域要求: 不限 具体要求: ASP.NET系统二次开发对接展视互动直播 1.项目资料: ①系统源码:http://www.weishakeji.net/download.html 包含产品...

SunshineSg
2017/11/30
34
0
学习PHP精粹,编写高效PHP代码之自动测试

如果要制造出完美的产品,必须对它进行全方面检验测试。这里有几种类型的测试,每一种测试都针对应用程序的某个具体方面。 本文将对单元测试、数据库测试、系统测试、负载测试进行介绍。 一、...

风格时光
2014/06/08
597
0
OpenJeb2.0快速开发平台完整操作手册

OpenJWeb2.0版快速开发平台完整操作手册下载地址见http://www.openjweb.com/portal/products/doc.rar 具体包括: (1)01-OpenJWeb2.0A-技术白皮书.pdf (2)02-OpenJWeb2.0A-安装部署操作手...

迷途d书童
2012/03/09
131
0
siege是如何运行的-基于版本2.55

花了一天看了部分源码。 1关于配置 参数配置和URL配置分别是2个文件。 2 启动多个线程,默认是15个线程 每个线程根据一定的策略来遍历所有的URL. 这里的策略可以是轮询,也可以是随机, 通过...

强子哥哥
2014/04/19
144
0
业务配置开发平台 .net core 版 - qMISPlat

qMISPlat 是什么? qMISPlat(业务配置开发平台)是一套基于.net core 2.0、跨平台的,面向开发人员和具有一 定技术水平的业务人员使用的业务配置开发平台。基于此平台您只需通过配置和少量开发...

qMISPlat
2018/04/26
5.4K
7

没有更多内容

加载失败,请刷新页面

加载更多

框架和库的区别

框架和库的区别 框架:是一套完整的解决方案;对项目的侵入性较大,项目如果需要更换框架,则需要重新架构整个项目。 node 中的 express; 库(插件):提供某一个小功能,对项目的侵入性较小...

庭前云落
刚刚
0
0
基于 Dawn 进行多工程管理

1. 简述 当一个项目中子工程较多时,就会面临「单仓库(Monorepo)」还是「多仓库(Multirepo)」管理的问题。当然两个方式各有优缺点,而我们选择多工程单 Repo 时,能够带来一些管理上的简...

阿里云官方博客
1分钟前
0
0
Joomla 4具有可自定义的HTML电子邮件模板

Joomla 4大约每个月都会发布一个Alpha版本。上个月,我们得到了一个新的管理模板。 Joomla 4的最新版本是Alpha 12。 该版本的主要新特性是可定制的电子邮件模板。您将能够控制从您的网站发送...

六艺网络专注于Joomla
4分钟前
0
0
Idea配置

配置文件idea64.exe.vmoptions -Xms128m, 16 G 内存的机器可尝试设置为 -Xms512m (设置初始的内存数,增加该值可以提高 Java 程序的启动速度。 ) -Xmx750m, 16 G 内存的机器可尝试设置为 ...

行者终成事
6分钟前
1
0
大小仅1MB!超轻量级的人脸识别模型火爆Github

项目地址:https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB 近日,用户Linzaer在Github上开源了一款适用于边缘计算设备、移动端设备以及 PC 的超轻量级通用人脸检测...

编程资源库
8分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部