MongoDB性能实践总结

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB性能优化,有很多优化的方案,因自己曾参与过一段IoM 1.3的性能优化工作,这里只总结了一下我们实践过的性能要点,作为回顾。一. MongoDB服务端性能优化点1. 限制连接数Mongod 的服务模型是每个网络连接由一个单独的线程来处理,每个线程配置了1MB 的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。另外,每个连接都要打开一个文件句柄,当然从成本上讲,这个消耗相对内存是小了很多。但换个角度,文件句柄也被其他模块消耗着,比如WT存储引擎,就需要消耗大量的文件句柄。分布式shard集群部署环境的最大连接数通过route进程的

MongoDB性能优化,有很多优化的方案,因自己曾参与过一段IoM 1.3的性能优化工作,这里只总结了一下我们实践过的性能要点,作为回顾。

一. MongoDB服务端性能优化点

  1. 限制连接数

Mongod 的服务模型是每个网络连接由一个单独的线程来处理,每个线程配置了1MB 的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。另外,每个连接都要打开一个文件句柄,当然从成本上讲,这个消耗相对内存是小了很多。但换个角度,文件句柄也被其他模块消耗着,比如WT存储引擎,就需要消耗大量的文件句柄。

分布式shard集群部署环境的最大连接数通过route进程的配置文件的 net.maxIncomingConnections 指定,默认值为1000000,相当于没有限制,生产环境强烈建议根据Mongodb节点的实际需求配置,以避免客户端误用导致mongodb负载过高 。

  1. 关闭数据库文件的atime

atime是linux文件系统记录的文件访问时间,大部分时候,它是没有用的。所以,在高IO,CPU wait高的情况下,关闭atime,可以提高性能。

【配置方法】由于针对设备,所以不会影响其他部件
在/etc/fstable中设置,例如
/dev/dm-6 /var/ceilometer ext3 defaults,noatime

3.使用XFS 文件系统

MongoDB在WiredTiger存储引擎下建议使用XFS文件系统。Ext4最为常见,但是由于ext文件系统的内部journal和WiredTiger有所冲突,所以在IO压力较大情况下表现不佳

3.提高Linux最大进程数/默认文件描述符限制

Linux默认的文件描述符数和最大进程数对于MongoDB来说一般会太低。官方建议把这个数值设为64000。因为MongoDB服务器对每一个数据库文件以及每一个客户端连接都需要用到一个文件描述符。如果这个数字太小的话在大规模并发操作情况下可能会出错或无法响应。
目前IoM给予的都比较大。
ulimit -n 64000
ulimit -u 64000

4.调小readhead
readhead 是磁盘预读字节,默认值是512KB。但是,由于MongoDB 随机访问数据的特点,所以不需要预读那么多,反而浪费内存。

【配置方法】
(1)查看readhead (RA)

blockdev --report

RO RA SSZ BSZ StartSec Size Device
rw 1024 512 4096 0 193269334016 /dev/dm-0

ll /dev/mapper/

total 0
crw-rw---- 1 root root 10, 236 Apr 6 03:07 control
lrwxrwxrwx 1 root root 7 Apr 6 03:07 vg1-lv1 -> ../dm-0

(2)设置readhead,预读从512KB降到128KB。256*512字节/扇区=128KB

–setra N 设置预读扇区(512字节)为N个.Set readahead to N 512-byte sectors.

blockdev --setra 256 /dev/dm-0

blockdev --report

RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 193269334016 /dev/dm-0

二. MongoDB应用端性能优化点

  1. 为cm,dm等模块访问DB的实际情况设置合适的MongoDB连接池大小

通常 MongoClient 使用默认100的连接池(具体默认值以 Driver 的文档为准)都没问题,当访问同一个 Mongod 的源比较多时,则需要合理的规划连接池大小。举个例子,Mongod 的连接数限制为2000,应用业务上有40个服务进程可能同时访问 这个Mongod,这时每个进程里的 MongoClient 的连接数则应该限制在 2000 / 40 = 50 以下 (连接复制集时,MongoClient 还要跟复制集的每个QQ拍卖成员建立一条连接,用于监控复制集后端角色的变化情况)。

  1. 对于多个字段的查询,建议使用组合索引,比交叉索引效率更好

如果你的查询会使用到多个字段,MongoDB有两个索引技术可以使用:交叉索引和组合索引。交叉索引就是针对每个字段单独建立一个单字段索引,然后在查询执行时候使用相应的单字段索引进行索引交叉而得到查询结果。交叉索引目前触发率较低,所以如果你有一个多字段查询的时候,建议使用组合索引能够保证索引正常的使用。

