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大模型如何学习【附学习资料】
摘要: 通过深入了解本文中的这些细节,并在实际项目中应用相关知识,将能够更好地理解和利用大模型的潜力,不仅在学术研究中,也在工程实践中。通过不断探索新方法、参与项目和保持热情,并将其应用于各种领域&…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
