大佬们,大问题请教,内存占满

15 小时 19 分钟前
 iamtuzi3333
小弟用 MongoDB 存储实时数据,都是传感器数据,十几个传感器,每秒都有数据发过来,需要实时存储,目前用了一个队列去一遍存一遍入库,集合都是分散开的,但是发现一个很严重的问题就是会把服务器的备用内存持续压榨,导致可用内存越来越小,用的 Window Server 服务器,192GB 只剩下十几 M ,可用内存,这个太夸张了,而且看进程 mongod.exe 这个进程占了 5 万多 MB ,很夸张,目前小弟也没有方法能立马排查出来,有大佬有过这个经验吗,请大佬指教一下。
706 次点击
所在节点    MongoDB
21 条回复
liprais
15 小时 4 分钟前
你不让 mongodb 用内存他咋干活?
pxllong
15 小时 3 分钟前
WiredTiger 这几个参数贴下
iamtuzi3333
15 小时 1 分钟前
@pxllong 之前修改是 50GB ,但是还是吃的太厉害了,影响其他项目运行了,还有其他办法吗
iamtuzi3333
15 小时 1 分钟前
@liprais 但是吃的太厉害了,影响其他项目运行了,现在很难受,我不知道怎么改好一点,虽然他确实很好用,在考虑要不要换其他数据库了
liprais
14 小时 58 分钟前
@iamtuzi3333
1.你可以限制下 mongodb 占多少内存的
2.应用跟数据库跑在一个节点上不是好的做法
iamtuzi3333
14 小时 51 分钟前
@liprais 有道理,我申请一下多节点服务器,但是这个估计有点难,1 这个我限制了一半内存,明天看看是啥效果,谢谢大佬解答。
pxllong
14 小时 48 分钟前
@iamtuzi3333 mongostat 贴下参数
dejavuwind
14 小时 24 分钟前
你有多少传感器数据需要频繁查询的,可以考虑下冷热分离,冷数据换别的存储方式,定期任务进行冷热数据迁移
dejavuwind
14 小时 23 分钟前
@dejavuwind 可以考虑专门的时序数据库 influxdb tdengine 之类的
iamtuzi3333
13 小时 46 分钟前
@dejavuwind 不需要频繁查询,但是有时候需要翻查历史某一段时间的数据,我看过时序数据库,但是部分是单个时间单个数据,我的数据是{id:1,data:[1,2,3]}这种,有多个字段,data 是个浮点数数组,有时候会是 200 个数字。而且每个传感器一张表,时序数据库好像不太适合。热数据我都放在了 Redis 的队列中了。
iamtuzi3333
13 小时 40 分钟前
@pxllong 没法发图片,我打出来部分信息,每秒输出打印 10 条左右,有个 vsize 数据每条都是 6.49G ,
iamtuzi3333
13 小时 39 分钟前
@pxllong 复制了一条,大概就是这样
insert query update delete getmore command dirty used flushes vsize res qrw arw net_in net_out conn time
*0 *0 *0 *0 0 0|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 111b 59.8k 6 Sep 19 19:25:06.463
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 112b 59.9k 6 Sep 19 19:25:07.463
*0 *0 *0 *0 0 0|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 111b 59.8k 6 Sep 19 19:25:08.463
*0 *0 *0 *0 0 0|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 111b 59.8k 6 Sep 19 19:25:09.464
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 112b 59.9k 6 Sep 19 19:25:10.463
*0 *0 *0 *0 0 4|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 514b 60.8k 6 Sep 19 19:25:11.463
*0 *0 *0 *0 0 0|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 111b 59.8k 6 Sep 19 19:25:12.464
*0 *0 *0 *0 0 0|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 111b 59.8k 6 Sep 19 19:25:13.464
*0 *0 *0 *0 0 1|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 112b 59.9k 6 Sep 19 19:25:14.464
*0 *0 *0 *0 0 2|0 0.0% 0.0% 0 6.49G 255M 0|0 0|0 321b 60.5k 6 Sep 19 19:25:15.464
iamtuzi3333
13 小时 37 分钟前
目前项目我停掉了,占用太多了,估计 mongo 就是吃内存,这个似乎是他原本就这么设计的。
wheat0r
12 小时 31 分钟前
@iamtuzi3333 #13 基本上数据库都倾向于吃内存吧
iamtuzi3333
9 小时 52 分钟前
@wheat0r 这个倒不会,同台服务器上面有个 sqlserver ,MySQL ,上面也是存了大量数据,但是未发现有这么吃内存,而且现在发现 mongo 太迟了,他的底层是内存映射( Memory-Mapped Files ) 来处理数据库文件,目的是尽可能将数据库数据加载到内存中以提高读写性能。MongoDB 默认会尽量使用可用的内存来缓存数据文件和索引,因此当数据集较大时,mongod.exe 可能会占用大量内存。
现在这是个无底洞,而且不会自动清除映射文件,全是占用在备用内存中,导致可用内存越来越少。现在我在想找新的数据库来替换了。
wheat0r
8 小时 53 分钟前
@iamtuzi3333 #15 会的,sqlserver 默认的最大内存占用参数是 2,147,483,647 megabytes (MB),运行一段时间后就会将内存占满。mysql 也存在类似情况,但是不像 sqlserver 一样饥渴。
ShuA1
8 小时 50 分钟前
@wheat0r mysql 也存在类似情况,但是不像 sqlserver 一样饥渴。
可能是你配置的问题, 一样可以吃满
yinft
9 分钟前
哈哈 我们的项目用容器搭的 docker ,我直接限制容器最大内存占用了,简单粗暴
yinft
9 分钟前
@yinft 容器搭的 mongo
iamtuzi3333
5 分钟前
@wheat0r 原来这样子,那看来还是机器的问题了。
@ShuA1 那看来就是配置的问题了。现在这个问题比较难处理,难顶,现在准备更换存储方式了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1074136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX