专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » mysql性能:MYSQL模拟真实环境下的性能 »正文

mysql性能:MYSQL模拟真实环境下的性能

来源: 发布时间:星期五, 2008年12月19日 浏览:2次 评论:0


1 模拟真实环境下性能

再次强调前面测试数据都是性能测试不能作为实际环境性能数据这些数据表现应该是理想环境下极限性能其只能作为参考

既然测试用例不完整我们就考虑模拟下真实环境

1.1 压力测试

先准备检测MySQL在压力情况下性能变化情况测试版本为MysQL4.0 gcc静态版本使用配置参数和原来相同

我先在数据库中插入10000000条记录然后我在另外台机器机器上启动1组压力进程对数据库进行查询或者修改操作测试进程组包括1050100="Char">进程1050100="Char">读写进程(读写各半)这些进程操作间隔时间为10000微秒(0.01秒执行次)或者1000微妙(0.001秒执行次)其中0.01秒执行次间隔压力相对较轻0.001秒执行次间隔压力就比较重了般用mysqladmin processlist检查大部分进程状态都是执行状态

同时在这台机机器(本机上)测试查询1000000条记录(总记录数1/10)所耗费时间同时为了比较使用vmstat记录相关CPU占用率情况分别记录压力进程运行后测试进程运行前后CPU空闲率

MyISAM 引擎测试结果如下:

表1 MyISAM引擎压力测试

测试项目

压力进程操作间隔为0.01

压力进程操作间隔为0.001


运行前CPU空闲(%)

运行后CPU空闲(%)

耗时(s)

处理速度(条记录/s)

运行前CPU空闲(%)

运行前CPU空闲(%)

耗时(s)

处理速度(条记录/s)


没有压力进程

100

69

258

3875.97

100

69

258

3875.97


10个读取压力进程

97

69

282

3546.10

85

57

318

4048.58


50个读取压力进程

88

59

316

3164.56

35

21

700

3333.33


100个读取压力进程

73

45

379

2638.52

22

10

2093

2283.11


10个读写压力进程(5+5)

94

67

247

3144.65

69

51

361

2770.08


50写压力进(25+25)

80

54

300

1428.57

25

16

4206

237.76


100个读写压力进程(50+50)

59

37

438

477.78

27

25

大约需要200000

0.50



对于MyISAM引擎最后组测试我没能作完实在是太慢了6个小时后我检查发现查询才进行到12477我几乎崩溃估计要让他跑完要5-6只好作罢

比较图表:









通过比较我们可以看出在只有读取操作压力下MyISAM引擎表现还不错在压力增加情况下性能没有出现陡降而对于读写混合压力测试情况下MyISAM引擎表现急转直下特别是最后100个读写0.001s间隔压力进程测试情况下速度已经不可接受这是检查MySQL状态计数变量Table_locks_waited数值非常大而且远远大于Table_locks_immediate这表示系统操作中等待锁操作非常多

由于MyISAM引擎采用表锁所以在读写压力测试下由于写操作锁会阻塞所有读取锁而且优先基本大于读取锁所以此时读取操作必须等待而且由于最后压力测试写操作频度很高所以造成了几乎11读取速度而且值得注意是此时CPU性能压力并不大系统能力并没有得以发挥

为了横向比较MyISAM引擎和InnoDB引擎在区别压力表现我也测试了InnoDB在压力情况下表现

表2 InnoDB引擎压力测试

测试项目

压力进程操作间隔为0.01

压力进程操作间隔为0.001


运行前CPU空闲(%)

运行后CPU空闲(%)

耗时(s)

处理速度(条记录/s)

运行前CPU空闲(%)

运行前CPU空闲(%)

耗时(s)

处理速度(条记录/s)


没有压力进程

100

69

278

3597.12

100

69

278

3597.12


10个读取压力进程

97

68

281

3558.72

94

65

387

4504.50


50个读取压力进程

86

58

312

3205.13

76

48

634

3690.04


100个读取压力进程

73

46

326

2583.98

54

28

892

2832.86


10个读写压力进程(5+5)

83

55

222

3067.48

72

45

276

3623.19


50写压力进(25+25)

40

20

271

1577.29

4

2

1243

804.51


100个读写压力进程(50+50)

24

9

353

1121.08

3

1

4011

249.31



比较图表:





图3 InnoDB引擎压力测试

可以看出InnoDB引擎在压力测试面前表现得不错基本上是随着压力增加速度呈现线性下降(注意第2步测试进程是50个为第5倍)

为了方便比较我也给出InnoDBMySQL两个比较图表必须指出这样比较意义有局限性并不能保证每个连接对于两种引擎压力都









从对比图表可以看出[]InnoDB引擎可以更好承担查询压力

MyISAM 为了避免在大压力环境下性能下降可能必须将表分割更细




