容器化利器!SysOM 从内核的视角观测内存“黑洞”|龙蜥技术

简介: 从内核的视角观测容器——SysOM 容器监控。

文/龙蜥社区系统运维SIG

01 背景

容器化现阶段已经是构建企业 IT 架构的最佳实践。云原生容器化的部署架构,相较于传统 IDC 部署架构的 IT 架构方案,已经成为兼具高效运维及成本控制的业界事实标准。

但容器化带来的都是好处么?容器化屏蔽了 IDC 基础设施和云资源的同时,也带来了容器引擎层的不透明,现有的云原生可观测体系还无法覆盖。

据我们统计,大量超过千节点规模的生产级 JAVA on K8S 的用户都遇到过内存"黑洞"导致的 OOM 问题,以及大规模集群使用上的容器引擎层 CGroup 问题也会使得用户对容器化望而却步。

龙蜥社区系统运维 SIG 联合龙蜥社区理事长单位阿里云容器服务 ACK 团队进行合作,通过对多个头部行业客户的千万核规模的 Kubernetes 集群沉淀了丰富的容器化迁移专业经验,以及结合 Alinux 对操作系统 kernel 层的专业增强,通过与云原生容器服务结合,使容器引擎层不再“黑盒”,让用户放心容器化。

02 常见容器化内存“黑洞问题”

容器内存组成剖析

Kubernetes 采用内存工作集(workingset)来监控和管理容器的内存使用,当容器内存使用量超过了设置的内存限制或者节点出现内存压力时,kubernetes 会根据 workingset 来决定是否驱逐或者杀死容器。

  • 内存工作集计算公式:

Workingset = inactive_anon + active_anon + active_file。其中 inactive_anon 和 active_anon 是程序匿名内存总大小。active_file 是活跃文件缓存大小。

  • 匿名内存

匿名内存是指没有关联到文件的内存,例如进程的堆、栈、数据段等,有以下几种部分组成:

匿名映射:程序通过 mmap 系统调用创建的没有关联文件的内存映射。

:程序通过 malloc/new 或 brk 系统调用分配的动态内存。

:用于存储函数参数和局部变量的内存。

数据段:用于存储已初始化和未初始化的全局变量和静态变量的内存。

  • 活跃文件缓存

程序读写文件会产生文件缓存(file cache),其中最近多次使用的缓存称为 active file cache,通常不 容易被系统回收。

(图/Kernel Level Memory Distribution)

下面介绍通过 SysOM 监控来排查 Pod workingset 高的问题。

定位步骤一:定位哪些内存导致 workingSet 高

根据workingset计算公式:workingset = inactive_anon + active_anon + active_file 查看 PodMonitor 监控大盘中的 woringkset 监控,找到内存最大的类型,这里发现是 active file cache 占比较大。

(图/SysOM 监控提供 Pod 维度的操作系统内核层内存各组成成分监控)

发现问题步骤中,SysOM 提供通过 Top 分析快速定位集群中 active file cache 内存消耗最大的 Pod。

通过 Pod Cache (缓存内存)、InactiveFile(非活跃文件内存占用)、InactiveAnon(非活跃匿名内存占用)、Dirty Memory(系统脏内存占用)等不同内存成分的问题的监控展示,发现常见的 Pod 内存黑洞问题。

(图/通过 Top 分析找出集群中 active file cache 内存消耗最大的 Pod)

(图/SysOM 提供 Pod 维度的详细内存各组成成分监控统计)

定位步骤二:定位具体哪些文件导致 active file cache 高

查看 PodMonitor 监控大盘中的 file cache 监控,发现主要是 ack-ai-dashboard-admin-ui-77564df84c-z6bs2 容器在对 /workspace/ai-dashboard.jar 文件进行IO读写时,产生了较大的内存 Cache 缓存。

若 Pod 内存缓存较大,严重会导致 Pod 工作内存占用升高,这部分 Cache 内存会成为 Pod 工作内存的“黑洞”部分难以定为,产生线上常见的 Pod 内存黑洞导致的 OOM 驱逐问题,最终影响 Pod 所在的业务体验。

03 ACK 提供容器化内核层问题的完整解决方案

