OOM问题解决

OOM问题解决

MongoDB OOM问题解决

背景:最近需要对海量历史数据进行离线化计算,数据源为HBase,因为历史数据并未进行HBase和数仓双写。无奈只能暴力拉去HBase数据存储到本地的MongoDB中。

介绍:关于MongoDB的内存占用可以参考这篇文章: https://zhuanlan.zhihu.com/p/54547887
主要分为为连接开辟的资源,和放在内存中的数据。MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了,但这并不代表将文件map到物理内存,只有访问到这块数据时才会被操作系统以Page的方式换到物理内存。MongoDB将内存管理工作交给操作系统的虚拟内存管理器来完成,这样就大大简化了MongoDB的工作,同时操作系统会将数据刷新保存到磁盘上。

问题:OOM即Out of Memory。unix内核会对进程进行管理,发现占用内存过大或者占用内存持续增长的进程会自动杀死。之前疑惑了很久为啥存到MongoDB中的数据量和实际数据量不太一致,后来才发现原来是程序跑到一半,MongoDB Server已经被干掉了。显示“已杀死”字样。因为多线程拉去HBase的数据并高并发写入MongoDB数据量过大,导致mongdb占用内存增加。
解决:解决方法很简单,只需要修改etc目录下面的mongo.conf,对内存进行限制即可:

storage:
  dbPath: /data/mongo/mongodb-linux-x86_64-rhel70-4.4.3-rc0/data
  journal:
    enabled: true
  engine: wiredTiger
  	wiredTiger:
      engineConfig:
      	cacheSizeGB: 5

systemLog:
  destination: file
  logAppend: true
  path: /data/mongo/mongodb-linux-x86_64-rhel70-4.4.3-rc0/logs/mongo.log

修改完之后重启mongodb服务,发现占用的内存果然被限制了。

java程序OOM问题

Java进程在运行时突然挂掉,常见的原因有很多,例如代码本身的致命bug、JVM自身故障、内存泄漏触发JVM的OOM机制等,但是这些原因都属于主观原因,基本可以通过查看日志来发现。

事实上,Java进程还可能被动地结束。由于用户进程只是运行在操作系统之上的普通进程,享受着操作系统提供的资源,因此也受制于操作系统。在Linux下,就存在一个隐形的进程杀手:OOM Killer。
以前占用了那么多内存,也有它自己不对的地方,以后必须要控制好内存占用。这不,它再次启动时,用 -Xmx 参数限制了自己能够占用的最大内存:
java -jar -Xmx64m xxxx.jar

后台运行程序问题

使用&让程序后台运行,本次会话结束后程序会终止。
使用screen会开启一个新的会话去运行程序,所以使用screen才是正道。

参考:
https://qzy.im/blog/2020/07/oom-killer-killed-java-process-in-linux/
https://zhuanlan.zhihu.com/p/54547887

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值