handlersocket mysql_[原创]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. 查询

ffd6842beb9a54eb1434a51480b5f117.png

66e20f84785ca4ed3e812dd6992cd9bf.png

2. 插入

ffd6842beb9a54eb1434a51480b5f117.png

32532b28696abf3f0b53b45d46f2bcb6.png

bd8101c9f8d7dfb7384067ae9e3b9218.png

2、1000万条记录1. 查询

a7b013290495371ecdbcd0fc96dc7bd6.png

be49f417acc9c94002ef9abefd2a6f35.png

2. 插入

4784a07f34cf1ba9842ba3fc9b10eda1.png

7e25ec03eade1645c80a531b6af1683a.png

1e807aeb8fd4c324f512a332066ff3ef.png

3、2000万条记录

1. 查询

02eaeee99a4b7da33245af0de35b7535.png

808842f3b653d3721a621ded83e91929.png

2. 插入

ea29612603fa7df6046d6628d7006e62.png

f3215c68f8402db44c3f3db8dab38f9f.png

215155695dabf7228d8023b14f786196.png

4、5000万条记录1. 查询

2a2c63397747682aff289f8ebdeb1205.png

290b83ad374d82cb08d52d9461d2f0ce.png

2. 插入

3223c49d803ac9f8dbef8f026c1e6b18.png

d1a774a5b7603b25c1e0ffcadc72745f.png

884d32098ff116be8ec7b8166f24a6bb.png

三、测试分析总结

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万以上。

转载请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值