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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

问题

通常我们使用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
目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
MySQL操作利器大公开!这几款客户端让你事半功倍
本文介绍了多种MySQL数据库管理工具,包括命令行工具、图形化用户界面(GUI)工具和Web界面工具。主要工具有: 1. **Navicat for MySQL**:功能强大,支持多种数据库管理任务,但需付费。 2. **DBeaver**:开源免费,支持多种数据库,安装包较大。 3. **MySQL Workbench**:官方提供的图形化工具,适合MySQL全家桶用户。 4. **HeidiSQL**:轻量级Windows客户端,简单易用。 5. **phpMyAdmin**:基于Web的管理工具,易于部署和使用。 6. **SQLyog**:适用于Windows,功能丰富,有免费
257 3
|
9月前
|
SQL 关系型数据库 数据库
阿里云数据库 RDS SQL Server版实战【性能优化实践、优点探析】
本文探讨了Amazon RDS SQL Server版在云数据库中的优势,包括高可用性、可扩展性、管理便捷、安全性和成本效益。通过多可用区部署和自动备份,RDS确保数据安全和持久性,并支持自动扩展以适应流量波动。可视化管理界面简化了监控和操作,而数据加密和访问控制等功能保障了安全性。此外,弹性计费模式降低了运维成本。实战应用显示,RDS SQL Server版能有效助力企业在促销高峰期稳定系统并保障数据安全。阿里云的RDS SQL Server版还提供了弹性伸缩、自动备份恢复、安全性和高可用性功能,进一步优化性能和成本控制,并与AWS生态系统无缝集成,支持多种开发语言和框架。
532 2
|
8月前
|
存储 关系型数据库 MySQL
精通MySQL:从基础到高级应用及性能优化
第一章:MySQL入门 1.1 MySQL简介 介绍MySQL的历史、版本和开源特性
|
SQL 缓存 关系型数据库
简述MySQL可以从哪些方面做到性能优化
数据库设计优化:良好的数据库设计是性能优化的基础。包括选择适当的数据类型、建立正确的索引以及合理划分表等。通过优化数据库结构,可以减少磁盘空间的占用和提高查询效率。
149 0
|
Go 调度 数据库
Cookie server 性能优化实践(上)
Cookie server 性能优化实践
77 0
|
网络协议 Java Go
Cookie server 性能优化实践(下)
Cookie server 性能优化实践(下)
92 0
|
存储 消息中间件 缓存
Redis入门指南:深入了解这款高性能缓存数据库
1. 什么是Redis? Redis(Remote Dictionary Server)是一个开源的,基于内存的高性能键值存储系统。它可以作为数据库、缓存和消息中间件使用。Redis的数据存储在内存中,这使得数据的读写速度非常快,因此它被广泛应用于需要高并发、低延迟的场景中。
256 0
|
SQL 关系型数据库 MySQL
关于MySQL性能优化方式,这一篇就够!
关于MySQL性能优化方式,这一篇就够!
108 0
关于MySQL性能优化方式,这一篇就够!
|
SQL 缓存 监控
【MySQL从入门到精通】【高级篇】(二十一)数据库优化步骤_查看系统性能参数
上一篇文章我们介绍了哪些情况下适合创建索引,哪些情况下不适合创建索引,下面就介绍一下数据库优化步骤 【MySQL从入门到精通】【高级篇】(二十)适合创建索引的11种情况&不适合创建索引的7种情况,万字长文
198 0
【MySQL从入门到精通】【高级篇】(二十一)数据库优化步骤_查看系统性能参数

热门文章

最新文章