随笔-57  评论-177  文章-2  trackbacks-6

[原创]MongoDB、HandlerSocket和MySQL性能测试及其结果分析

 

一、测试环境
1、测试服务器状况
共涉及4台测试服务器:

压力测试服务器
Web服务器
MongoDB服务器

MySQL服务器。

 

机器配置为:
CPU:Intel(R) Core(TM)2 Duo CPU     E7200  @ 2.53GHz
RAM:8G DDR2 667
磁盘:SATA

操作系统:Redhat 5.5

 

1. 压力测试服务器
安装Webbench 1.5,通过Webbench来压Web服务器。

 

2. Web服务器
Nginx 0.8.54 + PHP 5.3.3 (php-fpm),安装有Mongodb和HandlerSocket的php驱动。
Mongodb的php驱动为:mongodb-mongo-php-driver-1.1.1-19-gc584231.tar.gz
HandlerSocket的php驱动为:php-handlersocket-0.0.7.tar.gz
通过Php程序来调用Mongodb和HandlerSocket。

 

3. MongoDB服务器
MongoDB版本:1.6.5

 

4. MySQL服务器
MySQL版本:5.1.53
HandlerSocket版本:1.0.6-60-gf51e061
MySQL存储引擎:Innodb,调整了innodb的Thread Pool Size为2G


2、测试程序和测试数据提取
1. 为了避免打开连接和Http服务器成为瓶颈,在测试程序里设置为每1000个请求公用同一个连接,同时设置为每个页面请求执行1000次数据请求。
2. 测试的数据,包括QPS、CPU、IO等方面的数据,从操作系统提供的命令(如vmstat、iostat等)或者Mongodb、Mysql提供的命令(如mongostat、mysqladmin等)来获取。


二、测试结果
1、100万条记录
1. 查询

 

 

2. 插入


2、1000万条记录
1. 查询


2. 插入

 

3、2000万条记录

1. 查询

 
2. 插入

 


4、5000万条记录
1. 查询

 

2. 插入 


三、测试分析总结

1、 I/O读写情况
从插入情况下的TPS数据可以看出, MySQL、HandlerSocket和Mongodb的数据有比较明显的差别,这主要跟他们的内部实现和测试方式有关系。

 

测试场景下MySQL采用的是单条Insert的方式,所以可以看出QPS数和TPS数是基本一致的,也就是每个Insert操作,都对应有一次I/O写入操作。可以从MySQL数据库本身做一些优化,这次测试没有覆盖到这种场景。

 

HandlerSocket内部采用的是Bulk Insert操作,所以,可以看出QPS数明显大于TPS数,批量的插入操作明显提高了整体性能。

 

Mongodb内部采用合并操作的方式,采用数据先存放到内存中,然后再Flush到磁盘上的方式。所以,从测试数据可以看出,TPS曲线坡度非常大:有时候TPS是零,这时候是还放到内存中,还没有Flush到磁盘上;有时候TPS非常高,同时这时候CPU也非常高,几乎是100%,这时候是在做Flush到磁盘的操作。基于此种机制,以后会再做一些更细化的优化和测试,因为这样有可能会存在几种问题:
第一, 可能会导致某个时间段IO和CPU的压力非常大,甚至达到峰值,这种情况下,服务的整体健康状态将面临着一些挑战。
第二, 如果服务器重启,可能会出现数据丢失的情况,内存中的数据还没有Flush到磁盘的会丢失。当然这种情况是两面性的,因为采用这种方式,从测试结果也可以看出,整体的写入性能比MySQL和HandlerSocket都高,这是一种取舍,就看具体业务是否可以接受这样的以高性能换取数据可靠性,有些业务可能是可以接受的,比如Feed。


2、 CPU占用情况
从查询情况下的CPU数据可以看出,MySQL和Mongodb几乎都接近100%,而HandlerSocket由于省去了各种Sql Parser和相关的操作,CPU占用率保持在40%-60%之间,在一个比较合理的范围内。

 

从插入情况下的CPU数据可以看出,HandlerSocket的CPU占用率还是保持在40%-60%之间,低于MySQL和Mongodb。MySQL和Mongodb大部分情况保持在50%-90%之间。

 