例如,如果应用需要查找所有年龄小于30岁的深圳市马拉松运动员:

db.T_DeviceData.find({deviceId: "584519b9-3340-4226-ab4e-49311a8b1c3d", appId: "HIxvSb_1dieBJr5IZY2g1zkb8Jga"})

则需要这样的一个索引:
db.T_DeviceData.ensureIndex({deviceId:1, appId:1});

  1. 组合索引字段顺序:匹配条件在前,范围条件在后

在创建组合索引时如果条件有匹配和范围之分,那么匹配条件(deviceId: “584519b9-3340-4226-ab4e-49311a8b1c3d”) 应该在组合索引的前面。范围条件比如字段应该放在组合索引的后面。

db.T_DeviceData.find({deviceId: "584519b9-3340-4226-ab4e-49311a8b1c3d", appId: "HIxvSb_1dieBJr5IZY2g1zkb8Jga",timeStamp:{ $lt: new Date(1486828800000) }})

db.T_DeviceData.find({timeStamp:{ $lt: new Date(1486828800000) },deviceId: "584519b9-3340-4226-ab4e-49311a8b1c3d", appId: "HIxvSb_1dieBJr5IZY2g1zkb8Jga",})

的索引性能更好

  1. 最重要但是优化代价最大的还是业务逻辑上的优化

将变化相对较少的数据缓存在redis,memcache, 减少应用端对DB的访问频率,特别是设备登录,上报数据等频繁发生的业务 。

三. MongoDB的profilling工具使用

开启profiling功能

有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。启动MongoDB 时加上–profile=级别 即可。也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置,Profiler 信息保存在system.profile 中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile 级别,类似如下操作:

db.setProfilingLevel(2);
上面profile 的级别可以取0,1,2 三个值,他们表示的意义如下:

0 – 不开启
1 – 记录慢命令 (默认为>100ms)
2 – 记录所有命令
Profile 记录在级别1 时会记录慢命令,那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加 –slowms 启动参数配置。第二种是调用db.setProfilingLevel 时加上第二个参数:

db.setProfilingLevel( level , slowms )
db.setProfilingLevel( 1 , 10 );

MongoDB Profile 记录是直接存在系统db 里的,记录位置system.profile ,所以,我们只要查询这个Collection 的记录就可以获取到我们的 Profile 记录了。列出执行时间长于某一限度(5ms)的 Profile 记录:

db.system.profile.find( { millis : { $gt : 5 } } )
MongoDB Shell 还提供了一个比较简洁的命令show profile,可列出最近5 条执行时间超过1ms 的 Profile 记录

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
2月前
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
4月前
|
JSON NoSQL MongoDB
MongoDB Schema设计实战指南:优化数据结构,提升查询性能与数据一致性
【8月更文挑战第24天】MongoDB是一款领先的NoSQL数据库,其灵活的文档模型突破了传统关系型数据库的限制。它允许自定义数据结构,适应多样化的数据需求。设计MongoDB的Schema时需考虑数据访问模式、一致性需求及性能因素。设计原则强调简洁性、查询优化与合理使用索引。例如,在构建博客系统时,可以通过精心设计文章和用户的集合结构来提高查询效率并确保数据一致性。正确设计能够充分发挥MongoDB的优势,实现高效的数据管理。
100 3
|
4月前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
66 0
|
6月前
|
NoSQL 测试技术 MongoDB
使用同步和异步方式更新插入MongoDB数据的性能对比
在这篇文章中,我将探讨如何使用同步和异步方式插入数据到MongoDB,并对两种方式的性能进行对比。并将通过Python中的 pymongo 和 motor 库分别实现同步和异步的数据插入,并进行测试和分析。
|
6月前
|
NoSQL BI MongoDB
深入理解 MongoDB 条件操作符:优化查询、精准筛选、提升性能
深入理解 MongoDB 条件操作符:优化查询、精准筛选、提升性能
151 1
|
6月前
|
存储 监控 NoSQL
MongoDB 覆盖索引查询:提升性能的完整指南
MongoDB 覆盖索引查询:提升性能的完整指南
|
6月前
|
存储 NoSQL 数据管理
MongoDB关系处理:优化数据管理、提升性能的最佳实践
MongoDB关系处理:优化数据管理、提升性能的最佳实践
|
6月前
|
NoSQL MongoDB 数据库
MongoDB索引:加速查询、提升性能的利器
MongoDB索引:加速查询、提升性能的利器