MongoDB性能最佳实践:硬件和操作系统配置

请添加图片描述

欢迎阅读有关MongoDB性能最佳实践的系列博文。在往期文章中,我们已经讨论过查询模式和性能分析、事务和读/写关注等实现大规模性能的关键考虑因素。在本篇文章中,我们将讨论硬件和操作系统配置

如果您在阿里云上部署MongoDB,那么阿里云会为您处理好有关硬件和操作系统配置的诸多考虑因素。您可以参考阿里云官网的产品规格文档来选择合适的实例规格。

如果您自己在本地部署MongoDB,那么您可以参考本文以下内容。

在支持的平台上运行

除了在阿里云上运行MongoDB,您还可以选择各种操作系统和处理器架构,从x86-64、ARM处理器到IBM POWER、大型计算机系统。

请前往MongoDB官网-资源-服务器文档-支持平台,查看最新的硬件和操作系统支持矩阵。

确保工作集与内存适配

当应用程序的工作集(索引和最常访问的数据)与内存适配时,MongoDB的性能会达到最佳。内存大小是影响实例大小的最重要因素,如果内存不足,其他优化动作可能也无法显著提高数据库的性能。

使用多个CPU内核

MongoDB的WiredTiger存储引擎架构能够高效地使用多个CPU内核。每个客户端的连接通常都有对应的线程,此外,后台还有执行检查点机制和缓存清除等任务的工作线程。您应根据并发客户端连接的数量来配备足够的CPU核数。请注意,投入更多的内存和磁盘IOPS对数据库性能的改善效果最大。

在阿里云MongoDB中,CPU核数和客户端最大连接数取决于您选择实例规格。您可以参考阿里云官网的实例规格表文档来选择合适的实例规格。

将每个服务器专用于系统中的单一角色

为了获得最佳性能,您应该在每个主机上运行一个MongoDB进程。

通过使用虚拟化或容器技术进行适当的内存和资源分配,多个MongoDB进程可以安全地运行在单个物理服务器上,而无需争夺资源。

对于某些用例(如多租户),用户会在同一主机上部署多个MongoDB进程。在这种情况下,您需要更改配置以确保每个进程都有足够的资源。

为了保证可用性,同一副本集的多个成员应部署在不同的物理硬件上(如电源或网络交换机),避免同时承担单点故障的风险。

配置WiredTiger缓存

WiredTiger存储引擎的内部缓存大小可以通过storage.wiredTiger.engineConfig.cacheSizeGB进行设置,其大小应足以容纳整个工作集。如果缓存没有足够的空间来加载额外的数据,WiredTiger将从缓存中驱逐页面,从而释放空间。

在默认设置下,

storage.wiredTiger.engineConfig.cacheSizeGB为可用内存的50%再减 1 GB。应谨慎提高该值,因为这会占用操作系统的资源,而且随着文件系统缓存效率降低,WiredTiger的性能也会下降。请注意,MongoDB本身也会分配超出WiredTiger缓存的内存。

此外,由于MongoDB支持可变大小的记录,同时WiredTiger会创建可变大小的页面,因此预计会出现一些内存碎片,这将会消耗超出配置的内存。

使用多个查询路由器

多个mongos进程(查询路由器)应分布在多台服务器上。您使用的mongos进程数量至少应与分片数量相同。

阿里云MongoDB会自动为集群中的每个分片配置一个查询路由器。

在NUMA架构上使用内存交织策略

在具有非一致内存存取(NUMA)的系统上运行MongoDB可能会导致一系列问题,包括一段时间内性能下降、无法使用所有可用内存、高系统进程使用率。

当在NUMA硬件上运行MongoDB服务器和客户端时,您应该使用numactl --interleave命令配置内存交织策略。

网络压缩

作为分布式数据库,MongoDB在查询路由和节点间复制过程中依赖于高效的网络传输。基于snappy压缩算法,MongoDB集群间的网络流量最多可压缩80%,从而在带宽受限的环境中带来显著的性能优势,并降低网络成本。

您可以通过在连接字符串中添加compressors参数来启用压缩:mongodb://localhost/?compressors=snappy。

存储和磁盘I/O注意事项

尽管MongoDB通过内存数据结构执行所有读写操作,但数据会持久化到磁盘上,如果查询数据不在内存中,则会触发对磁盘的读取。因此,存储系统的性能对任何系统来说都至关重要。

您应使用高性能存储,以下考虑因素将帮助您使用最佳的存储配置,包括操作系统和文件系统设置。

(1)对于I/O密集型应用程序使用固态硬盘

在MongoDB中,大多数磁盘访问模式都不具备顺序属性,因此使用固态硬盘可以大幅提高性能。

使用SATA、PCIe和NVMe固态硬盘有非常高的性价比。与其花高价购买昂贵的旋转驱动器,还不如多买一些内存或固态硬盘。如果工作集不再适配内存,也应使用固态硬盘来读取密集型应用程序。

建议您将MongoDB的日志文件存储在单独的磁盘分区上。

大多数MongoDB部署都应使用RAID-10存储配置。RAID-5和RAID-6存在一些限制,可能无法提供足够的性能。MongoDB的副本集可以通过合理部署提高数据可用性,应同时考虑RAID等其他因素,从而共同满足所需的可用性SLA。您不需要购买SAN磁盘阵列就可以实现高可用性。

(2)对于存储和I/O密集型工作负载,请使用MongoDB的默认压缩功能

