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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 对于我之前的关于Mongodb的插入速度的问题,有网友jasbling2提出了质疑。 http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20726500&id=4981629 这么导入...

对于我之前的关于Mongodb的插入速度的问题,有网友jasbling2提出了质疑。

http://blog.chinaunix.net/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
<?php header("Content-Type:text/html;charset=utf-8");  
$conn = new Mongo("mongodb://127.0.0.1:27017/benchmark");  

$db = $conn->admin;  
$collection = $db->members; 

for($i=1;$i 'chuchuchu_'.$i, 'name' => '褚褚褚', 'password' => 'e10adc3949ba59abbe56e057f20f883e', 'email' => 'dhaig@yahoo.com.cn');  
$collection->insert($user);  
}

$conn->close(); 

?>

-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资源利用率。

[root@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
<?php header("Content-Type:text/html;charset=utf-8");  
$conn = new Mongo("mongodb://127.0.0.1:27017/benchmark");  

$db = $conn->admin2; 

$collection = $db->members;


for($i=1;$i 'chuchuchu_'.$i, 'name' => '褚褚褚', 'password' => 'e10adc3949ba59abbe56e057f20f883e', 'email' => 'dhaig@yahoo.com.cn'); 

$user = array('uname' => 'chuchuchu_'.$i, 'name' => '褚褚褚', 'password' => 'e10adc3949ba59abbe56e057f20f883e', 'email' => 'dhaig@yahoo.com.cn','description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eget elit ut nulla tempor viverra vel eu nulla. Sed luctus porttitor urna, ac dapibus velit fringilla et. Donec iaculis, dolor a vehicula dictum, augue neque suscipit augue, nec mollis massa neque in libero. Donec sed dapibus magna. Pellentesque at condimentum dolor. In nunc nibh, dignissim in risus a, blandit tincidunt velit. Vestibulum rutrum tempus sem eget tempus. Mauris sollicitudin purus auctor dolor vestibulum, vitae pulvinar neque suscipit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus lacus turpis, vulputate at adipiscing viverra, ultricies at lectus. Pellentesque ut porta leo, vel eleifend neque. Nunc sagittis metus at ante pellentesque, ut condimentum libero semper. In hac habitasse platea dictumst. In dapibus posuere posuere. Fusce vulputate augue eget tellus molestie, vitae egestas ante malesuada. Phasellus nunc mi, faucibus at elementum pharetra, aliquet a enim. In purus est, vulputate in nibh quis, faucibus dapibus magna. In accumsan libero velit, eu accumsan sem commodo id. In fringilla tempor augue, et feugiat erat convallis et. Sed aliquet eget ipsum eu vestibulum.Curabitur blandit leo nec condimentum semper. Mauris lectus sapien, rutrum a tincidunt id, euismod ac elit. Mauris suscipit et arcu et auctor. Quisque mollis magna vel mi viverra rutrum. Nulla non pretium magna. Cras sed tortor non tellus rutrum gravida eu at odio. Aliquam cursus fermentum erat, nec ullamcorper sem gravida sit amet. Donec viverra, erat vel ornare pulvinar, est ipsum accumsan massa, eu tristique lorem ante nec tortor. Sed suscipit iaculis faucibus. Maecenas a suscipit ligula, vitae faucibus turpis.Cras sed tellus auctor, tempor leo eu, molestie leo. Suspendisse ipsum tellus, egestas et ultricies eu, tempus a arcu. Cras laoreet, est dapibus consequat varius, nisi nisi placerat leo, et dictum ante tortor vitae est. Duis eu urna ac felis ullamcorper rutrum. Quisque iaculis, enim eget sodales vehicula, magna orci dignissim eros, nec volutpat massa urna in elit. In interdum pellentesque risus, feugiat pulvinar odio eleifend sit amet. Quisque congue libero quis dolor faucibus, a mollis nisl tempus.');

$collection->insert($user);  
}

$conn->close();  
?>

-bash-4.1$ time php test2.php

real 0m13.574s
user 0m2.930s
sys 0m1.357s 

再看看CPU资源利用率。

[root@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

[root@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倍。

总结

  1. mongo控制台插入小文档(130字节)时,mongod进程消耗的CPU是使用php驱动时的4倍。
  2. mongo控制台插入大文档(2300字节)时,mongod进程消耗的CPU是使用php驱动时的2倍。
  3. 使用php驱动插入大文档(2300字节)时,mongod进程消耗的CPU是插入小文档(130字节)时的2倍。
  4. 使用mongo控制台插入大文档(2300字节)时,mongod进程消耗的CPU是插入小文档(130字节)时的1.2倍。

之前用mongo控制台测试mongoDB的插入性能有点对不住mongoDB了。

 

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5天前
|
安全 测试技术 PHP
如何评估PHP框架的性能?
【9月更文挑战第2天】如何评估PHP框架的性能?
23 5
|
14天前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
30 3
|
22天前
|
SQL 缓存 数据库连接
拯救php性能的神器webman-数据库
Webman 框架与这些最佳数据库管理实践的结合,可为应用程序提供快速响应的用户体验,高吞吐量,提升应用程序的整体性能表现。在对数据库交互进行设计和开发时,持续关注性能指标和优化,确保数据库层面不会成为应用程序的瓶颈,这样便能充分利用 Webman 来提升 PHP 应用的性能。
53 4
|
1月前
|
存储 前端开发 JavaScript
优化PHP代码性能
【8月更文挑战第3天】优化PHP代码性能
40 16
|
1月前
|
存储 缓存 自然语言处理
|
7天前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
15 0
|
2月前
|
缓存 安全 测试技术
深入PHP 7:新特性与性能提升解析
在PHP 7的发布中,我们见证了一系列令人兴奋的性能改进和新特性的加入。本文将深入探讨这些变化如何影响开发者的日常编程实践,并展示通过实际例子如何最大化利用PHP 7的优势。准备好迎接代码效率和开发体验的全新升级!
|
2月前
|
存储 监控 大数据
深入理解PHP 7的新特性及其性能优化技巧
【7月更文挑战第26天】随着PHP 7的发布,这一广泛使用的编程语言迎来了重大的性能提升和新特性。本文将深入探讨PHP 7的核心改进点,包括性能提升的原因、新引入的语言特性以及如何利用这些变化来优化现有和未来的PHP项目。我们将通过实际代码示例和性能分析工具来展示如何有效地应用这些新特性以达到最佳的性能表现。
|
22天前
|
缓存 安全 编译器
探索PHP 8的新特性:提升现代Web开发的效率与性能
PHP 8的推出标志着这个流行的服务器端脚本语言迈入了一个新的时代。本文将深入探讨PHP 8中引入的一些关键新特性,包括JIT编译器、联合类型、命名参数、弱引用等,并解释这些特性如何为开发者提供更高效的编程工具和改进的性能。我们将通过实际代码示例来展示这些新特性的应用,帮助读者理解如何利用PHP 8来构建更快、更可靠、更易于维护的Web应用。
27 0
|
2月前
|
测试技术 编译器 PHP
PHP 7与PHP 8的性能比较
本文通过对比分析PHP 7和PHP 8在不同场景下的性能表现,揭示新版本在执行速度、内存占用等方面的改进。利用实际测试数据支撑结论,为开发者提供升级决策的依据。
下一篇
DDNS