06 容器内存占用过高

宿主机情况

一般系统内存过高的情况下,可以通过 free -m 查看当前系统的内存使用情况:

sugoi@sugoi:~$ free -m
              总计         已用        空闲      共享    缓冲/缓存    可用
内存:       11415        3576         764      593     7074       7001
交换:        2047           8        2039

在发现是系统内存占用高后,可以手动清理 Cache,因为 Cache 高的话,可以通过 drop_caches 的方式来清理:

  1. 清理 page cacheecho 1 > /proc/sys/vm/drop_caches
  2. 清理 dentriesinodesecho 2 > /proc/sys/vm/drop_caches
  3. 清理 page cachedentriesinodesecho 3 > /proc/sys/vm/drop_caches

因为进程是运行在容器中,在 Kubernetes 集群中,若执行 drop_caches 相关命令,将会对节点上的所有其他应用程序产生影响,尤其是那些占用大量 I/O 并由于缓冲区高速缓存而获得更好性能的应用程序,可能会产生 “负面” 后果。

所以上述不是一个在容器环境下使用的好方法。

容器情况

因为容器设置了 Memory Limits,在容器在运行达到 Limits 上限,就会因 OOM 被杀掉,产生原因可能是:

  1. 频繁申请重复对象
  2. 不知名内存泄露
  3. madvise(give advice about use of memory)策略变更
  4. 监控/判别条件有问题
  5. 容器环境的机制
上次修改: 29 June 2020