如何轻松调整Ubuntu系统上MongoDB的内存配置以显著优化数据库性能?
- 内容介绍
- 文章标签
- 相关推荐
坦白讲... 说实话,没有什么比看着数据库查询慢如蜗牛更让人抓狂的了。特别是当你明明配置了一台不错的服务器, 手里握着大把的内存,MongoDB却好像对此视而不见,依然在硬盘上疯狂读写,那种感觉真的让人想砸键盘。很多在Ubuntu上跑MongoDB的朋友都遇到过这种尴尬:明明服务器有16G甚至更多的内存, 后来啊MongoDB只用了一点点,剩下的资源都在那里睡大觉。
其实这真不是MongoDB“偷懒”,而是它默认的配置策略比较保守。MongoDB默认使用的是WiredTiger存储引擎, 这个引擎虽然强大,但在默认情况下它通常会自动检测系统内存并分配一部分作为缓存。但是自动检测并不总是最聪明的,特别是在你的服务器上还跑了其他服务的时候。这时候,我们就得手动介入,给MongoDB“松松绑”,让它能更合理地利用内存。
我emo了。 今天 我们就来聊聊怎么在Ubuntu上通过调整配置,让MongoDB的性能提升一个档次。这不仅仅是改几个数字那么简单, 我算是看透了。 更是理解数据库如何与操作系统交互的过程。别担心,我们会一步步来哪怕你是对配置文件有点头疼的新手,也能跟着搞定。
了解WiredTiger存储引擎
在开始动手之前,我们得先明白我们在调整什么。从MongoDB 3.2版本开始,WiredTiger就成了默认的存储引擎。这个引擎有个核心机制,就是它会把大部分的数据和索引都放在内存里也就是我们常说的Cache。内存读取的速度是纳秒级的,而磁盘读取是毫秒级的,这中间差了十万八千里KTV你。。
如果你的数据集比内存大, 或者MongoDB分配到的内存太小,那么系统就不得不老是进行磁盘I/O操作。这就是性能瓶颈的根源。WiredTiger引擎允许我们通过配置文件来指定它到底能占用多少内存。这个参数就是传说中的 cacheSizeGB,摸个底。,尊嘟假嘟?。
如何确定合适的cacheSizeGB
但是这里有个坑。很多人觉得“我有32G内存,我就全给MongoDB算了”。千万别这么想!操作系统本身也需要内存来做文件系统缓存,你的其他应用也需要内存。 麻了... 如果你把内存吃光了 Linux就会开始使用Swap, 一旦开始大量使用Swap,性能会呈指数级下降,那比不用缓存还要惨,何苦呢?。
在修改任何配置之前,我们得先摸清服务器的底细。打开终端,输入我们最熟悉的命令:
free -h
看看输出后来啊里的 Mem: total。这是你物理内存的总大小。比如如果你看到是16GB,那么心里就有数了。一般时候,我们建议给MongoDB分配系统总物理内存的50%到70%。 好家伙... 这是一个比较平安的区间, 既能保证MongoDB有足够的空间跑得飞快,又能给操作系统和其他程序留条活路。
参考表格
拉倒吧... 为了方便大家参考, 我整理了一个简单的建议表格, 真香! 你可以根据自己的服务器配置来对号入座:
你我共勉。 当然这只是一个粗略的指南。如果你的服务器上只跑MongoDB, 没有什么其他 heavyweight 的应用,那你可以稍微大胆一点,往70%靠;如果服务器上还跑着Elasticsearch或者Kafka,那还是保守点好,我emo了。。
修改MongoDB配置文件
好了到了最关键的时刻了。我们要去修改MongoDB的配置文件。在Ubuntu系统上, 操作一波... 这个文件通常乖乖地待在 /etc/mongod.conf,绝绝子!。
先说说用你喜欢的编辑器打开它。这里我用nano举例, 主要原因是它比较简单:,功力不足。
sudo nano /etc/mongod.conf
说实在的... 打开文件后你会看到一堆YAML格式的配置。YAML这东西对缩进特别敏感,多一个空格少一个空阶都可能让服务起不来所以修改的时候一定要瞪大眼睛,也是没谁了...。
找到storage部分并调整wiredTiger参数
你我共勉。 尊嘟假嘟? 我们要找的是 storage: 这个部分。在这个section下面你需要找到或者添加 wiredTiger 相关的配置。比如是 engineConfig 下的 cacheSizeGB。
换句话说... 如果你的配置文件里没有这一行,那就手动加上去。 我心态崩了。 比如 我们要把它设置为4GB, 配置看起来应该是这样的:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 设置为4GB,请根据你的实际情况修改这个数字
捡漏。 这里要特别啰嗦一句,注意缩进!storage: 是顶格的, wiredTiger: 前面是两个空格,engineConfig: 前面是四个空格,cacheSizeGB: 前面是六个空格。 精神内耗。 这种层级关系绝对不能乱。如果你复制粘贴的时候不小心把空格变成了Tab, 那MongoDB启动的时候会报错,告诉你YAML syntax error,到时候排查起来真的很搞心态。
重启MongoDB服务使更改生效
试着... 配置文件改好了别急着庆祝,还没完呢。现在的修改还只是在纸上谈兵,必须重启MongoDB服务才能让这些更改生效,另起炉灶。。
保存并退出编辑器, 然后输入重启命令:
sudo systemctl restart mongod
何必呢? 如果一切顺利,这条命令应该静默施行,没有任何报错。 何苦呢? 为了确保服务真的起来了可以顺便看下状态:
sudo systemctl status mongod
验证配置是否生效
看到绿色的 "active " 了吗?恭喜你,第一步成功了。但是我们怎么知道MongoDB真的听话, 提到这个... 只占用了我们指定的内存呢?这就需要进到MongoDB的shell里去查一查了。
输入 mongo 或者 mongosh 进入命令行界面 然后切换到admin节点, 别犹豫... 或者直接施行查看服务器状态的命令。我们要看的是WiredTiger的缓存状态:,容我插一句...
db.serverStatus.wiredTiger.cache
一针见血。 没眼看。 这会输出一大堆JSON数据,别被吓到了。我们主要关注几个字段。你可以找找 "maximum bytes configured",这个值应该非常接近你刚才设置的 cacheSizeGB 乘以 1024的3次方。比如你设置了4GB,这里应该显示接近 4294967296。
MongoDB之外还有哪些需要调整?
优化系统参数以配合 MongoDB
除了 Mongo DB 的内部配置外,Linux 系统本身也有一些参数需要配合调整才能发挥出最佳,性能包括但不限于以下两点: vm.swappiness 。这个值控制着内核有多喜欢把内存里的数据交换到硬盘上去,默认值通常是60,这意味着当,内存使用率达到40%左右时系统就开始考虑 Swap 了对于 Mongo DB 这简直, 是灾难我们希望 Mongo DB 的数据老老实实待在, 内存里不要被系统踢到硬盘上去
所以我们建议把这个值调低,比如调到1或者10这样,,只有在, 内存真的非常非常紧张的时候,系统才会动用 Swap 修改方法也很简单临时修改可以用: sudo sysctl vm.swappines = 10 但是这样重启后就失效了要想永久生效,,得去修改/etc/sysctl.conf 文件,在文件末尾加上: vm.swappiness =10
/etc/security/limits. conf 里添加: mongod soft nofile64000
mongod hard nofile64000
当然,这通常,在 安装 Mongo DB 时 systemd 的 service 文件 , 里已经配置好了但如果你,是自己编译安装或者遇到"too many open files"的错误,,记得来这里查一查
踩坑经验分享
折腾这些东西,,难免会遇到坑我也不是没踩过雷,这里分享几个血泪经验,,希望能帮大家避坑 太扎心了 先说说最常见, 的就是 YAML ,格式错误 有时候手抖多打了一个空格,或者复制粘贴, 的时候混入 Tab字符 ,,导致 systemctl restart mongod的时候报错"Configuration file contains an error "这时候千万别慌 去看/ var/log/mongodb/mongod.log 日志里通常会明确告诉,你哪一行出错,把空格数对齐 通常就能解决问题 何必呢?接下来,是设置过大导致,OOM如果你太贪心 把cacheSize GB 设置成, 了接近物理内、存的总大小比如16 G内、存你设置 了15 G再加上系、统开销一旦业务高峰期来临内、存爆满Linux 的OOM Killer就会登场直接把 Mongo DB进程给杀掉 你会发现数据库突然连不上了,一看日志说是被Killed 了这种时候只能老老实实把配置调小一点给系、 造起来。 统留点余地 再说说别忘了监控 配置改完不是结束只是开始 你要持续观察 Mongo DB 的page faults指标以及系、统 I/O等待时间 如果这些指标,在 调整后明显下降那恭喜你,你做对 了如果反而上升 了可能是主要原因是缓存太大导致频繁, 的换页这时后就需要回滚配置 优化 Mongo DB 在 Ubuntu 上 的内、存配其实就是,在 “硬件资、源”和“系、统稳定性”之间寻找一个完美, 的平衡点 这不仅仅,是敲几行命令的事更是种艺术通 过合理设置storage.wired Tiger.engine Config.cache Size GB 我们能让 Mongo DB 这只猛兽,在 Ubuntu 的草原 上 跑得既快又稳 希望这篇文、章能帮你解决那些让人头秃, 的性、能问题 当你看到查询响应时间从几百毫秒降到几毫秒 看到CPU利用率不再是主要原因是等待I/O而波动时那种成就感,是无与伦比,赶紧去试试吧别让你的服、务器再,在 那儿空转 了!
坦白讲... 说实话,没有什么比看着数据库查询慢如蜗牛更让人抓狂的了。特别是当你明明配置了一台不错的服务器, 手里握着大把的内存,MongoDB却好像对此视而不见,依然在硬盘上疯狂读写,那种感觉真的让人想砸键盘。很多在Ubuntu上跑MongoDB的朋友都遇到过这种尴尬:明明服务器有16G甚至更多的内存, 后来啊MongoDB只用了一点点,剩下的资源都在那里睡大觉。
其实这真不是MongoDB“偷懒”,而是它默认的配置策略比较保守。MongoDB默认使用的是WiredTiger存储引擎, 这个引擎虽然强大,但在默认情况下它通常会自动检测系统内存并分配一部分作为缓存。但是自动检测并不总是最聪明的,特别是在你的服务器上还跑了其他服务的时候。这时候,我们就得手动介入,给MongoDB“松松绑”,让它能更合理地利用内存。
我emo了。 今天 我们就来聊聊怎么在Ubuntu上通过调整配置,让MongoDB的性能提升一个档次。这不仅仅是改几个数字那么简单, 我算是看透了。 更是理解数据库如何与操作系统交互的过程。别担心,我们会一步步来哪怕你是对配置文件有点头疼的新手,也能跟着搞定。
了解WiredTiger存储引擎
在开始动手之前,我们得先明白我们在调整什么。从MongoDB 3.2版本开始,WiredTiger就成了默认的存储引擎。这个引擎有个核心机制,就是它会把大部分的数据和索引都放在内存里也就是我们常说的Cache。内存读取的速度是纳秒级的,而磁盘读取是毫秒级的,这中间差了十万八千里KTV你。。
如果你的数据集比内存大, 或者MongoDB分配到的内存太小,那么系统就不得不老是进行磁盘I/O操作。这就是性能瓶颈的根源。WiredTiger引擎允许我们通过配置文件来指定它到底能占用多少内存。这个参数就是传说中的 cacheSizeGB,摸个底。,尊嘟假嘟?。
如何确定合适的cacheSizeGB
但是这里有个坑。很多人觉得“我有32G内存,我就全给MongoDB算了”。千万别这么想!操作系统本身也需要内存来做文件系统缓存,你的其他应用也需要内存。 麻了... 如果你把内存吃光了 Linux就会开始使用Swap, 一旦开始大量使用Swap,性能会呈指数级下降,那比不用缓存还要惨,何苦呢?。
在修改任何配置之前,我们得先摸清服务器的底细。打开终端,输入我们最熟悉的命令:
free -h
看看输出后来啊里的 Mem: total。这是你物理内存的总大小。比如如果你看到是16GB,那么心里就有数了。一般时候,我们建议给MongoDB分配系统总物理内存的50%到70%。 好家伙... 这是一个比较平安的区间, 既能保证MongoDB有足够的空间跑得飞快,又能给操作系统和其他程序留条活路。
参考表格
拉倒吧... 为了方便大家参考, 我整理了一个简单的建议表格, 真香! 你可以根据自己的服务器配置来对号入座:
你我共勉。 当然这只是一个粗略的指南。如果你的服务器上只跑MongoDB, 没有什么其他 heavyweight 的应用,那你可以稍微大胆一点,往70%靠;如果服务器上还跑着Elasticsearch或者Kafka,那还是保守点好,我emo了。。
修改MongoDB配置文件
好了到了最关键的时刻了。我们要去修改MongoDB的配置文件。在Ubuntu系统上, 操作一波... 这个文件通常乖乖地待在 /etc/mongod.conf,绝绝子!。
先说说用你喜欢的编辑器打开它。这里我用nano举例, 主要原因是它比较简单:,功力不足。
sudo nano /etc/mongod.conf
说实在的... 打开文件后你会看到一堆YAML格式的配置。YAML这东西对缩进特别敏感,多一个空格少一个空阶都可能让服务起不来所以修改的时候一定要瞪大眼睛,也是没谁了...。
找到storage部分并调整wiredTiger参数
你我共勉。 尊嘟假嘟? 我们要找的是 storage: 这个部分。在这个section下面你需要找到或者添加 wiredTiger 相关的配置。比如是 engineConfig 下的 cacheSizeGB。
换句话说... 如果你的配置文件里没有这一行,那就手动加上去。 我心态崩了。 比如 我们要把它设置为4GB, 配置看起来应该是这样的:
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 设置为4GB,请根据你的实际情况修改这个数字
捡漏。 这里要特别啰嗦一句,注意缩进!storage: 是顶格的, wiredTiger: 前面是两个空格,engineConfig: 前面是四个空格,cacheSizeGB: 前面是六个空格。 精神内耗。 这种层级关系绝对不能乱。如果你复制粘贴的时候不小心把空格变成了Tab, 那MongoDB启动的时候会报错,告诉你YAML syntax error,到时候排查起来真的很搞心态。
重启MongoDB服务使更改生效
试着... 配置文件改好了别急着庆祝,还没完呢。现在的修改还只是在纸上谈兵,必须重启MongoDB服务才能让这些更改生效,另起炉灶。。
保存并退出编辑器, 然后输入重启命令:
sudo systemctl restart mongod
何必呢? 如果一切顺利,这条命令应该静默施行,没有任何报错。 何苦呢? 为了确保服务真的起来了可以顺便看下状态:
sudo systemctl status mongod
验证配置是否生效
看到绿色的 "active " 了吗?恭喜你,第一步成功了。但是我们怎么知道MongoDB真的听话, 提到这个... 只占用了我们指定的内存呢?这就需要进到MongoDB的shell里去查一查了。
输入 mongo 或者 mongosh 进入命令行界面 然后切换到admin节点, 别犹豫... 或者直接施行查看服务器状态的命令。我们要看的是WiredTiger的缓存状态:,容我插一句...
db.serverStatus.wiredTiger.cache
一针见血。 没眼看。 这会输出一大堆JSON数据,别被吓到了。我们主要关注几个字段。你可以找找 "maximum bytes configured",这个值应该非常接近你刚才设置的 cacheSizeGB 乘以 1024的3次方。比如你设置了4GB,这里应该显示接近 4294967296。
MongoDB之外还有哪些需要调整?
优化系统参数以配合 MongoDB
除了 Mongo DB 的内部配置外,Linux 系统本身也有一些参数需要配合调整才能发挥出最佳,性能包括但不限于以下两点: vm.swappiness 。这个值控制着内核有多喜欢把内存里的数据交换到硬盘上去,默认值通常是60,这意味着当,内存使用率达到40%左右时系统就开始考虑 Swap 了对于 Mongo DB 这简直, 是灾难我们希望 Mongo DB 的数据老老实实待在, 内存里不要被系统踢到硬盘上去
所以我们建议把这个值调低,比如调到1或者10这样,,只有在, 内存真的非常非常紧张的时候,系统才会动用 Swap 修改方法也很简单临时修改可以用: sudo sysctl vm.swappines = 10 但是这样重启后就失效了要想永久生效,,得去修改/etc/sysctl.conf 文件,在文件末尾加上: vm.swappiness =10
/etc/security/limits. conf 里添加: mongod soft nofile64000
mongod hard nofile64000
当然,这通常,在 安装 Mongo DB 时 systemd 的 service 文件 , 里已经配置好了但如果你,是自己编译安装或者遇到"too many open files"的错误,,记得来这里查一查
踩坑经验分享
折腾这些东西,,难免会遇到坑我也不是没踩过雷,这里分享几个血泪经验,,希望能帮大家避坑 太扎心了 先说说最常见, 的就是 YAML ,格式错误 有时候手抖多打了一个空格,或者复制粘贴, 的时候混入 Tab字符 ,,导致 systemctl restart mongod的时候报错"Configuration file contains an error "这时候千万别慌 去看/ var/log/mongodb/mongod.log 日志里通常会明确告诉,你哪一行出错,把空格数对齐 通常就能解决问题 何必呢?接下来,是设置过大导致,OOM如果你太贪心 把cacheSize GB 设置成, 了接近物理内、存的总大小比如16 G内、存你设置 了15 G再加上系、统开销一旦业务高峰期来临内、存爆满Linux 的OOM Killer就会登场直接把 Mongo DB进程给杀掉 你会发现数据库突然连不上了,一看日志说是被Killed 了这种时候只能老老实实把配置调小一点给系、 造起来。 统留点余地 再说说别忘了监控 配置改完不是结束只是开始 你要持续观察 Mongo DB 的page faults指标以及系、统 I/O等待时间 如果这些指标,在 调整后明显下降那恭喜你,你做对 了如果反而上升 了可能是主要原因是缓存太大导致频繁, 的换页这时后就需要回滚配置 优化 Mongo DB 在 Ubuntu 上 的内、存配其实就是,在 “硬件资、源”和“系、统稳定性”之间寻找一个完美, 的平衡点 这不仅仅,是敲几行命令的事更是种艺术通 过合理设置storage.wired Tiger.engine Config.cache Size GB 我们能让 Mongo DB 这只猛兽,在 Ubuntu 的草原 上 跑得既快又稳 希望这篇文、章能帮你解决那些让人头秃, 的性、能问题 当你看到查询响应时间从几百毫秒降到几毫秒 看到CPU利用率不再是主要原因是等待I/O而波动时那种成就感,是无与伦比,赶紧去试试吧别让你的服、务器再,在 那儿空转 了!

