MongoDB管理内存使用
优化MongoDB内存使用,可以通过一下几点来降低系统内存占用,本次主要配置WiredTiger Cache来实现
- WiredTiger Cache:
- MongoDB 使用 WiredTiger 存储引擎,其缓存使用最近最少使用 (LRU) 算法管理。频繁访问的数据会保留在内存中,而不常访问的数据会被剔除。
- 可以通过
storage.wiredTiger.engineConfig.cacheSizeGB配置缓存大小,从而间接控制内存使用。
- Page Eviction:
- WiredTiger 存储引擎会定期执行页面驱逐 (page eviction) 操作,将不常使用的页面从内存中移除。这样可以保持内存的合理使用。
- TTL Indexes:
- MongoDB 提供 TTL (Time-To-Live) 索引,允许自动删除超过指定时间的数据。虽然这主要用于管理存储空间,但也有助于减少内存占用。
- Inactive Data Handling:
- 在分片集群 (sharded cluster) 中,不活跃的数据可以通过迁移分片来减少某些节点上的内存压力。将不常访问的数据分配到较少使用的节点上,减少高负载节点的内存占用。
- Journaling and Snapshotting:
- MongoDB 的持久化机制会定期进行日志记录和快照,这些操作会影响内存使用。适当配置日志记录和快照策略可以帮助管理内存。
设置WiredTiger存储引擎和缓存大小
修改配置文件后需要重启MongoDB
storage:wiredTiger:engineConfig:cacheSizeGB: 16
重启MongoDB
sudo systemctl restart mongod
运行时动态调整缓存大小
db.adminCommand({ setParameter: 1, "wiredTigerEngineRuntimeConfig": "cache_size=2GB" });
查看当前的存储引擎
db.serverStatus().storageEngine
查询当前设置的缓存大小【直接查看配置文件也可以】
db.serverStatus().wiredTiger.cache["maximum bytes configured"]
查看监控和分析
登录MongoDB
mongo "mongodb://admin:password@localhost:27017/admin"
创建具有监控权限的用户
db.getSiblingDB("admin").createUser({user: "statuser",pwd: "statpassword",roles: [{ role: "clusterMonitor", db: "admin" }]
})
监控 MongoDB 实例的状态
mongostat --uri "mongodb://statuser:statpassword@localhost:27017/?authSource=admin" --discover
mongostat 的输出字段
host insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
localhost:27017 10 *0 *0 *0 0 1|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 6.99k 44.8k 24 May 29 11:08:00.238
localhost:27017 7 *0 *0 *0 0 0|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 5.57k 44.2k 24 May 29 11:08:01.245
localhost:27017 4 *0 *0 *0 0 2|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 3.03k 44.8k 24 May 29 11:08:02.241
字段解释
- host: MongoDB 实例的地址和端口。
- insert: 每秒插入的文档数(10, 7, 4)。
- query: 每秒查询的次数(未发生)。
- update: 每秒更新的次数(未发生)。
- delete: 每秒删除的次数(未发生)。
- getmore: 每秒
getmore操作的次数(未发生)。 - command: 每秒执行的命令次数。分为读命令和写命令,如
1|0和2|0。 - dirty: 存储引擎的脏数据百分比(0.0%)。
- used: 存储引擎的缓存使用百分比(70.3%)。
- flushes: 每秒执行的
fsync操作次数(未发生)。 - vsize: 虚拟内存大小(33.7GB)。
- res: 常驻内存大小(32.1GB)。
- qrw: 排队的读写操作数量(查询 | 写入,均为 0)。
- arw: 活动的读写操作数量(查询 | 写入,均为 1|0)。
- net_in: 每秒网络输入量(6.99kB, 5.57kB, 3.03kB)。
- net_out: 每秒网络输出量(44.8kB, 44.2kB)。
- conn: 当前连接数(24)。
- time: 当前时间。
used:存储引擎的缓存使用百分比解释
在 MongoDB 的 mongostat 输出中,used 字段表示存储引擎(通常是 WiredTiger)缓存使用的百分比。这个百分比是存储引擎实际使用的缓存内存量与分配给存储引擎的总缓存内存量之间的比值。具体来说:
- Numerator(分子):存储引擎实际使用的缓存内存量。
- Denominator(分母):分配给存储引擎的总缓存内存量。
详细解释
MongoDB 的 WiredTiger 存储引擎使用一个内部缓存来管理内存中的数据。缓存大小可以通过 cacheSizeGB 参数配置。如果没有特别配置,WiredTiger 默认将服务器总内存的 50% 分配给缓存。
比值计算公式
used% = 实际使用的缓存内存/分配的总缓存内存 * 100%
示例
假设你在 mongod.conf 中配置了 WiredTiger 的缓存大小为 16 GB:
storage:wiredTiger:engineConfig:cacheSizeGB: 16
然后在 mongostat 输出中看到 used 字段为 70.3%:
host insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
localhost:27017 10 *0 *0 *0 0 1|0 0.0% 70.3% 0 33.7G 32.1G 0|0 1|0 6.99k 44.8k 24 May 29 11:08:00.238
这表示 WiredTiger 实际使用了约 11.248 GB 的缓存内存(即 70.3% × 16 GB)。
优化 MongoDB 实例的内存使用,特别是降低常驻内存(res)的占用
1. 调整工作集
确保工作集(即正在频繁访问的数据集)能够适应可用的内存。如果工作集过大,超出了物理内存容量,MongoDB 会频繁进行磁盘 I/O 操作,从而影响性能。
2. 索引优化
索引是提高查询性能的关键,但过多的索引会消耗大量内存。请按照以下步骤优化索引:
- 分析查询模式:确定哪些查询最常执行,然后为这些查询建立适当的索引。
- 移除不必要的索引:定期审查和删除不再使用或效率不高的索引。
- 复合索引:对于多字段查询,使用复合索引来提高查询效率。
// 创建复合索引示例
db.collection.createIndex({ field1: 1, field2: 1 });
3. 合并小文档
如果文档太小且数量很多,会增加内存消耗和索引开销。考虑将小文档合并成大文档,减少文档数量,从而降低内存使用。
4. 启用压缩
MongoDB 提供了多种存储引擎和压缩选项,例如 WiredTiger 提供了 zlib 和 snappy 压缩。
- 启用数据压缩:通过配置文件或启动参数启用压缩,减少数据和索引的内存占用。
# mongod.conf 示例
storage:wiredTiger:engineConfig:cacheSizeGB: 16collectionConfig:blockCompressor: snappy
5. 调整 WiredTiger 缓存
WiredTiger 是 MongoDB 的默认存储引擎,可以通过调整其缓存大小来优化内存使用。
- 缓存大小配置:适当调整 WiredTiger 的缓存大小,确保留有足够的内存供操作系统和其他进程使用。
# mongod.conf 示例
storage:wiredTiger:engineConfig:cacheSizeGB: 16
6. 配置系统参数
- 内存分配:确保 MongoDB 进程有足够的物理内存可用,并且操作系统的虚拟内存设置合理。
- 透明大页:禁用透明大页(Transparent Huge Pages, THP),减少内存碎片。
# 禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
7. 清理未使用的数据
定期清理未使用的数据和集合,减少数据库的总体大小和内存占用。
8. 监控和调整
- 监控工具:使用监控工具(如 MongoDB Ops Manager、Grafana 等)实时监控内存使用情况。
- 性能分析:定期进行性能分析和内存使用审计,找出内存使用的热点并进行优化。
相关文章:
MongoDB管理内存使用
优化MongoDB内存使用,可以通过一下几点来降低系统内存占用,本次主要配置WiredTiger Cache来实现 WiredTiger Cache: MongoDB 使用 WiredTiger 存储引擎,其缓存使用最近最少使用 (LRU) 算法管理。频繁访问的数据会保留在内存中&am…...
【Elasticsearch】IK分词器的下载及使用
安装IK分词器 网址:https://github.com/infinilabs/analysis-ik 3.1.在线安装ik插件(较慢,不推荐) # 进入容器内部 es为容器名称 docker exec -it es /bin/bash# 在线下载并安装 7.17.21为镜像版本要与之前保持一致 ./bin/elasticsearch-pl…...
Hyper-SD: diffusion实时出图,一步搞定,字节出品
Hyper-SD: diffusion实时出图,一步搞定,字节出品 先看效果 Real-Time Generation Demo of Hyper-SD. Abstract 近来,一系列面向扩散模型(Diffusion Models,DM)的迭代紧凑式传播推断算法陆续出现…...
:长亭雷池社区版动态防护体验测评
序 长亭雷池在最近发布了动态防护功能,据说可以动态加密保护网页前端代码和阻止爬虫行为、阻止漏洞扫描行为等。今天就来体验测试一下 WAF 是什么 WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。区别于传统防火墙,WAF …...
数据结构复习
基本概念和术语: 数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。 数据元素:是组成数据的,具有一定意义的基本单位,在计算机…...
小世界网络生成及其分析
研究背景: 小世界网络是一种介于规则网络和随机网络之间的网络模型,具有短平均路径和高聚集性的特点。这种网络模型被广泛应用于社交网络、互联网、生物网络等领域的研究中。研究小世界网络的生成和分析可以帮助我们理解和揭示复杂网络的结构和特性,以及网络中信息传播、动力…...
Flutter基础 -- Flutter布局练习(小项目)
目录 1. Splash 布局(第一页) 1.1 目标 1.2 当前效果图 1.3 创建 Splash 界面 1.4 设置 MaterialApp 1.5 设置 Splash 背景色 1.6 布局 Splash 界面 1.7 总结 2. Splash 圆角图片 2.1 目标 2.2 当前效果图 2.3 蓝湖下载图片 2.4 图片导入项…...
详解布隆过滤器,实现分布式布隆过滤器
什么是布隆过滤器? 原理 布隆过滤器是一种基于位数组(bit array)和多个哈希函数的数据结构。其核心原理是: 初始化一个长度为m的位数组,所有位初始化为0。使用k个不同的哈希函数将元素映射到位数组中的k个位置。当插…...
程序员职业素养:AI新时代下的机遇与挑战
目录 一、引言二、程序员职业素养的五大要点1. 技术能力2. 沟通能力3. 团队合作4. 责任心5. 敬业精神 三、实际案例解析四、程序员职业素养在实际工作中的应用五、AI新时代的程序员的职业发展建议六、总结七、结语 一、引言 在当今这个科技飞速发展的时代,程序员这…...
智能管理,无忧报修——高校校园报事报修系统小程序全解析
随着数字化、智能化的发展,高校生活也迎来了前所未有的变革。你是否还在为宿舍的水龙头漏水、图书馆的灯光闪烁而烦恼?你是否还在为报修流程繁琐、等待时间长而焦虑?今天,这一切都将成为过去式!因为一款震撼高校圈的新…...
nc解决自定义参照字段前台保存后只显示主键的问题
nc解决自定义参照字段前台保存后只显示主键的问题 自定义参照类VoucherRefModel.java package nc.ui.jych.ref;import nc.ui.bd.ref.AbstractRefModel;/*** desc 凭证号参照* author hanh**/ public class VoucherRefModel extends AbstractRefModel {Overridepublic String[…...
鸿蒙全栈开发-一文读懂鸿蒙同模块不同模块下的UIAbility跳转详解
前言 根据第三方机构Counterpoint数据,截至2023年三季度末,HarmonyOS在中国智能手机操作系统的市场份额已经提升至13%。短短四年的时间,HarmonyOS就成长为仅次于安卓、苹果iOS的全球第三大操作系统。 因此,对于鸿蒙生态建设而言&a…...
【Python】使用 SQLObject orm 库快速将接口数据存入数据库
使用 SQLObject orm 库快速将接口数据存入数据库 文章目录 使用 SQLObject orm 库快速将接口数据存入数据库背景orm python 版本都有哪些? SQLObject 简单的使用 背景 因为测试需要,要将百万条数据接口查询数据存入数据库中,为了减少 mysql …...
@EnableResourceServer资源服务注解源码分析
文章目录 学习参考EnableResourceServer概要ResourceServerConfiguration属性定义configure(HttpSecurity)ResourceServerSecurityConfigurerinit(HttpSecurit)configure(HttpSecurity) 学习参考 Spring Security框架配置运行流程完整分析 - 【必看】 Security OAuth2 授权 &…...
SpringBoot实现图片文件上传和回显的两种方式
目录 一 功能需求 二 上传本地 2.1 实现文件上传的controller层 2.2 图片访问资源映射 二 上传OSS 一 功能需求 实现图片的上传和回显功能其实在业务中是非常常见的,比如需要上传头像,或者交易平台需要上传物品的图片等等,都需要上传和回…...
进程和计划任务以及步骤
进程 进程和程序有关,把该文件放到内存里,进程是动态的,不同时刻的状态不一样 内存:放置正在运行的程序和所需数据的位置 程序启动 ——》将相关文件和数据放到内存里 ——》进程(processes) 进程相关命令 …...
使用Python实现深度学习模型:序列到序列模型(Seq2Seq)
序列到序列(Seq2Seq)模型是一种深度学习模型,广泛应用于机器翻译、文本生成和对话系统等自然语言处理任务。它的核心思想是将一个序列(如一句话)映射到另一个序列。本文将详细介绍 Seq2Seq 模型的原理,并使…...
力扣283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出:[1,3,12,0,0] 示例 2: 输入: nums [0] …...
二叉树的顺序结构(堆的实现)
前言 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。 现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&…...
2024大模型如何学习【附学习资料】
摘要: 通过深入了解本文中的这些细节,并在实际项目中应用相关知识,将能够更好地理解和利用大模型的潜力,不仅在学术研究中,也在工程实践中。通过不断探索新方法、参与项目和保持热情,并将其应用于各种领域&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
