【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

诊断虚拟机频繁 OOM 的问题

  • 2019-11-28
  • 本文字数:1330 字

    阅读完需:约 4 分钟

诊断虚拟机频繁 OOM 的问题

本文主要探究的 OOM Killer 是一个内核功能,当宿主机内存不足时,会使用一系列启发式技术来选择杀死一个进程。本文最先发布于 opsdev, 转载已获取作者授权。

前言

虚拟机被 OOM 应该是运维 Iaas 平台人员经常会遇到的一个问题。这不,前段时间我们就遇到了某几个业务的虚拟机频繁被 OOM 的情况,我们来看一下是什么原因。


场景描述:

  • Iaas 管理平台: OpenStack

  • 计算节点: CentOS7.2、QEMU、KVM、128GB 内存

1 问题定位

现象是业务虚拟机非人为宕机,且运行一段时间就会发生。在查看操作历史和审计记录确认不是人为操作后,通过计算节点系统日志发现,是系统内存不足触发 OOM 导致。


原因是找到了,但是发现比较诡异,为什么呢?


首先,这些虚拟机所在的计算节点并没有开启内存超卖;


其次,我们已经给计算节点 OS 预留了 12GB 的内存(12GB / 128GB = 9.375%)。也就是说撑死了虚拟机使用内存,所有虚拟机内存使用总量也不会超过总内存的 100% - 9.375% = 90.625%,按照这个理论值计算的话,除非 OS 的内存使用量非常大,否则不应该有 OOM 情况的发生。


2 问题排查

经验上来说,计算节点 OS 上跑的服务内存不会吃满 12GB, 除非是某些服务出现内存泄露的情况。带着疑问,我们将被 OOM 的虚拟机重新启动,在宿主机上观察内存使用情况。


经过一段时间的运行后虚拟机还是被 OOM 掉了,但是 OS 上的服务并没有内存泄露等情况,且总内存使用量也很正常,大约在 4GB 左右。此时,理论内存最大使用率约为 (128 - 12 + 4) / 128 = 93.75%,此时,系统不应该触发 OOM,这还不算 swap (4GB). 这里,我们排除了计算节点 OS 内存使用问题导致的 OOM.



既然,OS 内存使用没问题,那么换个角度看看虚拟机内存使用是否有问题呢?


通过对计算节点上触发 OOM 前后虚拟机进程 (qemu-kvm) 分配的内存进行统计,发现了一个“大”问题。



如上图,RES 一列,内存的使用量远大约分配给虚拟机的内存量。套餐是 4 核 8GB 的虚拟机内存实际使用量基本在 8.3 ~ 8.9GB 之间,套餐是 2 核 4GB 的虚拟机内存实际使用量也基本在 4.6 ~ 4.8GB 之间。至此,我们知道了多出来的内存被谁使用了。


为什么虚拟机内存使用量会比分配的值要大呢?到虚拟机内部去看,其内存使用虽然很满,但是没有达到超过分配值的情况。



带着疑问,Google 了一些资料,其他人也有类似的疑惑


文章的意思是说除了虚拟机内部使用的内存外,qemu-kvm 进程还需要为虚拟的设备提供内存,这部分内存也算在了虚拟机进程 qemu-kvm 头上了。


问题我们定位了,那如何解决这个问题,减少虚拟机被 OOM 情况发生呢?

3 解决方案

1.增大 OS 预留内存空间。通过增大 OS 预留内存空间来填充虚拟机膨胀部分内存,使得总体内存使用率不会超过 OOM 的临界值。


2.调大 swap 值。目前我们计算节点 swap 值统一为 4GB,对于一个 128GB 内存的节点来说 4GB 内存有点小。我们发现在虚拟机 OOM 时,swap 使用率肯定是 100%,这也很符合 OOM 产生的前提条件。所以,如果你的节点上有 SSD 盘的话,建议将 swap 适当调大。


3.修改 OpenStack 逻辑,在虚拟机调度内存计算时,比套餐值大一些,给虚拟机预留出膨胀部分内存。不过这种方式不太通用,不建议使用。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/UI7m51ipvSdFNQ1ioBHgvg


2019-11-28 14:05996

评论

发布
暂无评论
发现更多内容

作业-week1

赝品

Soul 学习笔记---soul 数据同步的浅显分析(四)

fightingting

Soul网关

6道tomcat面试题,最后两道难倒我了

田维常

面试

干货丨深度迁移学习方法的基本思路

博文视点Broadview

什么是产品经理?——课程总结

Deborah

【并发编程】- 内存模型篇

双木之林

并发编程

一种分表平滑扩容方案

非著名架构师

个人选择理财产品有哪些好方法

v16629866266

Soul学习笔记---运行 soul-examples-http(二)

fightingting

Soul网关

Spring 源码学习 15:finishBeanFactoryInitialization(重点)

程序员小航

spring 源码

产品经理训练营第一周作业

Empty

产品经理训练营 极客大学产品经理训练营

《原神》运维自动化的探索与实践

OpsMind

运维 运维自动化

当前岗位的理想岗位模型

白生

如何构建高效可信的持续交付能力,华为云有绝活!

华为云开发者联盟

软件 DevOps 持续交付 华为云

开发实战:LocalDateTime转RFC3339格式

worry

第一次作业提交

涅米丶

IO系列专题分享 - 概览

公众号:程序猿成神之路

io

产品经理训练营 学习起点

DB

量化交易自动炒币软件开发系统

开发实战:Float如何保留2位小数

worry

产品经理训练营-第一周作业

羽室

产品0期-第一周作业

曾烧麦

产品训练营

4K高清视频下载(4K视频素材下载)图文教程

科技猫

下载器 4k高清视频下载 4k视频素材下载 8k视频下载 高清视频下载

Redis不仅仅是缓存,还是……

码农译站

数据库 redis 缓存 关系型数据库 非关系型数据库

AI无人机出手,让输电线路巡检更“聪明”!

华为云开发者联盟

华为云 modelarts 视觉处理

一字一句的让你彻底掌握JavaScript中的回调函数

华为云开发者联盟

JavaScript 大前端 同步 回调函数

产品经理训练营-第一章作业

泡面加煎蛋

场外OTC交易APP系统软件开发

系统开发

产品经理训练营

纳豆卡玛

求职 岗位要求 职能描述

雪天专注行路思考一则

石君

冥想 28天写作

2021年1月初Java开发从小公司跳槽阿里制胜关键:狂刷17套大厂真题

Java架构追梦

Java 阿里巴巴 架构 面试

诊断虚拟机频繁 OOM 的问题_服务革新_霍明明_InfoQ精选文章