MongoDB占用内存定位和释放

问题:芒果占 Swap 占用超过50%
1 Linux Swap 内存交换空间
当 Linux 内存空间紧张的时候,Linux 通过直接内存回收 和 定期扫描的方式,来释放文件页 和 匿名页,以便把内存分配给更需要的进程使用。
  • 文件页回收即 清空,或者脏数据写盘,释放
  • 匿名页回收,即 Swap 写入磁盘中,下次使用时再从磁盘中取出 。
  • 查看swap 占用 :free -m
  • 查看系统内存
[root@nbprdapp55 ~]#cat /proc/meminfo |grep Mem MemTotal:16332236 kB MemFree:12557660 kB

  • linux 内存回收的机制
MongoDB占用内存定位和释放
文章图片

pages_low 这个值被称为页低阈值,当剩余内存小于页低阈值 就会触发内存的回收
linux 中有一个kswpd0 进程,会定期扫描内存使用情况
[root@nbprdapp55 ~]# cat /proc/sys/vm/min_free_kbytes 6758466MB

这个内核选项可以设置 pages _min 值 ,而 另外两个页内存阈值,可以通过下面的公式得出
pages_low = pages_min*5/4 pages_high = pages_min*3/2

设置 Swap 使用的积极程度,
[root@nbprdapp55 ~]# cat /proc/sys/vm/swappiness 60

这个值 可以被设置为 0 - 100 。越大越趋向于使用 Swap ,越小越趋向于使用回收文件页,即便设置为0,当 剩余内存 + 文件页大小 小于 页高阈值 时,还是会触发 Swap 回收 。
1.1 swap 定位和释放
  • 定位
    1 查看 swap 使用最多的进程
    Top shift + O ,P
  • 释放
1 KIll 对应的PID 2 swapoff -a && swapon -a

2 芒果的内存使用
1 停止 mongodb 的几种方法:
向 MongoDB 发送一个 SIGINT SIGTERM 信号 1. KILL -2 PID KiLL PID 等待当前运行的操作或者文件预分配完成,关闭连接,将缓存的数据刷新到磁盘,停止 SIGKILL -9 PID (X) 不建议,会损坏文件,强行停止 ,需要修复数据库2 . > use admin switched to db admin > db.shutdownServer(); server should be down ...

2 . 监控 MongoDB
> db.runCommand({"serverStatus" : 1}) { ... }

3限制 芒果内存使用
MongoDB占用内存定位和释放
文章图片

小结 【MongoDB占用内存定位和释放】hadoop 集群建议关 swap 提升性能。事实上不仅 hadoop,包括 ES 在内绝大部分 Java
的应用都建议关 swap,这个和 JVM 的 gc 有关,它在 gc 的时候会遍历所有用到的堆的内存,如果这部分内存是被 swap 出去了,遍历的时候就会有磁盘IO 。
如果服务器内存够用的情况下,可以建议关闭 Swap 。

    推荐阅读