MongoDB · 最佳实践 · 短连接Auth性能优化

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

问题

通常我们使用MongoDB的时候,客户端(driver)和MongoDB之间都是使用长连接,但是在某些场景下、某些driver仍然只能使用短连接进行连接,比如PHP。就在我们阿里云数据库MongoDB版商业化后没多久,我们就遇到了一个用户短连接过多导致的性能问题。

这个问题的症状是MongoD的CPU使用率居高不下,16个核都跑满了,影响到了用户的正常使用。

排查

首先想到的当然是看看有没有很多慢查询,针对存在的慢查询都建议用户建了索引后,情况还是没有好转。这时我们观察到用户的driver不断有短连接上来,基本上身份认证完执行个操作后很快就断开。会不会是短连接的问题导致呢?因为阿里云数据库MongoDB版出于安全考虑,强制打开了身份认证,我们知道 MongoDB3.0 后使用的身份认证机制是SCRAM-SHA1,这是需要进行一些 CPU 密集型操作比如哈希计算等的。通过profile工具进行诊断后,我们发现 CPU 热点非常集中,主要消耗在读取 /dev/urandom 来生成随机数,这需要通过系统调用进入内核态。再结合监控,确实 CPU 都消耗在sys而不是user。以下为profile工具诊断图:

MongoD函数调用链

对照一下源码就知道了,这是因为在认证过程中需要生成一串叫做server-nonce的随机字符串(具体的认证过程及这个随机字符串的作用可参照MongoDB中使用的SCRAM-SHA1认证机制。在Linux平台下,是通过这个/dev/urandom(Linux上提供了两个随机数生成的特殊设备文件,还有一个是/dev/random,这两个的区别是从/dev/urandom 中读取是非阻塞的,具体可再自行google或看man手册。)来生成随机数的。其原理是利用当前系统的熵池来计算出一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音,因此其随机效果还是比较好的。不过有利必有弊,这个/dev/urandom的性能就不怎么好了。要使用这个来生成随机数,首先要进行系统调用,这涉及用户态到内核态的切换。其次,为了避免两个并发读返回同样的结果,在内核中使用了spinlock,因此在多线程并发从/dev/urandom中读时,性能会急剧下降。这个东东设计之初是为了安全,而不是性能。因此建议的做法是使用/dev/urandom来初始化用户态的随机数,而不是每个请求都从这里取。

解决

既然知道了问题,那么解决也就好办了,当然是想办法使用一个性能较好,随机性又不差的方案来替换这个/dev/urandom。我们使用了一个用户态的随机数生成器,效果非常明显,CPU使用率从100%降到10%。

以下为优化前后CPU使用率对比图:

CPU使用率前后对比

其中红色、蓝色、绿色分别为关闭Auth、打开Auth(优化前)和打开Auth(优化后)。

目前阿里云数据库MongoDB版已经全面使用了性能优化版,所以各位使用短连接(如PHP driver)的客官们可以放心使用了。

相关实践学习
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
目录
相关文章
|
21天前
|
SQL 存储 关系型数据库
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES系列
28 0
|
5月前
|
关系型数据库 C语言 PostgreSQL
PostgreSQL服务端开发学习 -- fmgr.h
fmgr按官方的解释就是Postgres函数管理器和函数调用接口,在使用C语言开发PostgreSQL后端应用时,所以与backend交互时必须遵循fmgr.h中定义的一些规范。
133 0
|
4月前
|
SQL 关系型数据库 中间件
postgresql从入门到精通 - 第35讲:中间件PgBouncer部署
postgresql技术大讲堂,从入门到精通 - 第35讲:中间件PgBouncer部署
172 1
|
8月前
|
存储 NoSQL Java
|
SQL 关系型数据库 MySQL
云时代,最好用的MySQL客户端工具推荐
本文完整对比了12种MySQL图形客户端(GUI)工具,从产品体验、功能完整度、云适配、计费模式、OS兼容性等多个角度进行评估与分析,给出推荐。下面产品推荐与整体得分图,读者可根据自己的实际情况选择。
920 0
云时代,最好用的MySQL客户端工具推荐
|
NoSQL MongoDB 数据库
《开源数据库 MongoDB 专场 MongoDB疑难杂症分析及优化》电子版地址
开源数据库 MongoDB 专场 MongoDB疑难杂症分析及优化
146 0
《开源数据库 MongoDB 专场 MongoDB疑难杂症分析及优化》电子版地址
|
NoSQL MongoDB 数据库
《开源数据库MongoDB专场MongoDB疑难杂症分析及优化》电子版地址
开源数据库MongoDB专场MongoDB疑难杂症分析及优化
117 0
《开源数据库MongoDB专场MongoDB疑难杂症分析及优化》电子版地址
|
存储 NoSQL
MongoDB · 引擎特性 · 复制集原理
复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
1535 0
|
存储 NoSQL 索引
MongoDB · 引擎特性 · MongoDB索引原理
为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样适用于其他的数据库比如mysql)。 mongo-9552:PRIMARY> db.
1516 0
|
NoSQL
MongoDB · 引擎特性 · 事务实现解析
MongoDB 4.0 引入的事务功能,支持多文档ACID特性,例如使用 mongo shell 进行事务操作 > s = db.getMongo().startSession() session { "id" : UUID("3bf55e90-5e88-44aa-a59e-a30f777f1d89") } > s.
1971 0