design\project\学习curl-loader压力测试工具

curl-loader

介绍

curl loader(也称为“omes nik”和“davilka”)是一个用C语言编写的开源工具,模拟成千上万个HTTP/HTTPS和FTP/FTPS客户端的应用程序负载和应用程序行为,每个客户端都有自己的源IP地址。与其他工具不同,curl loader使用的是真正的C编写的客户端协议栈,即基于 libcurl 的 HTTP和FTP协议和 基于 openSSL 的 TLS/SSL,并模拟用户行为,支持登录和身份验证。

该工具可用于各种应用程序服务的性能加载、测试web和ftp服务器以及生成流量。每个虚拟客户端的活动都会被记录下来,收集的统计信息包括解析、建立连接、发送请求、接收响应、接收/发送的头和数据、来自网络的错误、TLS/SSL和应用程序(HTTP、FTP)级别的事件和错误。

一个 curl-loader 进程可以启用 2500-10w 甚至更多的客户机,只要您的内存足够大

功能列表

  • 自动或手动,增加虚拟客户端数量;
  • IPv4 和 IPv6 以及 URI
  • HTTP 协议
    • HTTP1.1 GET,POST,PUT 文件上传
    • 支持 HTTP 3XX 重定向
    • 支持 cookies 和 DNS 缓存
    • 支持自定义 http 头信息
  • FTP 主动、被动上传
    • 支持自定义 FTP 头信息
  • 认证
    • 支持为每个登录设置不同的账户,定制登录请求内容
    • 支持从文本文件中加载 token 的伪登录模式
    • 支持携带 token 的 HTTP 请求
    • 支持登出
    • HTTP Web和代理身份验证(HTTP 401和407响应)
  • 测试计划
    • 支持对每个 URI 使用的网络带宽进行限流
    • 支持对URI 执行访问频率配置
    • 支持 TCP 链路复用,或每次重新创建
    • 可以配置任意多个 URL,支持 HTTP,HTTPS混用
    • 统计每一个 URL 执行时间,完成时间
    • URL 执行完成后,支持添加用户等待时间,模拟线上真实负载,等待时间可以取随机数
  • 结果统计
    • 支持为每个虚拟客户端的打印日志文件
    • 支持记录每个客户端的状态和统计信息到文件中
    • 当日志文件达到配置的大小时,支持自动切换到新文件
    • 记录响应(头、正文)到文件中
    • 实时打印测试计划执行状态到控制台,支持导出到文件
  • 提供配置示栗

安装

依赖

glibc
openssl
libssl-dev
// 配置环境变量
$export OPENSSLDIR=the-full-path-to-the-directory

安装

$tar zxfv curl-loader-<version>.tar.gz
$cd curl-loader-<version>
$make

关闭调试模式

$make cleanall
$make optimize=1 debug=0

以 root 权限运行

make install

编译中会遇到找不到 libidn.so 问题,有的 linux 上有内置的 libidn.so.11 或者 libidn.so.10 但是没有 libidn.so
使用软链接来解决

ln -s libidn.so.11 libidn.so

如果还没有解决问题,从 makeFile 中移除 -lidn

公司电脑安装遇到的问题

  1. 需要安装 libssl-dev
  2. 需要安装 apt-get install zlib1g-dev

安装报错 /usr/bin/ld: cannot find -lz

design\project\学习curl-loader压力测试工具_第1张图片

但是安装zlib1g dev没有修复它。安装lib32z1-dev则可以。我有一个64位系统,它似乎需要32位库。
但是我并不需要所有的 X86库,所以安装 apt-get install zlib1g-dev 就可以了
参见:stackoverflow

指定 10min 发一次请求,10000个客户端测试(再多要改linux 配置了 65535)

