51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

楼主: bustersword
打印 上一主题 下一主题

[原创] 虚拟500个用户同时对数据库进行插入操作,每个用户循环插入30条数据。该怎么设计呢

[复制链接]

该用户从未签到

21#
 楼主| 发表于 2011-5-4 15:04:12 | 只看该作者
本帖最后由 bustersword 于 2011-5-4 15:05 编辑

100Vuser*15条数据一次性加载100VUser

顺带说下,这三次测试,我都在登录完后设置了集合点


Analysis SummaryPeriod: 04-05-2011 12:49:28 - 04-05-2011 12:54:32

Scenario Name:Scenario1
Results in Session:d:\res\res\res.lrr
Duration:5 minutes and 4 seconds.

Statistics Summary

Maximum Running Vusers:100
Total Throughput (bytes):173,669,703
Average Throughput (bytes/second):569,409
Total Hits:11,493
Average Hits per Second:37.682  View HTTP Responses Summary

Transaction Summary

Transactions:Total Passed: 3,586Total Failed: 14Total Stopped: 0         Average Response Time

Transaction NameMinimumAverageMaximumStd. Deviation90 PercentPassFailStop
Action_Transaction10.38620.05138.0515.527.60110000
login0.1851.1732.4060.5881.98210000
loginout0.0010.0040.0410.0060.01310000
outInput0.0050.3424.5640.6260.34110000
save12.1285.89120.4492.959.43110000
save20.1547.22937.6653.2868.6271,39370
SavePicSingle_Transaction0.1547.22937.6653.2868.6271,39370
startInput0.89210.31416.3473.45512.63610000
vuser_end_Transaction0.0060.3464.5660.6250.34310000
vuser_init_Transaction0.3441.3512.4350.5552.01210000
file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/dot_trans.gif

HTTP Responses Summary

HTTP ResponsesTotalPer second
HTTP_20011,29337.026
HTTP_3022000.656
file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/dot_trans.gif

file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/dot_trans.gif
Filters: (do not Include Think Time)

file:///C:/Documents%20and%20Settings/Administrator/%E6%A1%8C%E9%9D%A2/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/15%E4%B9%98100%E7%94%A8%E6%88%B7-%E7%BB%93%E6%9E%9C%E5%88%86%E6%9E%90-2011-5-4/dot_trans.gif


回复 支持 反对

使用道具 举报

该用户从未签到

22#
 楼主| 发表于 2011-5-4 15:10:56 | 只看该作者
三次的TPS是
11.18

11.191

11.757

现在我不会出现大量丢失数据的情况,但是少量的fail,算不算测试中的正常情况呢?
再者,我现在系统的TPS是不是也到瓶颈了?

我又测试了缓慢加载用户的场景,TPS都差不多,200用户每10S增加5Vuser的场景,fail的次数就多点40左右,TPS  11.497 ,最大 运行用户120
实际中,200用户同时去处理,会怎么样呢?
回复 支持 反对

使用道具 举报

该用户从未签到

23#
发表于 2011-5-4 15:35:25 | 只看该作者
场景运行过程中有错误么?是哪些呢?
回复 支持 反对

使用道具 举报

该用户从未签到

24#
 楼主| 发表于 2011-5-4 15:54:42 | 只看该作者
运行中的错误都是关联没有找到匹配的错误 ,我想应该是页面来不及响应,所有也就来不及匹配了...
回复 支持 反对

使用道具 举报

该用户从未签到

25#
发表于 2011-5-4 16:05:20 | 只看该作者
数据库和服务器的性能检测呢?
回复 支持 反对

使用道具 举报

该用户从未签到

26#
 楼主| 发表于 2011-5-4 16:15:57 | 只看该作者
数据库没检测.....服务器是IIS的,运行的时候cpu使用率蛮高的。。。。。具体数据没保留................
回复 支持 反对

使用道具 举报

该用户从未签到

27#
 楼主| 发表于 2011-5-4 16:39:25 | 只看该作者
三次的TPS是
11.18

11.191

11.757

现在我不会出现大量丢失数据的情况,但是少量的fail,算不算测 ...
bustersword 发表于 2011-5-4 15:10


这些问题,根据现有数据,或者你的经验,谁来回答下....3Q
回复 支持 反对

使用道具 举报

该用户从未签到

28#
发表于 2011-5-4 22:13:38 | 只看该作者
时间是否设置的够呢??500个并发,每个并发迭代15次,每次迭代的时间算好后,再计算500并发的时间,估计得跑一段时间吧.......
回复 支持 反对

使用道具 举报

该用户从未签到

29#
发表于 2011-5-5 10:48:41 | 只看该作者
借楼主热帖问下,什么情况下设置思考时间,什么情况下不设置思考时间?另外这个思考时间指的是什么呢?
回复 支持 反对