SysOM 是由龙蜥社区系统运维 SIG 打造的一站式操作系统运维平台,能够帮助用户在统一平台上实现主机管理、操作系统迁移、宕机分析、系统监控、异常诊断、日志审计、安全管控等复杂操作系统管理。2023 年 8 月,已正式推出围绕观测和系统运维的自动化运维平台 SysOM 3.0 版本

发现问题 - SysOM 系统容器监控

基于 SysOM,阿里云容器服务 ACK 拥有独有的操作系统 kernel 层的容器监控可观测能力。在客户容器化迁移中,社区、其他云厂商的容器服务没有很好地解决的内存黑洞、存储黑洞等问题,基于 SysOM 可以很好的观测、预警、诊断出问题。

SysOM 提供操作系统内核层 Pod、Node 维度监控大盘,实时监控内存、网络、存储的系统层指标。

(图/SysOM Pod 维度监控大盘)

(图/SysOM Node 维度监控大盘)

SysOM 功能、指标详细请参考文档:

https://help.aliyun.com/document_detail/2560259.html

解决问题 - Koordinator QoS精细化调度功能

内存黑洞问题如何修复,阿里云容器服务通过精细化调度功能,依托 Koordinator 开源项目,ack-koordinator 为容器提供内存服务质量 QoS(Quality of Service)保障能力,在确保内存资源公平性的前提下,改善应用在运行时的内存性能。本文简介容器内存 QoS 功能,具体说明请参见容器内存 QoS[1]。

容器在使用内存时主要有以下两个方面的约束:

  • 自身内存限制:当容器自身的内存(含Page Cache)接近容器上限时,会触发容器维度的内存回收,这个过程会影响容器内应用的内存申请和释放的性能。若内存申请得不到满足则会触发容器 OOM。
  • 节点内存限制:当容器内存超卖(Memory Limit>Request)导致整机内存不足,会触发节点维度的全局内存回收,这个过程对性能影响较大,极端情况甚至导致整机异常。若回收不足则会挑选容器 OOM Kill。

针对上述典型的容器内存问题,ack-koordinator 提供了以下增强特性:

  • 容器内存后台回收水位:当 Pod 内存使用接近 Limit 限制时,优先在后台异步回收一部分内存,缓解直接内存回收带来的性能影响。
  • 容器内存锁定回收/限流水位:Pod 之间实施更公平的内存回收,整机内存资源不足时,优先从内存超用(Memory Usage>Request)的 Pod 中回收内存,避免个别Pod造成整机内存资源质量下降。
  • 整体内存回收的差异化保障:在 BestEffort 内存超卖场景下,优先保障 Guaranteed/Burstable Pod 的内存运行质量。

关于 ACK 容器内存 QoS 启用的内核能力,详见 Alibaba Cloud Linux 的内核功能与接口概述[2]。

(图/ack-koordinator 为容器提供内存服务质量 QoS(Quality of Service)保障能力)

在通过第一步观测发现容器内存黑洞问题之后,可以结合通过 ACK 精细化调度功能针对性挑选内存敏感的 Pod 启用容器内存 QoS 功能,完成闭环修复。

相关链接:

1. 容器内存链接:

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/memory-qos-for-containers

2. Alibaba Cloud Linux的内核功能与接口概述:

https://help.aliyun.com/zh/ecs/user-guide/overview-23

—— 完 ——

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。

关于龙蜥

龙蜥社区是立足云计算打造面向国际的 Linux  服务器操作系统开源根社区及创新平台。龙蜥操作系统(Anolis OS)是龙蜥社区推出的 Linux 发行版,拥有三大核心能力:提效降本、更加稳定、更加安全。

目前,Anolis OS 23 已发布,全面支持智能计算,兼容主流 AI 框架,支持一键安装 nvidia GPU 驱动、CUDA 库等,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。