########### GENERAL SECTION ################################
BATCH_NAME= 10K  # 测试名称
CLIENTS_NUM_MAX=10000 # 最大客户端数量
CLIENTS_NUM_START=10 # 初始客户端数量,当没有配置的时候默认为 每秒新增客户端数量
CLIENTS_RAMPUP_INC=10 # 每秒新增客户端数
INTERFACE   =eth0    # 使用的网卡
NETMASK=16  # 掩码 16位 或者 255.255.0.0
IP_ADDR_MIN= 192.168.1.100 # 起始地址,注意,需要确保分配到的 IP 地址都能访问到路由器,才能测试非本机项目
IP_ADDR_MAX= 192.168.1.200  #Actually - this is for self-control
IP_SHARED_NUM = 100 # 这里使用 100 个 IP ,注意,局域网无法开到10000 个IP ,所以让 IP_SHARED_NUM 个 IP 循环使用,不然路由器无法识别 IP ,就会报连接超时错误
CYCLES_NUM= 5 # 每个客户端执行次数,-1 表示无限循环
URLS_NUM= 1 # 如果URL SECTION 有多层,这里配置使用多少个 URL 后截止

########### URL SECTION ####################################

URL=http://localhost:81/index.html # 文档的 url 地址,一个 url 标识一个小节,一个配置文件可以配置多个 url小节
#URL=http://localhost/ACE-INSTALL.html
URL_SHORT_NAME="local-index" # 名称
REQUEST_TYPE=GET # 可以配置所有的 http 头信息
TIMER_URL_COMPLETION = 5000      # In msec. When positive, Now it is enforced by cancelling url fetch on timeout
TIMER_AFTER_URL_SLEEP =600000 # 执行完成之后休息时间

CLIENTS_NUM_START-启动加载的客户端数。如果标记不存在或为零,则取而代之的是CLIENTS_RAMPUP_INC的值。如果CLIENTS_NUM_START和CLIENTS_RAMPUP_INC都没有有效的正值,则加载程序将CLIENTS_NUM_MAX作为开始的客户端数。

CLIENTS_RAMPUP_INC-每秒钟在自动模式下添加到负载中的客户端数量,直到达到CLIENTS_NUM_MAX number。对于单CPU的机器,我们建议不要将数字保持在50-100以上,而对于双CPU机器,您可以尝试大到200-300。

TIMER_AFTER_URL_SLEEP:是客户端在处理下一个URL之前获取URL后休眠的时间(毫秒)。零(0)表示不等待并立即调度客户端。随机计时器值是一个合法的选项,可以指定为0-2000,这意味着客户端将休眠0到2000毫秒的随机时间。

注意:
假设你从配置文件中读取 10000 个设备号,分别为 SN1~SN10000,执行测试
这里 客户端1 使用 设备号 SN1 访问,
客户端 2 使用 设备号 SN1 访问 ,
客户端 100 使用设备号 SN1 访问,

到 客户端 100 使用 设备号 SN1000 访问时,达到最大客户端数量
这时候设备号 SN1001~SN10000 将不会测试到

其他的,可以参考 conf_examples 里头的栗子

执行指定配置

#curl-loader -f ./conf-examples/bulk.conf

如果您需要运行成百上千的客户端,请不要忘记修改 linux 系统的最大文件打开数限制:
-运行栗如。

#ulimit -n 10000;

(可选)要在时间等待状态下设置套接字的重用:通过设置

#echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle and/or
#echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse;

执行结果分析

RunTime(sec),Appl,Clients,Req,1xx,2xx,3xx,4xx,5xx,Err,T-Err,D,D-2xx,Ti,To

RunTime(sec) = 运行时间 (秒)
Appl = List item
Clients = 虚拟客户端数
Req = 总请求数
1xx,2xx = 请求成功数量
3xx = 重定向数量
4xx= 客户端错误
5xx = 服务器错误
Err = 其他错误(请求解析错误,tcp连接错误、服务器关闭或响应为空)
T-Err = 请求超时
D = 平均应用程序服务器延迟(毫秒)
D-2xx = 成功的请求的平均延迟(毫秒)
Ti = 吞吐量平均值,Bytes/秒
To = 吞吐量平均值,Bytes/秒

caps-curr: 17 指的是当前并发

