MongoDB短连接Auth性能优化

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 通常我们使用MongoDB的时候,客户端(driver)和MongoDB之间都是使用长连接,但是在某些场景下、某些driver仍然只能使用短连接进行连接,比如PHP。就在我们阿里云数据库MongoDB版商业化后没多久,我们就遇到了一个用户短连接过多导致的性能问题。 问题 这个问题的症状是Mong

通常我们使用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
目录
相关文章
|
缓存 NoSQL 大数据
|
NoSQL 前端开发 JavaScript
服务器小白的我,是如何成功将 node+mongodb 项目部署在服务器上并进行性能优化的
服务器小白的我,是如何成功将 node+mongodb 项目部署在服务器上并进行性能优化的
193 0
服务器小白的我,是如何成功将 node+mongodb 项目部署在服务器上并进行性能优化的
|
NoSQL 应用服务中间件 Linux
如何将node+mongodb项目部署在阿里云服务器,并进行性能优化的
这个就是利用 ngonx 开启 gzip,亲测开启之后,压缩了接近 2/3 的文件大小,本来要 1M 多的文件,开启压缩之后,变成了 300k 左右。
3947 0
|
新零售 缓存 NoSQL
Redis&MongoDB 社区双周刊第1期:Redis多线程性能优化
云栖社区已有1000位Redis&MongoDB开发者,发布了5000+Redis文章,发布了2000+MongoDB文章,沉淀了800+的Redis精品问答,沉淀了1000+的MongoDB精品问答。
2419 0
|
NoSQL 数据库 数据库管理
|
NoSQL 数据库 数据安全/隐私保护
|
NoSQL 数据库 MongoDB
MongoDB最佳实践及性能优化(DTCC中国数据库技术大会分享PPT)
上周五在北京DTCC分享了「32 Tips to Boost MongoDB Performance」,本文是分享的PPT以及重要内容的注解。 注解:本次分享主要「自底向上」的介绍提升 MongoDB 服务性能需要注意的问题,从硬件、操作系统、服务端一直到应用端,前面3个层次的建议主要面向DBA及运维人员,而最上层的应用开发建议主要面向开发者。