天天看點

在LoadRunner向遠端Linux/Unix執行指令行并收集性能資料

前面介紹過在LoadRunner的Java協定實作“ 使用SSH連接配接Linux”,當然連接配接之後的故事由你主導。

今天要講的,是一個非Java版本。是對“ 在LoadRunner中執行指令行程式之:popen()取代system()”的一個升華。

     下面的腳本,是在LoadRunner裡連接配接Linux/Unix遠端伺服器,收集其磁盤IO的負載到測試結果中。

涉及到三個知識點:

    1、LoadRunner自帶“PuTTY Link”的使用,路徑為“%LR_PATH%\bin\plink.exe”;

    2、Linux/Unix的磁盤監控指令,讀者也可以擴充為其它任何實用指令;

    3、LoadRunner自帶函數lr_user_data_point的使用,儲存自定義資料到測試結果。

腳本貼出如下:

  1. #define BUFFER_SIZE 20480 // 初始給它 20 KB
  2. extern char* strtok(char *token, const char *delimiter); // 顯示申明
  3. Action(){
  4.     long fp; // 資料流
  5.     int count; // 用于儲存流長度
  6.     char buffer[BUFFER_SIZE]; // 給資料流配置設定記憶體空間
  7.     char * row_token; // 記錄每一行的位址
  8.     char field_name[100]; // 第一列的名稱
  9.     int field_value; // 儲存系列的值
  10.     char lrudp_name[100]; // 儲存LR自定義名額值
  11.     int rc; // 儲存傳回值
  12.     lr_start_transaction("DiskIO");// Linux采樣方式: plink -ssh -l username -pw password hostname command
  13.     lr_save_string("higkoo", "UserName");
  14.     lr_save_string("123456", "Password");
  15.     lr_save_string("192.168.10.31", "Server");
  16.     lr_save_string("iostat -xc | awk 'NR >2 {print $1, $10}'", "Command"); // 使用iostat拿到磁盤IO的狀态資訊
  17.     lr_save_string(lr_eval_string("\"%LR_PATH%\\bin\\plink\" -ssh -l {UserName} -pw {Password} {Server} \"{Command}\" 2>&1 "), "Result"); // 使用plink連接配接遠端Linux伺服器并拿到執行結果
  18.     fp = popen(lr_eval_string("{Result}"), "r");
  19.     if (fp == NULL) {
  20.         lr_error_message("執行指令失敗");
  21.         return -1;
  22.     }
  23.     count = fread(buffer, sizeof(char), BUFFER_SIZE, fp); // 讀取結果
  24.     if (feof(fp) == 0) {
  25.         lr_error_message("傳回結果太大,請給資料流配置設定更大記憶體空間,謝謝!");
  26.         return -1;
  27.     }
  28.     if (ferror(fp)) {
  29.         lr_error_message ("監控指令傳回錯誤");
  30.         return -1;
  31.     }
  32.     if (count == 0) {
  33.         lr_error_message("監控指令傳回結果為熔");
  34.         return -1;
  35.     }
  36.     buffer[count] = NULL;
  37.     row_token = (char*) strtok(buffer, "\n"); // 按換行符分割
  38.     if (row_token == NULL) {
  39.         lr_error_message ("未發現有效資料");
  40.         return -1;
  41.     }
  42.     while (row_token != NULL) { // 開始讀取資料
  43.         rc = sscanf(row_token, "%s %d", field_name, &field_value); //分割名稱與值
  44.         if (rc != 2) {
  45.             lr_error_message("Incorrect number of items read from the row.");
  46.             return -1;
  47.         }
  48.         sprintf(lrudp_name, "disk_busy_%s", field_name);// 自定義資料的名稱
  49.         lr_user_data_point(lrudp_name, field_value);// 儲存到LR自定義資料
  50.         row_token = (char*) strtok(NULL, "\n");
  51.     }
  52.     pclose(fp);
  53.     lr_end_transaction("DiskIO", LR_AUTO);
  54. }

複制代碼 功能實作了,後面的故事你來講~~