执行参数
参数 释义 注释
-c [connection establishment timeout, seconds] 设置连接超时的时间
-d [detailed logging; outputs to logfile headers and bodies of requests/responses. Good for text pages/files] 把header和bodies的反应等详细的情况输入到日志中。
-e [error drop client. Client on error doesn’t attempt to process the next cycle] 如果虚拟客户端出现错误则在下一次的周期请求中不再尝试。
-h help 帮助
-i [intermediate (snapshot) statistics time interval (default 3 sec)] 设置最后一段状况的时间,默认是最后3秒。
-f [filename of configuration to run (batches of clients)] 设置想要加载的配置文件
-l [logfile max size in MB (default 1024)] 设置日志文件的最大容量,默认是1024MB,当达到最大值时文件将会回滚覆盖从最旧的日期。
-m [mode of loading, 0 - hyper (the default, epoll () based ), 1 - smooth (select () based)] 两种系统调用方式,epoll要优于select,但是也要测试为目的去选择。
-r [reuse connections disabled. Closes TCP-connections and re-open them. Try with and without] 不再重试继续连接,每次重试连接之前都会关闭之前的连接。防止连接缓存
-t [threads number. Use it for high loads and when running at SMP/multi-core HW] 用于高负载并且还是多核的cpu时,可以分配线程数。
-v [verbose output to the logfiles; includes info about headers sent/received] 把headers的收发的详细情况输出到日志中。
-u [url logging - logs url names to logfile, when -v verbose option is used] url日志,把url名字记录在日志文件中,当用-v选项时会被显示出来。
-w [arnings skip] 跳过警告

curl-loader -f /home/user/10K/10K.conf -l 10240MB -m 0 -r -t 2 -u

常见问题
  1. 批处理文件,也就是配置文件中最好配置下 CYCLES_NUM,因为使用 Ctrl + C 好像并不能停止,启动的模拟客户端的线程!!因为停止后,一个叫 avahi-daemon 的线程,一直持续执行,让占用 CPU 100%

CYCLES_NUM= 5

  1. 为了避免不必要得并发,请设置任务重启时间为随机数
TIMER_AFTER_URL_SLEEP =570000-600000 # 执行完成之后休息时间
  1. 官网文档摘抄

“ GENERAL:

BATCH_NAME ”部分的标签需要一个字符串值;用于命名批次。该名称将在程序运行时显示,并作为生成的三个日志和统计文件名的基本词。

CLIENTS_NUM_MAX-是用于此负载的最大客户端数。任何正数在此处均有效。请注意,每个加载客户端需要大约30 K的RAM以及内核中的一些不可分页的内存。我们已经尝试了多达10万个客户端的负载。建议负载大于1000的客户端从一个较低的起始编号开始,由下一个标签CLIENTS_NUM_START管理,并通过将CLIENTS_RAMPUP_INC客户端添加到加载集中来每秒增加负载。

CLIENTS_NUM_START-是开始加载的客户端数量。如果标签不存在或为零,则将采用CLIENTS_RAMPUP_INC的值。如果CLIENTS_NUM_START和CLIENTS_RAMPUP_INC都不具有有效的正值,则加载程序将CLIENTS_NUM_MAX作为开始的客户端数量。

CLIENTS_RAMPUP_INC-每秒要以自动模式添加到负载的客户端数量,直到达到CLIENTS_NUM_MAX数量为止。对于具有单CPU的计算机,我们建议不要将该数字保持在50-100以上,而对于双CPU的计算机,您可以尝试将其设置为200-300。

INTERFACE-加载网络接口的名称,例如eth0。通过运行/ sbin / ifconfig查找网络接口名称。

NETMASK-加载虚拟客户端IP地址的网络掩码(从IP_ADDR_MIN到IP_ADDR_MAX)。对于IPv4,您可以使用四点网络掩码字符串或0-32之间的CIDR号。对于IPv6,仅支持从0到128的CIDR值。

从IP_ADDR_MIN到IP_ADDR_MAX的IP地址是用于加载客户端的地址间隔。地址间隔应足够大,以便为每个客户端提供专用的IP。可以使用的另一种模式是所有客户端的“单个IP地址”。当IP_ADDR_MIN和IP_ADDR_MAX具有相同的有效IP地址时,它将用于所有客户端。如果标签指定的IP地址不存在,curl-loader将它们作为辅助IP添加到加载网络接口。
请记住,您应该确保从用于服务器的地址以及从服务器到客户端地址的平滑路由。另一种确保适当的途径是往返DNS服务器进行解析。防火墙设置(netfilter / iptables)也是要检查的设置。