使用道具 举报

该用户从未签到

30#
发表于 2011-5-5 10:50:37 | 只看该作者
再问个问题,如何排除应用服务器和程序,只对数据进行压力测试。这样的测试如何进行呢。我现在在做一个系统的压力测试,不知道怎么分析到底是程序问题,中间件问题,还是数据库问题?
回复 支持 反对

使用道具 举报

该用户从未签到

31#
 楼主| 发表于 2011-5-5 17:29:16 | 只看该作者
我今天又测试了100用户*100数据,也就是一共插入10000条数据,丢失4条数据,但是保存数据的响应时间竟然达到了10S左右,我了个去......50用户插入750条数据,倒是3S内,现在至于要根据这些结果,让我去改程序,或者服务器,数据库,我还真是有点迷茫了..........天啊!
怎么搞负载均衡,什么分布式缓存,神马神马啊!
疯了
回复 支持 反对

使用道具 举报

该用户从未签到

32#
发表于 2011-5-5 17:47:19 | 只看该作者
我今天又测试了100用户*100数据,也就是一共插入10000条数据,丢失4条数据,但是保存数据的响应时间竟然达到 ...
bustersword 发表于 2011-5-5 17:29



    你已经很厉害了,呵呵

我更加迷茫,现在有一个功能点在多并发的情况下速度很慢,让我分析原因,是程序还是服务器还是数据库。姐姐我不知道怎么弄啊,分析不来呀,压力做了又做????
回复 支持 反对

使用道具 举报

该用户从未签到

33#
 楼主| 发表于 2011-5-5 18:06:08 | 只看该作者
我真的很不厉害............是菜鸟,我现在是完全找不到东南西北
回复 支持 反对

使用道具 举报

该用户从未签到

34#
 楼主| 发表于 2011-5-5 18:11:18 | 只看该作者
