最近跟測試組學習loadrunner的使用,測試組的姑娘們習慣用界面進行操作,而習慣linux平臺使用的我很多功能都使用代碼來實現了。
最近用loadrunner寫了一個模擬社區用戶壓測論壇數據庫的一個腳本,進行數據庫的壓力測試和優化工作。
用戶行為分析:
在社區中,看帖的人是發帖人的10倍以上,而看帖人大概80%以上都在看新帖,20以下的用戶有挖墳行為。
因此,設定如此的比率:每11個用戶,1個發帖,8個看最近30%的帖,兩個看老的70%的帖。
我的論壇帖子回復表大概是:973505個帖子的回復,兩千多萬的回帖。
根據這些數據,配合mysql的c api,寫如下腳本:
注:腳本的my_mysql_insert()函數是有問題的,多線程下有一個資源符沒處理好,因為還不太了解loadrunner的線程機制,所以留下了一個bug。
在做完這個腳本后,我發現我們測試機性能都不錯,很難在一個5G大小的單表上主鍵查詢造成很大的壓力,所以,計劃把dz論壇架設,用php+mysql真實環境下進行壓測,這樣可以順便練習http函數下的loadrunner編程。
globals.h
#ifndef _GLOBALS_H
#define _GLOBALS_H
#include "lrun.h"
#include "web_api.h"
#include "lrw_custom_body.h"
#include "modal_dialog_callbacks.h"
#define random(x) (rand()%x)
#include
#include
#include
#include
#include
#include
#include
#endif // _GLOBALS_H
vuser_init.c
MYSQL *db;
MYSQL_ROW record;
vuser_init()
{
char sql[128];
MYSQL_RES *results1;
lr_load_dll("libmysql.dll");
db = mysql_init(NULL);
mysql_real_connect(db, "192.168.8.32", "root", "123456", "sunboyu_test", 3311, "/tmp/mysql3311.sock", 1);
sprintf(sql, "show tables");
mysql_query(db, sql);
results1 = mysql_store_result(db);
while((record = mysql_fetch_row(results1)))
{
lr_log_message("table = %s", record[0]);
}
mysql_free_result(results1);
return 0;
}
vuser_end.c
vuser_end()
{
mysql_close(db);
mysql_server_end();
return 0;
}
Action.c
Action()
{
int r1 = 0;
char sql[128];
r1 = random(11); //10種用戶,8種正常訪問,兩種在挖墳
lr_log_message(" %d", r1);
if(r1==11)
{
my_mysql_insert();
}
else
{
my_mysql_query( r1 );
}
return 0;
}
int my_mysql_query( int randid )
{
int r2 = 0;
int j = 0;
int count = 0;
int page = 0;
char sql[128];
MYSQL_RES *results2;
if(randid<2) //老數據,小部分 20%
{
r2 = random(700000);
sprintf(sql, "SELECT COUNT(*) AS count FROM posts_jx3 WHERE tid = %d;",r2);
原文轉自:http://www.anti-gravitydesign.com