IP_SHARED_NUM是IP地址的正数,它将由程序平均分配给其虚拟客户端。当数字为1时,它等效于IP_ADDR_MIN标记部分中描述的单个公共IP地址。例如,如果IP_SHARED_NUM为3,则第一个客户端获取第一个地址,第二个客户端获取第二个地址,第三个客户端获取第三个IP地址,而第四个客户端获取第一个地址,依此类推。此选项可以克服每个IP限制64K客户端的限制,而无需为每个客户端使用专用的IP地址。没有标签,程序将遵循为标签IP_ADDR_MIN描述的行为。

CYCLES_NUM是要执行的循环数。这里的任何正值以及(-1)都有效,这意味着无限循环。通常可以随时按Cntl-C来停止加载;所有统计信息将被正确收集,并且文件将被关闭。请注意,循环仅与没有标签URL_DONT_CYCLE = 1的URL有关。Curl-loader启用了两个可选的非循环区域:循环url / s区域之前的第一个区域和循环url / s区域之后的第二个区域。

USER_AGENT提供一个选项来覆盖默认的类似于MSIE-6的HTTP标头User-Agent。将带引号的字符串放在此处以模拟所需的浏览器。标题是全局输入的。如果您需要一个选项来基于每个URL对其进行自定义,请使用标记HEADER =“ User-Agent:我最喜欢的浏览器的字符串”。

URLS_NUM是“ URLs”部分中要使用的url数量。

部分URL的标签:

URL-是每个url子部分的第一个标签;它标志着新网址的开始。标记应该是有效的url或空字符串,仅当URL_USE_CURRENT = 1时才允许使用。例如,在使用前一个GET生成的带有URL的POST页面时,“当前URL”很有用。HTTP重定向是在内部处理的,因此不需要使用“当前URL”方法。请注意,用于文件上传的URL应该包括文件名,而不仅仅是目录。

URL_SHORT_NAME-是一个可选的最多12个ASCII字符串长名称,它将出现在“加载状态” GUI中。它改善了控制台上当前操作状态的外观。我们建议对其进行配置。

URL_USE_CURRENT-与空字符串URL =“”结合使用,指示应使用由上一个操作获取的当前URL页面。“当前URL”很有用,例如,当URL的页面由先前的GET生成时。请注意,HTTP重定向是在内部处理的,因此无需使用“当前URL”方法。

URL_DONT_CYCLE-将网址标记为非循环。Curl-loader启用两个可选的非循环区域:第一个区域位于循环url区域之前,第二个区域位于其后。例如,第一非循环区域可用于登录,身份验证等单次操作,而第二非循环区域可用于一次注销。

REQUEST_TYPE-从GET,POST或PUT中选择的HTTP请求方法。

UPLOAD_FILE-用于上传的文件的文件名,包括路径。该路径应从curl-loader位置获取,例如./conf-examples/bax.conf HEADER-

有助于自定义/添加/覆盖HTTP / FTP标头。如果默认情况下标题已经退出,则自定义标题会覆盖它。USER_AGENT标记仅用于User-Agent标头,而可以通过HEADER添加或覆盖任何标头,包括User-Agent。为防止发送“期望:100-继续”,请传递HEADER =“期望:”
查看示例./conf-examples/custom_hdrs.conf。

USERNAME和PASSWORD是用于提供登录操作凭据的标记。这些字符串既可以按原样使用,也可以用作基数来附加数字并生成一些唯一的凭据。该行为由标记FORM_USAGE_TYPE控制。请注意,PASSWORD可能是一个空字符串。

FORM_USAGE_TYPE控制用户登录过程。“ UNIQUE_USERS_AND_PASSWORDS”用于通过将客户端序列号(从1开始)附加到FORM_STRING模板中的USERNAME和PASSWORD标记来生成唯一的用户名和密码。生成具有相同密码的唯一用户时将使用“ UNIQUE_USERS_SAME_PASSWORD”。当所有客户端都使用相同的USERNAME和PASSWORD登录时,“ SINGLE_USER”很有用。“ RECORDS_FROM_FILE”表示要从FORM_RECORDS_FILE值指定的文件中加载用户凭证。“ AS_IS”表示仅按原样使用FORM_STRING模板,而没有相关标签或文件中的任何用户名或密码。