Action()
{
int rc;  
int db_connection; // 数据库连接
int query_result; // 查询结果集 MYSQL_RES
char** result_row; // 查询的数据衕
  
char *server = "localhost";
char *user = "root";
char *password = "123456";
char *database = "test";
int port = 3306;
int unix_socket = NULL;  
int flags = 0;  
  
// 找到libmysql.dll的所在位置.
rc = lr_load_dll("C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\libmysql.dll");
if (rc != 0) {
    lr_error_message("Could not load libmysql.dll");
    lr_abort();
}
  
// 创建MySQL对象
db_connection = mysql_init(NULL);
if (db_connection == NULL) {
    lr_error_message("Insufficient memory");
    lr_abort();
}
  
// 连接到MySQL数据库
rc = mysql_real_connect(db_connection, server, user, password, database, port, unix_socket, flags);
if (rc == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 向数据库插入数据
// 此处的 {ORDER_ID} 是一个参数,简单测试时可以用一个常数代替
lr_save_string (lr_eval_string("INSERT INTO test_data (order_id) VALUES ({ORDER_ID})"),"paramInsertQuery");  
rc = mysql_query(db_connection, lr_eval_string("{paramInsertQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 从数据库读取一个数据并显示
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 如果结果集包含多行数据,需要多次调用 mysql_fetch_row 直到返回NULL
result_row = (char **)mysql_fetch_row(query_result);  
if (result_row == NULL) {
    lr_error_message("Did not expect the result set to be empty");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 保存参数,用于删除这行数据
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);
  
// 在事务里更新一行数据,需要用InnoDB引擎
rc = mysql_query(db_connection, "BEGIN"); //启动事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
// 使用 "FOR UPDATE" 锁住要更新的数据行
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1 FOR UPDATE");  
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);  
if (result_row == NULL) {
    lr_error_message("没有查询到结果");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);
lr_save_string(lr_eval_string("UPDATE test_data SET status=TRUE, date_used=NOW() WHERE order_id='{paramOrderID}'"),"paramUpdateQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramUpdateQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
rc = mysql_query(db_connection, "COMMIT"); // 提交事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 再次查找数据,应该为空了,因为前面的事务更新了标志
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_output_message("Result set is empty as expected");
    mysql_free_result(query_result);
} else {
    lr_error_message("Did not expect the result set to contain any rows");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
  
// 删除数据
lr_save_string(lr_eval_string("DELETE FROM test_data WHERE order_id = '{paramOrderID}'"),"paramDeleteQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramDeleteQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
  
// 释放MySQL资源
mysql_close(db_connection);
    return 0;
}
/*需要的表结构如下
CREATE TABLE `test_data` (
`order_id` BIGINT UNSIGNED NOT NULL COMMENT 'Order numbers. Must be unique.',
`status` BOOL NOT NULL DEFAULT '0' COMMENT 'Whether data has been used or not. A value of 0 means FALSE.',
`date_used` DATETIME NULL COMMENT 'Date/time that the data was used.',
UNIQUE (
    `order_id`
)
) ENGINE = innodb COMMENT = 'LoadRunner test data';
*/
Action()
{
int rc;
int db_connection; // 数据库连接
int query_result; // 查询结果集 MYSQL_RES
char** result_row; // 查询的数据衕

char *server = "localhost";
char *user = "root";
char *password = "123456";
char *database = "test";
int port = 3306;
int unix_socket = NULL;
int flags = 0;
回复 支持 反对

使用道具 举报

该用户从未签到

35#
 楼主| 发表于 2011-5-5 18:11:24 | 只看该作者
// 找到libmysql.dll的所在位置.
rc = lr_load_dll("C:\\Program Files\\MySQL\\MySQL Server 5.1\\bin\\libmysql.dll");
if (rc != 0) {
    lr_error_message("Could not load libmysql.dll");
    lr_abort();
}

// 创建MySQL对象
db_connection = mysql_init(NULL);
if (db_connection == NULL) {
    lr_error_message("Insufficient memory");
    lr_abort();
}

// 连接到MySQL数据库
rc = mysql_real_connect(db_connection, server, user, password, database, port, unix_socket, flags);
if (rc == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 向数据库插入数据
// 此处的 {ORDER_ID} 是一个参数,简单测试时可以用一个常数代替
lr_save_string (lr_eval_string("INSERT INTO test_data (order_id) VALUES ({ORDER_ID})"),"paramInsertQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramInsertQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 从数据库读取一个数据并显示
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 如果结果集包含多行数据,需要多次调用 mysql_fetch_row 直到返回NULL
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_error_message("Did not expect the result set to be empty");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
// 保存参数,用于删除这行数据
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);

// 在事务里更新一行数据,需要用InnoDB引擎
rc = mysql_query(db_connection, "BEGIN"); //启动事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
// 使用 "FOR UPDATE" 锁住要更新的数据行
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1 FOR UPDATE");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_error_message("没有查询到结果");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
lr_save_string(result_row[0], "paramOrderID");
lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));
mysql_free_result(query_result);
lr_save_string(lr_eval_string("UPDATE test_data SET status=TRUE, date_used=NOW() WHERE order_id='{paramOrderID}'"),"paramUpdateQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramUpdateQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
rc = mysql_query(db_connection, "COMMIT"); // 提交事务
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 再次查找数据,应该为空了,因为前面的事务更新了标志
rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}
query_result = mysql_use_result(db_connection);
if (query_result == NULL) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}
result_row = (char **)mysql_fetch_row(query_result);
if (result_row == NULL) {
    lr_output_message("Result set is empty as expected");
    mysql_free_result(query_result);
} else {
    lr_error_message("Did not expect the result set to contain any rows");
    mysql_free_result(query_result);
    mysql_close(db_connection);
    lr_abort();
}

// 删除数据
lr_save_string(lr_eval_string("DELETE FROM test_data WHERE order_id = '{paramOrderID}'"),"paramDeleteQuery");
rc = mysql_query(db_connection, lr_eval_string("{paramDeleteQuery}"));
if (rc != 0) {
    lr_error_message("%s", mysql_error(db_connection));
    mysql_close(db_connection);
    lr_abort();
}

// 释放MySQL资源
mysql_close(db_connection);
return 0;
}


我想知道上面这段连接mysql测试的前提环境配置----------------------------------求解
回复 支持 反对

使用道具 举报

该用户从未签到

36#
 楼主| 发表于 2011-5-6 13:46:15 | 只看该作者
顶下,等待高手
回复 支持 反对

使用道具 举报

该用户从未签到

37#
发表于 2011-5-6 15:45:13 | 只看该作者
恩,也顶一记,等待高人
回复 支持 反对

使用道具 举报

该用户从未签到

38#
发表于 2011-5-6 17:16:46 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

该用户从未签到

39#
 楼主| 发表于 2011-5-9 10:24:09 | 只看该作者
.....我想知道怎么解决服务器响应慢的问题。优化SQL语句,优化页面,and???????
回复 支持 反对

使用道具 举报

该用户从未签到

40#
发表于 2011-5-9 13:23:18 | 只看该作者
.....我想知道怎么解决服务器响应慢的问题。优化SQL语句,优化页面,and???????
bustersword 发表于 2011-5-9 10:24



    应该找出原因吧,我现在就急于求教如何分析是哪部分原因造成的
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-16 20:24 , Processed in 0.084159 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表