【问题标题】:How can I performance test using shell scripts - tools and techniques?如何使用 shell 脚本进行性能测试 - 工具和技术?
【发布时间】:2010-01-29 11:57:41
【问题描述】:

我有一个系统,我必须对其施加负载以进行性能测试。一些负载可以通过 HTTP 上的 LoadRunner 创建。

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

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

我的限制是没有 LoadRunner 执行此操作的许可证,也没有时间提出申请以获得许可证。

因此,我想知道是否有一个工具可以用来控制一组 shell 脚本(它需要在 Solaris 上运行)的并发执行,这将是我的事务。理想情况下,它应该能够按照预定的时间表逐步增加。

我环顾四周,不知道 JMeter 是否能解决问题。它看起来非常面向网络。

【问题讨论】:

  • 您需要使用的非 HTTP 协议是什么 - 它是标准协议还是本地开发的协议?这将有助于缩小可用工具的范围。

标签: performance unix testing command-line load


【解决方案1】:

您可以使用下面的脚本来触发 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了解更多信息

【讨论】:

    【解决方案2】:

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

    #!/usr/bin/perl
    
    for $i (1..1000)
    {   
        if (fork == 0)
        {
            exec ("script.sh");
            exit;
        }
    
        sleep 1;
    }
    

    【讨论】:

    • 我知道我可以依靠这种安排,但理想情况下,我希望能够将其配置为根据预定义的时间表逐步增加。例如:从 50 个 script.sh 实例开始运行 5 分钟,然后再执行 50 个,以此类推。我也可以在 perl 中编码,但我有点希望有一些东西可以为我做这件事:)
    【解决方案3】:

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

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

    例如MAIN,120,120,120,120,120

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

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

    例如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。每行数据都将传递给事务的后续调用。

    例如

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

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

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

    当它运行时,它只是每秒报告每个事务有多少工作人员正在运行以及它处于哪个阶段。

    这是一个有趣的周末小项目,它肯定没有负载运行器,而且我敢肯定其中存在一些我目前完全没有意识到的巨大缺陷,但它似乎还可以。

    所以总而言之,这里的答案是“自己动手”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多