如果你够心细应该可以发现在加入0.01秒读写压力测试后得到性能反而提升了?而且MyISAM引擎和InnoDB引擎数据都有提升?这个现象非常有趣为了验证不是干扰我重新测试了InnoDB在这个情况下表现发现测试结果没有我猜测这还是和查询Cache有关InnoDB将查询结果放入Cache可能是在提交操作时而在在提交时发现同时有更改语句情况下InnoDB引擎没有将查询语句结果放入Cache由于减少了Cache成本而且相对而言此时更改操作压力很轻所以这样反而加快了查询速度




1.2 多表访问环境模拟

前面测试方式都是使用单张表进行测试在多张表情况下MySQL表现如何?我打算这样模拟采用10张表每张表存放5000000条记录在另外台机器上每个进程都查询访问个表查询频率为0.005查询记录为随机数选取同时在本机上进行插入查询更改删除1000000条记录操作

对于MyISAM引擎同时由于增加了表数量调整了些相关参数

-variable = key_buffer_size=512M

-variable = query_cache_size=128M

对于InnoDB引擎仍然使用原来配置同时由于测试机器发生了更改[]为了对比公正性我重新测试了没有压力(没有同时访问)情况下对比数据

表3 多表访问环境模拟

参数配置

插入100000条记录耗时

处理速度(条记录/s)

查询100000条记录耗时

处理速度(条记录/s)

修改100000条记录耗时

处理速度(条记录/s)

删除100000条记录耗时

处理速度(条记录/s)


MyISAM引擎,

197

5076.14

333

3003.00

173

5780.35

175

5714.29


MyISAM引擎,模拟多表环境

209

4784.69

3366

297.09

566

1766.78

507

1972.39


InnoDB引擎,

221

4524.89

425

2352.94

255

3921.57

234

4273.50


InnoDB引擎, 模拟多表环境

520

1923.08

1853

539.67

677

1477.10

629

1589.83



对比图表为











在非模拟情况下MyISAM 引擎有少量优势但是在模拟环境下查询记录情况,MyISAM引擎表现远慢于InnoDB表现对于这个我感觉有点奇怪此时不应该有锁排队情况发生

在压力情况下MyISAM引擎插入语句性能看似不错但是这是由于在我测试用例中MyISAM引擎不用加入写锁锁定表(见前InnoDBMyISAM引擎对比测试章节)

由于所有操作都是顺序操作而且没有加入写操作感觉测试比较倾向于MyISAM引擎[]




测试机器也是为380G3但是内核为2.4.21初步看来2.6内核性能更好

对这个模拟感觉不是太理想模拟正式环境和测试极限速度这两者可能就有矛盾




1.3 网络访问速度

前面测试基本都是基于本机操作访问数据库操作但是更多应用是基于网络访问所以也业考虑测试下网络环境下MySQL访问速度

基于网络访问分为2种是利用长链接种是短链接就是每次访问都重新进行次链接

测试环境数据库使用MyISAM引擎使用Cache网络带宽为100Mbps

由于对于1个服务器可以循环使用SOCKET端口是有限所以我只执行了20000次操作进行比较由于测试数据较少对于这些数据比较差距就可以了

比较项目

本地操作

网络操作

使用长链接

网络操作

使用短链接

网络操作(STMT)

使用长链接


耗时(s)

处理速度(条/s)

耗时(s)

处理速度(条/s)

耗时(s)

处理速度(条/s)

耗时(s)

处理速度(条/s)


插入20000条记录

4

5000.00

13

1538.46

27

740.74

8

2500.00


查询20000条记录

4

5000.00

21

952.38

34

588.24

15

1333.33


改写20000条记录

4

5000.00

13

1538.46

29

689.66

8

2500.00


删除20000条记录

3

6666.67

13

1538.46

36

555.56

7

2857.14



比较图表如下:









对于网络访问网络长链接访问速度是本地执行速度3-4倍(降低了60%)网络短链接访问速度是本地执行速度7-8倍(降低了85%)[]

注意这个速度只是单链接下极限速度所以这并不代表MySQL在网络环境下处理速度(但个人认为极限速度不可能超过2倍)但是我们还是看出MySQL在网络环境下速度有相当下降[]而使用网络短链接要付出连接和断开连接成本

STMT操作方式(参看STMT章节)由于不用重新传递分析SQL在网络环境也表现了出了优于其他方式性能




由于测试数据较少可能影响到测试时间准确程度

对于长链接网络访问速度有如此下降我开始很怀疑我查询了我原来对Oracle作过组入库测试数据在同样100M网络环境环境下速度只降低了30%左右但我重新测试了1000000数据但得到结果还是如此(当然也可能是IDC内部网络过于繁忙)


基于MySQL在网络环境中表现差强人意如果硬件条件允许在作DB服务器设计时DB服务器和MySQL放在同个机器下可能是个更好选择

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: