2012年2月7日 星期二

在LoadRunner向遠端Linux/Unix執行命令列並收集性能資料


  前面介紹過在LoadRunnerJava協議實現使用SSH連接Linux,當然連接之後的故事由你主導。
  今天要講的,是一個非Java版本。是對LoadRunner中執行命令列程式之:popen()取代system()的一個昇華。
   下面的腳本,是在LoadRunner裡連接Linux/Unix遠端伺服器,收集其磁片IO的負載到測試結果中。
涉及到三個知識點:
  1LoadRunner自帶“PuTTY Link”的使用,路徑為“%LR_PATH%\bin\plink.exe”
  2Linux/Unix的磁片監控指令,讀者也可以擴展為其它任何實用指令;
  3LoadRunner自帶函數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, "\n"); // 按分行符號分割
 
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, "\n");
 
}

 
pclose(fp);

 
lr_end_transaction("DiskIO", LR_AUTO); 
}

沒有留言: