设为首页 收藏本站
查看: 2199|回复: 0

[经验分享] 重新认识Mongodb的插入性能(使用PHP驱动)

[复制链接]

尚未签到

发表于 2015-12-22 14:29:41 | 显示全部楼层 |阅读模式
对于我之前的关于Mongodb的插入速度的问题,有网友jasbling2提出了质疑。
http://blog.iyunv.com/xmlrpc.php?r=blog/article&uid=20726500&id=4981629
这么导入70000多行,平均每秒才800多个插入,我用你这种方式导入也很慢,但是我用php的mongo驱动插入就可以达到每秒4w到5w的插入
关于这个800有两点需要解释 1)虽然最终插入的是7w多条记录,但执行的插入操作确是10w次(有2w多条失败了),所以每秒的插入操作应该是1000出头。 2)使用mongo控制台插入存在客户端瓶颈,我在比较的时候特意转成了服务端的CPU资源占用(20.39%),如果能把服务端CPU撑满的话,每秒的插入就能达到5000了。
但是这个5000和jasbling2的5w还是差别满大的,为了解开其中原因,我在和之前一样的测试环境里,按照下面的链接,以jasbling2相同的测试方法做了一次插入测试。
http://blog.csdn.net/e421083458/article/details/8849247
软件安装mongo的最新php驱动
参考 http://php.net/manual/zh/mongo.installation.php 进行安装,但我的机子执行“pecl install mongo”老是失败,只好从源码安装。

wget http://pecl.php.net/get/mongo-1.6.7.tgz
phpize
./configure
make install
编辑/etc/php.ini,加入下面一句 extension=mongo.so
测试结果

-bash-4.1$ cat test.php


-bash-4.1$ time php test.php
real 1m41.267s
user 0m22.615s
sys 0m12.188s
这样算下来,每秒大约插入1w条,和http://php.net/manual/zh/mongo.installation.php 的测试结果(87秒)基本差不多。(但是jasbling2为什么能达到4w到5w,估计是他测试用的CPU太强悍了。)
再看看CPU资源利用率。

[iyunv@hanode1 ~]# top
top - 02:33:56 up 2 days, 23:41,  7 users,  load average: 0.52, 0.14, 0.04
Tasks: 168 total,   3 running, 165 sleeping,   0 stopped,   0 zombie
Cpu(s): 16.6%us,  6.8%sy,  0.0%ni, 74.8%id,  0.0%wa,  0.0%hi,  1.8%si,  0.0%st
Mem:   1019320k total,   958176k used,61144k free,   131124k buffers
Swap:  2064376k total,  152k used,  2064224k free,   576196k cached

PID USER  PR  NI  VIRT  RES  SHR S %CPU %MEMTIME+  COMMAND   
23571 postgres  20   0  356m  71m  11m S 64.5  7.2   0:20.91 mongod
24545 postgres  20   0  208m 7332 4796 S 34.9  0.7   0:05.00 php
CPU资源利用率是64.5%,折算下来,插入100w记录使用CPU 46s,而之前用mongo插入10w记录使用CPU 20.39s。这样就有将近5倍的差距。 但是这两次测试插入的数据不一样,一个记录大,一个记录小,不具可比性

  • 之前测试插入的10w条记录,有43M
    db.jsontables.stats() { "ns" : "benchmark.jsontables", "count" : 100001, "size" : 266284846, "avgObjSize" : 2662, "storageSize" : 43167744,

  • 现在插入的100多w条记录,只有22M
    db.members.stats() { "ns" : "admin.members", "count" : 1137596, "size" : 167004402, "avgObjSize" : 146, "storageSize" : 22216704,

现在用php驱动,测试一下和之前mongo测试差不多大小的记录,插入10w条。

-bash-4.1$ cat test2.php


-bash-4.1$ time php test2.php

real 0m13.574s
user 0m2.930s
sys 0m1.357s
再看看CPU资源利用率。

[iyunv@hanode1 ~]# top
top - 02:59:13 up 3 days, 6 min,  7 users,  load average: 0.16, 0.03, 0.01
Tasks: 168 total,   1 running, 167 sleeping,   0 stopped,   0 zombie
Cpu(s):  9.8%us, 14.8%sy,  0.0%ni, 74.2%id,  0.0%wa,  0.1%hi,  1.0%si,  0.0%st
Mem:   1019320k total,   948556k used,70764k free,   127372k buffers
Swap:  2064376k total,  152k used,  2064224k free,   565232k cached

PID USER  PR  NI  VIRT  RES  SHR S %CPU %MEMTIME+  COMMAND   
23571 postgres  20   0  380m  86m  11m S 72.5  8.7   1:26.44 mongod
27145 postgres  20   0  208m 7332 4796 S 30.2  0.7   0:01.73 php
59 root  20   0 000 S  0.7  0.0   0:00.16 kswapd0
现在的CPU耗是 13.574*72.5%=9.8s。 这和之前用mongo插入10w记录(20.39s)相比。性能提升了一倍。
下面再看看通过mongo插入小数据的性能(insert_mongo.sh会生成指定数目的插入语句)

-bash-4.1$ sh insert_mongo.sh 100000|time -p mongo benchmark >/dev/null
real 75.04
user 33.68
sys 23.34

[iyunv@hanode1 ~]# top
top - 04:09:08 up 3 days,  1:16,  5 users,  load average: 0.08, 0.02, 0.01
Tasks: 162 total,   2 running, 160 sleeping,   0 stopped,   0 zombie
Cpu(s): 16.4%us,  1.4%sy,  0.0%ni, 75.9%id,  0.0%wa,  0.0%hi,  6.2%si,  0.0%st
Mem:   1019320k total,   915384k used,   103936k free,   128780k buffers
Swap:  2064376k total,  152k used,  2064224k free,   477816k cached

PID USER  PR  NI  VIRT  RES  SHR S %CPU %MEMTIME+  COMMAND   
2231 postgres  20   0  748m  66m 9208 R 75.8  6.7   0:06.54 mongo  
23571 postgres  20   0  382m  87m  11m S 21.6  8.8   2:50.43 mongod
2229 postgres  20   0  103m 1216 1060 S  7.0  0.1   0:00.65 sh
这样这算下来插入10w记录,消耗CPU 16.2s,是用php驱动(100w,46s)时的差不多4倍。
总结

  • mongo控制台插入小文档(130字节)时,mongod进程消耗的CPU是使用php驱动时的4倍。
  • mongo控制台插入大文档(2300字节)时,mongod进程消耗的CPU是使用php驱动时的2倍。
  • 使用php驱动插入大文档(2300字节)时,mongod进程消耗的CPU是插入小文档(130字节)时的2倍。
  • 使用mongo控制台插入大文档(2300字节)时,mongod进程消耗的CPU是插入小文档(130字节)时的1.2倍。
之前用mongo控制台测试mongoDB的插入性能有点对不住mongoDB了。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-154858-1-1.html 上篇帖子: Mongodb 备份和恢复 下篇帖子: 生产环境MongoDB 分片与集群 方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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