加入我们,一起打造面向云时代的操作系统!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
17小时前
|
运维 Kubernetes 测试技术
容器技术:优化软件测试流程的利器
本文介绍了容器技术的概念、优势和历史发展,对比了容器与虚拟机的区别,并提及了Docker和Kubernetes等常见容器技术。容器作为轻量级虚拟化工具,提供高效、灵活的应用部署方式,广泛应用于软件开发、云计算和微服务架构。随着技术演进,容器将在边缘计算、人工智能等领域发挥更大作用,推动行业变革。
9 3
|
18小时前
|
运维 Kubernetes Devops
构建高效稳定的云基础设施:DevOps与容器技术的结合
【5月更文挑战第12天】 在当今快速发展的信息技术时代,企业需要灵活、快速地响应市场变化并持续交付高质量的软件产品。本文将探讨如何通过结合DevOps文化和容器技术来构建一个高效且稳定的云基础设施。我们将讨论DevOps的核心概念及其如何加速开发周期,以及容器技术如Docker和Kubernetes如何提供一致性、可移植性和扩展性。最后,文章将介绍实际案例,展示这种结合如何在现代运维实践中实现自动化部署、持续集成和微服务架构管理。
|
3天前
|
机器学习/深度学习 算法 Linux
xenomai内核解析--实时内存管理--xnheap
Xenomai是一个实时操作系统(RTOS)层,用于Linux,旨在提供确定性的任务调度和服务。其内存管理机制包括一个名为xnheap的内存池,确保内存分配和释放的时间确定性,以满足硬实时系统的严格需求。
11 0
xenomai内核解析--实时内存管理--xnheap
|
4天前
|
Kubernetes Java 调度
Java容器技术:Docker与Kubernetes
Java容器技术:Docker与Kubernetes
16 0
|
4天前
|
运维 Linux Docker
Docker详解(十三)——Docker容器的内存和磁盘I/O限制配置
Docker详解(十三)——Docker容器的内存和磁盘I/O限制配置
14 1
|
6天前
|
缓存 运维 算法
深入理解Linux内核的虚拟内存管理
【5月更文挑战第6天】 在现代操作系统中,尤其是类Unix系统如Linux中,虚拟内存管理是一项核心功能,它不仅支持了多任务环境,还提供了内存保护和抽象。本文将深入探讨Linux操作系统的虚拟内存子系统,包括分页机制、虚拟地址空间布局、页面置换算法以及内存分配策略。通过对这些概念的剖析,我们旨在为读者揭示Linux如何有效地管理和优化物理内存资源,并确保系统的稳定运行与高效性能。
|
12天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
12天前
|
机器学习/深度学习 自动驾驶 安全
深入理解操作系统内存管理:策略与实现基于深度学习的图像识别技术在自动驾驶系统中的应用
【4月更文挑战第30天】 在现代计算机系统中,操作系统的内存管理是确保系统高效、稳定运行的关键组成部分。本文将深入探讨操作系统中内存管理的多种策略及其实现机制,包括但不限于分页、分段和段页式结合等技术。我们将剖析内存分配的原理,讨论虚拟内存技术的实现以及它如何提供更大的地址空间并允许内存的交换。同时,我们还会涉及内存保护机制,它们是如何防止程序访问未授权的内存区域。最后,文中将对现代操作系统如Linux和Windows中的内存管理实践进行比较分析,以期给读者提供全面而深入的理解和参考。 【4月更文挑战第30天】 随着人工智能技术的飞速发展,深度学习已经
|
12天前
|
Linux 开发者 Docker
Docker容器化技术详解
【4月更文挑战第30天】Docker,一个开源的容器化平台,助力开发者通过轻量级容器打包应用及依赖,实现跨平台快速部署。核心概念包括:容器(可执行的软件包)、镜像(只读模板)、Dockerfile(构建镜像的指令文件)和仓库(存储镜像的地方)。Docker利用Linux内核功能隔离容器,采用联合文件系统构建镜像。广泛应用包括开发测试一致性、微服务部署、CI/CD以及本地到远程部署。通过安装Docker,编写Dockerfile,构建&运行容器,可实现高效灵活的应用管理。随着容器技术进步,Docker在云计算和DevOps中的角色日益重要。
|
12天前
|
运维 Kubernetes 持续交付
构建高效自动化运维系统:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】 在快速发展的云计算时代,传统的运维模式已无法满足敏捷开发和快速迭代的需求。本文将介绍如何利用容器技术搭建一套高效自动化运维系统,实现软件的持续集成(CI)与持续部署(CD)。文章首先探讨了现代运维面临的挑战,接着详细阐述了容器技术的核心组件和工作原理,最后通过实际案例展示了如何整合这些组件来构建一个可靠、可扩展的自动化运维平台。