zoukankan      html  css  js  c++  java
  • 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据

    前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导。

        今天要讲的,是一个非Java版本。是对“在LoadRunner中执行命令行程序之:popen()取代system()”的一个升华。

         下面的脚本,是在LoadRunner里连接Linux/Unix远程服务器,收集其磁盘IO的负载到测试结果中。

    涉及到三个知识点:

        1、LoadRunner自带“PuTTY Link”的使用,路径为“%LR_PATH%inplink.exe”;

        2、Linux/Unix的磁盘监控指令,读者也可以扩展为其它任何实用指令;

        3、LoadRunner自带函数lr_user_data_point的使用,保存自定义数据到测试结果。

    脚本贴出如下:

    #define BUFFER_SIZE 20480 // 初始给它 20 KB
    extern char* strtok(char *token, const char *delimiter); // 显示申明
    Action(){
        long fp; // 数据流
        int count; // 用于保存流长度
        char buffer[BUFFER_SIZE]; // 给数据流分配内存空间
        char * row_token; // 记录每一行的地址
        char field_name[100]; // 第一列的名称
        int field_value; // 保存系列的值
        char lrudp_name[100]; // 保存LR自定义指标值
        int rc; // 保存返回值
        lr_start_transaction("DiskIO");// Linux采样方式: plink -ssh -l username -pw password hostname command
        lr_save_string("higkoo", "UserName");
        lr_save_string("123456", "Password");
        lr_save_string("192.168.10.31", "Server");
        lr_save_string("iostat -xc | awk 'NR >2 {print $1, $10}'", "Command"); // 使用iostat拿到磁盘IO的状态信息
        lr_save_string(lr_eval_string(""%LR_PATH%\bin\plink" -ssh -l {UserName} -pw {Password} {Server} "{Command}" 2>&1 "), "Result"); // 使用plink连接远程Linux服务器并拿到执行结果
        fp = popen(lr_eval_string("{Result}"), "r");
        if (fp == NULL) {
            lr_error_message("执行命令失败");
            return -1;
        }
        count = fread(buffer, sizeof(char), BUFFER_SIZE, fp); // 读取结果
        if (feof(fp) == 0) {
            lr_error_message("返回结果太大,请给数据流分配更大内存空间,谢谢!");
            return -1;
        }
        if (ferror(fp)) {
            lr_error_message ("监控指令返回错误");
            return -1;
        }
        if (count == 0) {
            lr_error_message("监控指令返回结果为熔");
            return -1;
        }
        buffer[count] = NULL;
        row_token = (char*) strtok(buffer, " "); // 按换行符分割
        if (row_token == NULL) {
            lr_error_message ("未发现有效数据");
            return -1;
        }
        while (row_token != NULL) { // 开始读取数据
            rc = sscanf(row_token, "%s %d", field_name, &field_value); //分割名称与值
            if (rc != 2) {
                lr_error_message("Incorrect number of items read from the row.");
                return -1;
            }
            sprintf(lrudp_name, "disk_busy_%s", field_name);// 自定义数据的名称
            lr_user_data_point(lrudp_name, field_value);// 保存到LR自定义数据
            row_token = (char*) strtok(NULL, " ");
        }
        pclose(fp);
        lr_end_transaction("DiskIO", LR_AUTO);
    }

    功能实现了,后面的故事你来讲~~ 

  • 相关阅读:
    Azure ARM模式下VNet配置中需要注意的几点事项
    scala的传名参数
    scala中如何编写自定义的流程控制结构
    scala打印九九乘法表的5种实现
    kakfa源码编译打包
    kakfa的常用命令总结
    kafka单节点部署无法访问问题解决
    ubuntu下安装gradle
    ubuntu14.04LTS 下storm单机版安装配置
    Mybatis-Generator使用
  • 原文地址:https://www.cnblogs.com/defias/p/3286034.html
Copyright © 2011-2022 走看看