如何使用shell脚本进行性能测试 - 工具和技术?

时间:2010-01-29 11:57:42

标签: performance unix testing command-line load

我有一个系统,我必须为了性能测试而应用负载。可以通过HTTP上的LoadRunner创建一些负载。

但是,为了为系统生成实际负载,我还需要使用命令行工具模拟用户,该工具使用非HTTP协议*与服务器通信。

* 编辑:实际上它是HTTP,但我们已被供应商告知,录制/脚本和重播并不容易。所以我们只能使用CLI工具调用它。

我有一个限制,即没有LoadRunner的许可证来执行此操作,没有时间让案件获得许可证。

因此我想知道是否有一个工具可用于控制shell脚本集合的并发执行(它需要在Solaris上运行),这将是我的事务。理想情况下,它可以按照预定的格式提升。

我已经浏览了一下,无法判断JMeter是否会这样做。它似乎非常面向网络。

3 个答案:

答案 0 :(得分:0)

如果你需要的是并行启动一堆shell脚本,你可以使用fork,exec和sleep在perl中快速创建自己的东西。

#!/usr/bin/perl

for $i (1..1000)
{   
    if (fork == 0)
    {
        exec ("script.sh");
        exit;
    }

    sleep 1;
}

答案 1 :(得分:0)

对于任何有兴趣的人,我已经编写了一个Java工具来为我管理这个。它引用了一些文件来控制它的运行方式:

1)计划文件 - 定义各种命名的计时列表,用于控制连续阶段的长度。

e.g。 MAIN,120,120,120,120,120

这将产生一个名为MAIN的计划,其中每个120秒长有5个阶段。

2)交易文件 - 定义需要运行的交易。每个事务都有一个名称,一个应该被调用的命令,布尔控制重复,以秒为单位的重复之间的整数控制暂停,数据文件引用,使用计划和增量。

e.g。 Trans1,/path/to/trans1.ksh,true,10,trans1.data.csv,MAIN,0,10,0,10,0

这将导致事务运行trans1.ksh,重复之间重复暂停10秒。它将引用trans1.data.csv中的数据。在阶段1期间,它将并行调用的数量增加0,阶段2将添加10个并行调用,阶段3不添加,依此类推。阶段时间取自名为MAIN的计划。

3)数据文件 - 在事务文件中引用,这将是带有标题的CSV。每行数据都将传递给事务的后续调用。

e.g。

HOSTNAME,USERNAME,PASSWORD
server1,jimmy,password123
server1,rodney,ILoveHorses

这些通过环境变量(例如PASSWORD=ILoveHorses)传递给事务脚本,有点笨拙但可行。

我的Java只是解析配置文件,为每个事务设置一个管理器线程,它本身负责根据配置设置和启动执行程序线程。管理人员负责线性添加执行程序,以免完全超载。

当它运行时,它只会报告每个交易运行的工人数量以及它所处的阶段。

这是一个有趣的小周末项目,它当然没有负载跑步者,我确信它有一些巨大的缺陷,我目前幸福地没有意识到,但似乎没有。

总而言之,这里的答案是“滚动你自己”。

答案 2 :(得分:0)

您可以使用以下脚本来触发HTTP / S请求的负载测试,

#!/bin/bash

#define variables

set -x # run in debug mode
DURATION=60 # how long should load be applied ? - in seconds
TPS=20 # number of requests per second
end=$((SECONDS+$DURATION))
#start load
while [ $SECONDS -lt $end ];
do
        for ((i=1;i<=$TPS;i++)); do
                curl -X POST <url> -H 'Accept: application/json' -H 'Authorization: Bearer xxxxxxxxxxxxx' -H 'Content-Type: application/json' -d '{}' --cacert /path/to/cert/cert.crt -o /dev/null -s -w '%{time_starttransfer}\n' >> response-times.log &
        done
        sleep 1
done
wait
#end load
echo "Load test has been completed"

您可以参考this以获得更多信息