默认的snappy压缩通常可以减少50%或更多的存储占用,并且由于从磁盘中读取的位数更少了,因此还可以提高IOPs。任何压缩算法都要在存储效率和CPU开销之间做权衡,因此您需要在自己的环境中进行压缩测试。

MongoDB为文档和索引提供了一系列压缩选项。snappy压缩算法在高文档压缩率(通常为50%+,取决于数据类型)与低CPU开销之间实现平衡,zStandard和zlib库可以实现更高的压缩率,但在从磁盘读取数据时会产生额外的CPU开销。zStandard在MongoDB 4.2版本中引入,与zlib库相比CPU开销更低。

索引默认使用前缀压缩,可以减少索引存储的内存占用,为频繁访问的文档腾出更多的内存。测试表明,使用前缀算法的压缩率通常为50%,但仍然建议您使用自己的数据集进行测试。

您可以修改所有集合和索引的默认压缩设置,也可以在集合和索引的创建过程中根据特定需求进行配置。

(3)配置预读(readahead)

建议将预读设置在8到32之间。您可以使用blockdev --setra命令来设置预读块大小。

(4)使用XFS文件系统,避免使用EXT4

由于在 WiredTiger 中使用 EXT4 时出现过性能问题,因此强烈建议使用XF。

(5)禁用访问时间设置

一些文件系统会保留文件最后一次被访问时的元数据。虽然这对某些应用程序可能有用,但在数据库中,这意味着每次数据库访问页面,文件系统都会进行一次写入操作,这将对系统的性能和吞吐量产生负面影响。

(6)禁用透明大页(Transparent Hugepages)

透明大页可能会增加额外的内存压力和CPU利用率,并对交换性能产生负面影响。

更多内容

有关最新的硬件和操作系统配置指南,请查看MongoDB Production Notes和Operations Checklist。

请长按复制网址访问:

https://docs.mongodb.com/manual/administration/production-notes

https://docs.mongodb.com/manual/administration/production-checklist-operations

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541629.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean,Monster.java2.创建一个config文件夹(名字任意),用于存放配置Bean的类(相当于配置文件)3.BeanConfig.java4.测试使用 MainApp.java2.…

PTA题解 --- N个数求和(C语言)

今天是PTA题库解法讲解的第二天,今天我们要讲解N个数求和,题目如下: 要解决这个问题,我们可以用C语言编写一个程序来处理和简化分数。程序的基本思路如下: 1. 定义一个函数来计算两个数的最大公约数(GCD&a…

图论:DFS与BFS

目录 1.DFS(图论) 1.1.DFS过程 1.2.应用 2.BFS(图论) 2.1.BFS过程 2.2.应用 2.3.双端队列BFS 实现 2.4.优先队列BFS(堆优化 Dijkstra算法) 1.DFS(图论) DFS全称是&#xff…

0基础安装Burpsuit专业版

首先先安装java环境,安装jdk 11的版本 文件中2023版的可以直接点开使用不需要复杂的操作的步骤 资源获取链接: 链接:百度网盘 请输入提取码 提取码:k2qq 其中:1号文件是bp的英文版激活包,-2号是中文版汉化版的激活包…

鸿蒙开发实战:【音频组件】

简介 音频组件用于实现音频相关的功能,包括音频播放,录制,音量管理和设备管理。 图 1 音频组件架构图 基本概念 采样 采样是指将连续时域上的模拟信号按照一定的时间间隔采样,获取到离散时域上离散信号的过程。 采样率 采样…

FreeRTOS学习第10篇--队列使用示例

FreeRTOS学习第10篇–队列使用示例 本文目标:FreeRTOS学习第10篇–队列使用示例 按照本文的描述,可以进行简单的使用队列。 本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5 …

KKView远程控制: todesk内网穿透

Todesk内网穿透:实现远程访问的新途径 在数字化时代,远程访问已成为许多企业和个人的基本需求。Todesk作为一款远程桌面控制软件,其内网穿透功能为用户提供了便捷、安全的远程访问体验。本文将介绍Todesk内网穿透的原理、应用场景及其优势&a…

【机器学习】走进监督学习:构建智能预测模型的第一步

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

2024年【天津市安全员C证】考试内容及天津市安全员C证考试报名

题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证考试内容是安全生产模拟考试一点通生成的,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】考试内容及天津市…

开发反应式API

开发反应式API 开发反应式API1 使用SpringWebFlux1.1 Spring WebFlux 简介1.2 编写反应式控制器 2 定义函数式请求处理器3 测试反应式控制器3.1 测试 GET 请求3.2 测试 POST 请求3.3 使用实时服务器进行测试 4 反应式消费RESTAPI4.1 获取资源4.2 发送资源4.3 删除资源4.4 处理错…

APP在应用商店该如何做好节日营销

38妇女节刚刚过去,不少商家吃上了一波节日红利。 你有没有注意到很多App在应用商店里改头换面,开展了很多以“三八节”为主题的营销活动,并且取得了不错的成绩。 可见季节性营销策划对产品的下载量和用户留存率还是很重要的。 那么我们如何…

数据结构知识点汇总(持续更新版)

数据结构 一、绪论 检测知识: 1.1基本概念 以前的计算机 弹道计算机 现如今 主要运用于非数值的计算 基本概念和术语 数据:是信息的载体,描述客观事物属性的值,字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的…