searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

浅谈OOMKiller

2023-03-28 09:40:17
8
0

一,主题引入

 项目组最近在生产环境部署的一个3节点Nacos集群出现单节点宕机的现象,现象看起来就像是好好的进程突然"人间蒸发”,突然得没有留下任何“遗言”,查看日志没有任何错误信息。通过监控看到进程占用的资源并不多,进程cpu和内存等核心指标都在合理使用范围内,不过节点所在虚拟机内存较高,最开始考虑是java进程OOM了,查看日志没有发现任何OutOfMemory堆栈,检查jvm启动参数也已经配置HeapDumpOnOutOfMemoryError,在指定路径下并没有看到Dump文件,这样可以完全排除JVM OutOfMemory的可能。第二个考虑是运维人员或者其他进程主动杀掉进程,搜索了history,并将系统上现存的进程和定时任务进行摸排,后来也排除了这种可能性。最后,考虑是系统内核杀掉,”雁过留痕”,系统的行为必然在某处会留下痕迹,通过查询系统日志,果然找到了真凶。

系统杀掉了进程号位2406的进程,在系统日志中打印了该进程被杀死的原因以及当时所占用的内存资源信息,还有一个相对陌生的oom_score_adj值,暂时先不管它,后文将重点展开描述这个变量。上述日志即为linux系统OOM机制实际运行一次所体现的结果。

二,了解OOM机制

服务器上的进程正在消耗大量内存,并且系统需要更多内存用于自己的进程并分配给其他进程。当一个进程启动时,它向内核请求一块内存。这个初始请求通常是一个很大的请求,进程不会立即或实际上永远不会使用全部。内核意识到进程请求冗余内存的这种趋势,因此会过度分配系统内存。这意味着当系统具有例如 8GB 的​​ RAM 时,内核可能会分配 8.5GB 给进程。这通过确保分配给进程的内存得到积极使用来最大化系统内存的使用。通常,这种情况不会造成问题。然而,如果有足够多的进程开始使用它们请求的所有内存块,那么将没有足够的物理内存来支持它们。这意味着正在运行的进程需要比实际可用内存更多的内存。这种情况很严重,必须立即解决。

2.3.1 进程选择

  1. 内核需要为自己获取最少的内存
  2. 尝试回收大量内存
  3. 不会杀死使用较少量内存的进程
  4. 尝试杀死最少数量的进程
  5. 一些细致的算法可以提高用户想要杀死的进程的牺牲优先级

三,关于OOM机制的思考

3.1 OOM可怕吗?

OOM虽然有个杀手进程,但是并不可怕,反而是系统的救星,它会杀死“最罪魁祸首”进程并使系统免于崩溃。Linux 提供了启用和禁用 OOM-Killer 的方法,但不建议禁用 OOM-killer。具体的禁用、启用方法可以另行参考其他文字,这里不再赘述。

3.2 如何利用或者配合OOM机制呢?

我们最终追求目标的是组件或者业务本身的可用性,而不是狭义的死磕“进程不要被OOM杀死”。

利用OOM机制的特点,我们可以降低所关注进程被杀掉的概率以防止一些极端情况的出现,对于单节点服务的应用性更强一些。高可用集群,容器化,多副本才能从根本上保障业务可用性。

0条评论
0 / 1000
廖****锋
11文章数
0粉丝数
廖****锋
11 文章 | 0 粉丝
原创

浅谈OOMKiller

2023-03-28 09:40:17
8
0

一,主题引入

 项目组最近在生产环境部署的一个3节点Nacos集群出现单节点宕机的现象,现象看起来就像是好好的进程突然"人间蒸发”,突然得没有留下任何“遗言”,查看日志没有任何错误信息。通过监控看到进程占用的资源并不多,进程cpu和内存等核心指标都在合理使用范围内,不过节点所在虚拟机内存较高,最开始考虑是java进程OOM了,查看日志没有发现任何OutOfMemory堆栈,检查jvm启动参数也已经配置HeapDumpOnOutOfMemoryError,在指定路径下并没有看到Dump文件,这样可以完全排除JVM OutOfMemory的可能。第二个考虑是运维人员或者其他进程主动杀掉进程,搜索了history,并将系统上现存的进程和定时任务进行摸排,后来也排除了这种可能性。最后,考虑是系统内核杀掉,”雁过留痕”,系统的行为必然在某处会留下痕迹,通过查询系统日志,果然找到了真凶。

系统杀掉了进程号位2406的进程,在系统日志中打印了该进程被杀死的原因以及当时所占用的内存资源信息,还有一个相对陌生的oom_score_adj值,暂时先不管它,后文将重点展开描述这个变量。上述日志即为linux系统OOM机制实际运行一次所体现的结果。

二,了解OOM机制

服务器上的进程正在消耗大量内存,并且系统需要更多内存用于自己的进程并分配给其他进程。当一个进程启动时,它向内核请求一块内存。这个初始请求通常是一个很大的请求,进程不会立即或实际上永远不会使用全部。内核意识到进程请求冗余内存的这种趋势,因此会过度分配系统内存。这意味着当系统具有例如 8GB 的​​ RAM 时,内核可能会分配 8.5GB 给进程。这通过确保分配给进程的内存得到积极使用来最大化系统内存的使用。通常,这种情况不会造成问题。然而,如果有足够多的进程开始使用它们请求的所有内存块,那么将没有足够的物理内存来支持它们。这意味着正在运行的进程需要比实际可用内存更多的内存。这种情况很严重,必须立即解决。

2.3.1 进程选择

  1. 内核需要为自己获取最少的内存
  2. 尝试回收大量内存
  3. 不会杀死使用较少量内存的进程
  4. 尝试杀死最少数量的进程
  5. 一些细致的算法可以提高用户想要杀死的进程的牺牲优先级

三,关于OOM机制的思考

3.1 OOM可怕吗?

OOM虽然有个杀手进程,但是并不可怕,反而是系统的救星,它会杀死“最罪魁祸首”进程并使系统免于崩溃。Linux 提供了启用和禁用 OOM-Killer 的方法,但不建议禁用 OOM-killer。具体的禁用、启用方法可以另行参考其他文字,这里不再赘述。

3.2 如何利用或者配合OOM机制呢?

我们最终追求目标的是组件或者业务本身的可用性,而不是狭义的死磕“进程不要被OOM杀死”。

利用OOM机制的特点,我们可以降低所关注进程被杀掉的概率以防止一些极端情况的出现,对于单节点服务的应用性更强一些。高可用集群,容器化,多副本才能从根本上保障业务可用性。

文章来自个人专栏
微服务&中间件
11 文章 | 2 订阅
0条评论
0 / 1000
请输入你的评论
0
0