3、 QPS情况
从查询情况下的QPS数据可以看出,HandlerSocket和Mongodb的查询性能几乎差不多,都达到3万以上,并且随着数据量的增长,性能没有回落,还是保持在3万以上。目前只是最大测试到5000万数据的情况,更高的数值这次测试还没有覆盖到。而MySQL的性能相比之下则差一些,一般在18000到25000之间。当然这次没有太多的针对MySQL做优化,只是增大了innodb_thread_pool大小和每次分配的数据块的大小,如果针对MySQL做优化,可能能同时提高HandlerSocket和MySQL的性能。

 

从插入情况下的QPS数据可以看出,Mongodb明显占有比较大的优势,这根之前说的它的实现方式有关。随着数据量的增长,QPS都相应的在减少,这方面,MySQL的幅度最大,数据量到达5000万以上时,MySQL的插入性能为2000-3000,而HandlerSocket能保持在1万以上,Mongodb为2万以上。

 

作者:洪小军
出处:http://www.cnblogs.com/inrie

转载请注明出处,谢谢!

posted on 2011-02-22 16:05 Inrie(洪小军) 阅读(4648) 评论(14) 编辑 收藏

评论:
#1楼 2011-02-22 16:41 | longware      
参考
 回复 引用 查看   
#2楼 2011-02-22 17:46 | Jeffrey Zhao      
HandlerSocket是什么啊?
 回复 引用 查看   
#3楼 2011-02-22 17:59 | lovecindywang      

 回复 引用 查看   
#4楼[楼主] 2011-02-22 18:05 | Inrie(洪小军)      
@Jeffrey Zhao
HandlerSocket是MySQL的一个Plugin,通过它可以直接跟MySQL的Storage Engine Layer(比如InnoDB)交互,而不需要通过MySQL的Parser Layer。从性能角度有很大的提升。具体的可以看之前我写的几篇关于HandlerSocket的文章“HandlerSocket系列(一):由来”(http://www.cnblogs.com/inrie/archive/2011/01/28/1946572.html

 回复 引用 查看   
#5楼 2011-02-22 18:47 | Jeffrey Zhao      
@Inrie(洪小军)
话说图表应该加上单位吧,否则不懂表达什么含义……

 回复 引用 查看   
#6楼 2011-02-22 23:34 | 周行天下      
加上单位吧。。。看不懂什么意思
 回复 引用 查看   
#7楼[楼主] 2011-02-23 00:44 | Inrie(洪小军)      
@Jeffrey Zhao
@周行天下
图表已经添加上单位~

 回复 引用 查看   
#8楼 2011-02-28 13:01 | forchenyun      
请教:
1.5000w数据的文件总大小是多大?MySQL的buffer设的多大?
2.你的查询测试有没有热点,还是5000w以内进行随机?
3.硬盘是单块的SATA还是RAID?

 回复 引用 查看   
#9楼[楼主] 2011-02-28 16:00 | Inrie(洪小军)      
@forchenyun
1.5000w的数据MySQL占用19603MB(只包含数据文件,暂不包括日志文件),MongoDB为26591MB。MySQL的InnoDB Buffer Pool Size为2G
2.关于热点问题,首先在数据层面没有热点。查询层面MySQL是有存在热点,但是HandlerSocket和MongoDB基本是不会有热点,在同样的随机范围内。
3.磁盘是单块的SATA

声明一下:我这个测试主要还是一个基准测试,由于硬件资源有限,同时测试的覆盖面也不是特别广,比如还应该有响应时间相关的,这也是很重要的一个指标。之后如果有时间,可能也会针对这些再做一次测试。

 回复 引用 查看   
#10楼 2011-03-09 10:37 | shawny      
对于qps,我觉得你应该说一下你每条记录多大啊?
 回复 引用 查看   
#11楼 2011-03-22 10:08 | 蛙蛙王子      
@Jeffrey Zhao
老赵到处跑呀

很好的一个测试,请问HandlerSocket可以支持HTTPS链接吗?

 回复 引用 查看   
#12楼 2011-10-15 14:10 | Sail      
你用什么工具测的
 回复 引用 查看   
#13楼 2011-11-02 15:42 | Sail      
webbench并发100持续10秒查询(每个页面使用同一个链接,执行1000次查询操作)

Requests: xx susceed, 0 failed.
用xx 乘于1000 除于 10 算出来的是不是等价于QPS值

 回复 引用 查看   
#14楼 2011-12-26 17:24 | tomren      
第一张100W查询的图放错了,如果能提供做图的原数据就更好了。
 回复 引用 查看