您现在的位置:主页 > 数据库 > MySQL >

MongoDB、HandlerSocket和MySQL性能测试

来源:建站吧 责任编辑:Jzq8 发表时间:2011-12-24 点击:
 一、测试环境

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

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    评价:
    表情:
    验证码:点击我更换图片

    推荐图文

    • 备份和拷贝MYSQL数据库
    • MySQL&Perl,便利之合
    • ASP.NET+MySQL简明图示入门
    • MySQL数据库安全配置指南
    • 如何在ASP中连接MySQL数据库
    • MySql数据库插入式的多存储引擎机制
    • 如何做好MySQL查询优化
    • NavicatforMySQL与MySQL-Front详细解析
    • MYSQL错误:Can’topenfile:‘×××.MYI’(errno:145)
    Alexa - 客户服务 - 联系方法 - 招聘信息 - 友情链接 - 网站地图 - TAG标签 - RSS订阅
    Copyright © 2010-2012 JZQ8.COM. 建站吧|建站去吧 版权所有
    冀ICP备09002514号
    冀ICP备09002514号 网络报警 企业法人营业执照 中国互联网协会 支付宝付款 网银在线付款