要生成多个具有唯一密码FORM_USAGE_TYPE =“ UNIQUE_USERS_AND_PASSWORDS”的唯一用户,并且FORM_STRING是一个模板,例如“ username =%s%d&password =%s%d”。第一个“%s”将替换为USERNAME标记的值,而“%d”将替换为客户编号。第二个“%s”将替换为PASSWORD标记值,第二个“%d”将替换为同一客户号。例如,如果USERNAME = robert,PASSWORD = stam和FORM_STRING“ username =%s%d&password =%s%d”,则用于客户端编号1的最终POST字符串将是“ username = robert1&password = stam1”。
在这种情况下,USERNAME和PASSWORD字符串仅用作基本字,通过附加客户端序列号来生成唯一的用户凭据。
当FORM字符串的FORM_USAGE_TYPE =“ UNIQUE_USERS_SAME_PASSWORD”模板类似于“ username =%s%d&password =%s”时,使用与上述相同的方法,只有用户名是唯一的。
当FORM_USAGE_TYPE =“ SINGLE_USER”时,提供不带%d符号的FORM_STRING,例如“ user =%s&secret =%s”。因此,所有客户端将具有相同的POST凭据,其字符串类似于“ user = robert&secret = stam”。
当FORM_USAGE_TYPE =“ RECORDS_FROM_FILE”时FORM_STRING也没有%d符号,因为应该由文件内容确保凭据的唯一性。
FORM_USAGE_TYPE =“ AS_IS”表示FORM_STRING不会被验证,并且会按原样进行POST-ed操作。

FORM_RECORDS_FILE使用凭证或任何其他令牌指定文件的路径。(全路径或相对于curl-loader位置)。具有用户名和密码的文本文件以及每个字符串的结构,例如: 可用作输入。根据RFC1738,只有保留的’:’,’@’,’/‘以及可能的’’(空格)可以安全地用作用户名和密码之间的分隔符。批处理配置的示例是./conf-examples/post-form-token-fr-file.conf,凭证示例在./conf-examples/credentials.cred中。当前版本在文件中最多支持16个令牌。

FORM_RECORDS_FILE_MAX_NUM允许从带有标签FORM_RECORDS_FILE指定的记录的文件中加载任意数量的记录,而不仅仅是默认记录数,该记录等于虚拟客户端CLIENTS_NUM_MAX的最大数量。FORM_RECORDS_RANDOM需要标记。

FORM_RECORDS_RANDOM允许为每个虚拟客户端使用随机选择的记录,而在没有标签的情况下,程序用于索引为I的客户端始终记录编号I。例如,可以从文件中加载10000条记录(由FORM_RECORDS_FILE标签指定)并使用记录以随机方式(例如100个客户)。标签不能确保用于每个虚拟客户端的记录的唯一性。为了正确使用标签,请使用标签FORM_RECORDS_FILE_MAX_NUM指定要加载的记录数。

WEB_AUTH_METHOD可通过“ BASIC”,“ DIGEST”,“ GSS_NEGOTIATE”,“ NTLM”或“ ANY”进行配置。配置的方法将用于HTTP 401响应的身份验证。配置“ ANY”后,libcurl将选择一个方法。要使用“ GSS_NEGOTIATE”,应在支持GSS的情况下重新编译libcurl。

WEB_AUTH_CREDENTIALS以“ user:password”的形式提供。如果未配置,则加载程序将使用USERNAME和PASSWORD标记值来合成凭据。

PROXY_AUTH_METHOD可通过“ BASIC”,“ DIGEST”,“ GSS_NEGOTIATE”,“ NTLM”或“ ANY”进行配置。配置的方法将用于HTTP 407响应的身份验证。配置“ ANY”后,libcurl将选择一种方法。要使用“ GSS_NEGOTIATE”,应在支持GSS的情况下重新编译libcurl。

