weiliwei 发表于 2015-12-22 14:29:41

重新认识Mongodb的插入性能(使用PHP驱动)

对于我之前的关于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资源利用率。

# 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 USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND   
23571 postgres20   0356m71m11m S 64.57.2   0:20.91 mongod
24545 postgres20   0208m 7332 4796 S 34.90.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资源利用率。

# 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 USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND   
23571 postgres20   0380m86m11m S 72.58.7   1:26.44 mongod
27145 postgres20   0208m 7332 4796 S 30.20.7   0:01.73 php
59 root20   0 000 S0.70.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

# 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 USERPRNIVIRTRESSHR S %CPU %MEMTIME+COMMAND   
2231 postgres20   0748m66m 9208 R 75.86.7   0:06.54 mongo
23571 postgres20   0382m87m11m S 21.68.8   2:50.43 mongod
2229 postgres20   0103m 1216 1060 S7.00.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]
查看完整版本: 重新认识Mongodb的插入性能(使用PHP驱动)