PROXY_AUTH_CREDENTIALS以“ user:password”的形式提供。如果未配置,则加载程序将使用USERNAME和PASSWORD标记值来合成凭据。

FRESH_CONNECT用于在每个URL的基础上定义在请求-响应周期之后是否应重用连接或关闭并重新连接。为1时,将重新建立TCP连接。系统默认设置是保持连接并在服务器和协议允许的范围内重复使用它。仍然可以通过命令行选项-r更改系统默认值。

TIMER_TCP_CONN_SETUP是基于每个URL的DNS解析和TCP连接设置的时间(以秒为单位)。全局默认值为5秒,可以使用-c命令行选项更改。

TIMER_URL_COMPLETION是允许进行URL提取操作(包括所有内部重定向)的时间(以毫秒为单位)。合法值为0,表示对url完成时间没有限制,或大于20(毫秒)。当标记的值大于0时,我们将监视url的获取进度并将其取消(如果未在指定的毫秒值内完成)。结果以“超时”统计信息的形式显示在“加载状态” GUI中,并以T-Err号记录到所有统计文件中。

TIMER_AFTER_URL_SLEEP是客户端在获取下一个URL之后在处理下一个URL之前进入睡眠状态的时间(以毫秒为单位)。零(0)表示不要等待并立即安排客户端。随机计时器值是合法选项,可以指定为0-2000,这意味着客户端将在0到2000毫秒的随机时间内休眠。

FTP_ACTIVE定义为1时,将强制FTP协议使用主动模式(默认为被动模式)。

LOG_RESP_HEADERS定义为1时,程序会将响应标头记录到文件中。使用子目录url0,url1,url 创建目录<批处理名称>,响应的标题记录到名为cl- -cycle- .hdr的文件中

LOG_RESP_BODIES定义为1时,程序会将响应头记录到文件中。目录是使用子目录url0,url1 … url 创建的,响应头记录到名为cl- -cycle- .body的文件中

RESPONSE_STATUS_ERRORS支持更改到默认的每个网址响应集(被视为错误)。默认情况下,大多数4xx(无401和407)和所有5xx响应代码均被视为错误。现在,您可以将状态添加到错误集或将其删除。符号+(加号)添加,-(减号)删除。语法是用’,'分隔的一行标记,其中每个标记以+或-开头,后跟响应状态编号,范围为0到600。
例如,RESPONSE_STATUS_ERRORS =“ + 200,-404”的作用是,将对该URL的200个响应视为错误,而将404视为成功。

MULTIPART_FORM_DATA标记添加了对多部分表单数据POST-ing的初始支持,如RFC1867中所示。
几个标签MULTIPART_FORM_DATA可用于要发布的网址,例如在./conf-examples/multipart-formdata-post.conf:

MULTIPART_FORM_DATA =“提供yourname =迈克尔”
MULTIPART_FORM_DATA =“filedescription =酷文本文件,里面很酷的文字”
MULTIPART_FORM_DATA =“ htmlcode = ; type = text / html
” MULTIPART_FORM_DATA
=“ [email protected] ” MULTIPART_FORM_DATA =“ coolfiles = @ fil1.gif,fil2.txt,fil3.html”

要上传的文件用@表示,并且与curl-loader位于同一目录中。内容类型可以添加为;例如; type = text / html。当前,该功能使用AS_IS提供的字符串,并且不会生成任何唯一的用户,唯一的密码或从文件中加载令牌。

为防止发送“期望:100-继续”,作为自定义HTTP标头HEADER =“期望:”

TRANSFER_LIMIT_RATE-限制客户端的最大URL吞吐量。要提供的标签值每秒以字节(!而不是位)的形式提供。

FETCH_PROBABILITY-允许并非一定要获取URL,而是具有一定的运行时概率。允许的值范围是1到100%。

FETCH_PROBABILITY_ONCE设置为1时,将配置每个客户端以决定是否获取由FETCH_PROBABILITY标记的URL,该决定仅执行一次,即在第一个周期执行。

更多配置信息请参考

官网文档
个人觉得有二次开发的潜力,现在不是流行容器化的 jmeter 做分布式压测么?要是……

你可能感兴趣的:(java,压力测试,curl-loader,软件测试)