Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
OpenCloudOS 内存多级卸载落地实践分享_创想鸟

OpenCloudOS 内存多级卸载落地实践分享

近日,第四届中国云计算基础架构开发者大会(china cloud computing infrastructure developer conference – 简称 cid),秉持着纯技术、非商业化的原则,以「自由、协作、创新」为核心理念,在深圳与技术开发者们见面。本次大会聚焦于业界最前沿的云计算基础架构技术成果,涵盖主论坛及三大技术主题分论坛,围绕基础架构技术领域的技术交流,展示先进技术在行业中的典型应用,赋能行业客户实现业务变革。

OpenCloudOS 内存多级卸载落地实践分享在主论坛上,OpenCloudOS 社区成员、腾讯资深内核研发专家——曾敬翔,以《云原生场景下内存多级卸载落地实践》为主题,分享了腾讯在实施内存多级卸载方案过程中遇到的实际问题、对应的解决方案,以及在容器平台上的落地数据。以下是分享的重点内容。

一、产业背景内存需求成本不断上升,提升内存利用率成为关键问题:

1. 数据中心硬件采购成本中,服务器占比最高,其中 CPU、GPU 和 DRAM 是主要成本项;

2. 随着数据量和业务复杂度的增加,内存需求激增,应用程序为了提高性能,通常采用内存密集型策略,长时间运行或大量服务并存时会面临巨大的内存压力,如内存颠簸、OOM 等。云计算对内存需求也在持续增长。

3. 业务中不活跃的冷内存占有很大比例,比例值根据业务不同会有波动,比如我们在集群中抓取的一些典型 workload 的冷热内存占比如下图。

OpenCloudOS 内存多级卸载落地实践分享绿色线表示总的内存使用量,蓝色线是匿名页的冷内存占比,橙色线是文件页冷内存占比。可以看出,冷内存占集群的比例较高。

在这样的背景下,内存多级卸载应运而生。如下图,使用内存多级卸载后,每个 workload 可以节省出很多空闲资源。对于这些空闲资源,我们在PHP中文网应用中主要有三种使用场景。

OpenCloudOS 内存多级卸载落地实践分享第一种,业务超卖场景:对 workload 开启多级卸载后,增加单个 pod(CVM)的流量,提高 TPS、QPS。

OpenCloudOS 内存多级卸载落地实践分享第二种,负载降配

●降低业务成本:对 workload 开启内存多级卸载后,降低 workload resources 的 memory request 和 limit,降低平台业务的上云成本。

●提高集群装箱率:多数集群节点的 CPU/MEM 比例为 1:2,但现网上很多是大内存 workload(1:4,1:8),影响集群装箱率,将大内存 workload 降配后(1:8 -> 1:4),可以提高集群装箱率。

OpenCloudOS 内存多级卸载落地实践分享第三种,混部弹性内存超卖

提高内存混部率:把非内存敏感型 workload 开启内存多级卸载,节省出多余的空闲内存资源,可以调度更多的离线(低优先级)pod 上来,并且,在整机内存压力大又不能及时迁出的情况下,优先迁出、OOM 调离线(低优先级)pod。

OpenCloudOS 内存多级卸载落地实践分享二、整体解决方案在云原生场景中落地内存多级卸载时遇到的实际问题:

●回收路径难以确定:内存多级卸载的回收名单是 cgroup path list,但在云原生容器平台中,pod cgroup path 是一串哈希值,并且 pod 会在集群的 node 中间迁入迁出,实时调度,如何确定节点上哪些 pod 需要开启内存多级卸载,并且随着 pod 状态的改变,实时改变回收及更新名单?

●回收参数难以确定:在容器平台中,需要开启内存多级卸载的 workload 对内存回收的敏感程度是不一样的,如何判断 workload 类型,然后使用对应回收参数?

●主动回收也会导致一些问题:

(1)误回收“冷”文件页:主动回收额外的文件页面,由于当前 lru 精度比较单调,导致误回收一些将会访问的页面,导致 cache miss,造成读 IOPS 增加。

(2)过度压缩匿名页:在主备存储模型中,备份节点一直处于空闲状态,因为 PSI 一直表征空闲情况,内存多级卸载不断将其匿名页面压缩到 zram,突然的主备切换,导致备节点突增大量请求,所有在 zram 的页面基本都需要解压,造成颠簸的延迟反应。

●zram 的页面无法统计,这也是社区面临的问题:目前 workload 的 resources.limits.memory 是对 cgroup 的 memory.usage_in_bytes 做限制,但是压缩在 zram 的匿名页面无法被限制,会造成计数器泄露的问题,pod 可能无限制的利用 node 上的 zram 资源,而 k8s 感知不到。

●无法隔离非内存多级卸载 pod 的换出行为:当对 node 节点开启 zram 的时候,虽然不对非内存多级卸载 pod 做主动回收,但在非内存多级卸载 pod 容器内存紧缺的情况下、或者整机内存紧缺的情况下,依然有可能把非内存多级卸载 pod 的匿名页面压缩到 zram 中,改变客户原本的预期行为。

01

整体架构

针对以上问题,我们提出了一个整体解决方案,分为5个模块及各自功能。

OpenCloudOS 内存多级卸载落地实践分享● wujing-umrd daemonset:

○qos-agent container:在 node 上,找到哪些 pod 打开了多级卸载,并且把 pod cgroup 和回收参数发送到 umrd ds。

○umrd container:umrd 根据 qos-agent 传递过来的回收列表进行主动回收,并且根据回收参数、PSI、refault、cpu util 计算回收文件页、匿名页的数量。

● mglru 增强模块:

○拆分接口:文件页面、匿名页面独立扫描、回收。

○Workingset Evaluation:评估有效文件页回写数量。

○new workingset refault feature:优化 mglru workingset。

● swap 隔离模块:system disable、cgroup disable,可以隔离来自节点内存紧缺和容器内存紧缺对非开启内存多级卸载的 pod 换出行为。

● zram 增强模块:per-cgroup zram priority、per-cgroup zram counter(raw、limit、usage)每个 cgroup 可以独立设置 zram 压缩等级,对于 per-cgroup 也做到了每个 cgroup 都能独立计算出压缩前和压缩后的量,以及现在 cgroup zram 的用量。

● 现网集群中部署热度探测模块:可以做匿名段热度探测,pod 中总内存的容器总匿名页、文件页面热度探测,计算各自占比,我们根据占比评估出 workload 哪个集群适合开启多级卸载。

02

子模块介绍

wujing-umrd ds

我们在集群中部署 wujing-umrd ds,集群中每个 node 都会被调度上一个 wujing-umrd pod,其中,wujing-umrd ds 包含一个 qos-agent container 和 umrd container。

● qos-agent container:当 node 上 pod 状态发生变化的时候,根据 pod yaml 打的 QOS 标签,对 pod 开启多级卸载,并且启用 QOS 标签对应的压缩等级和回收参数。

● umrd container:接受 qos-agent container 传递的回收路径和回收参数,并且根据 PSI、refault 负反馈决定当前回收的页面数量,将这些页面数量下给内核。

OpenCloudOS 内存多级卸载落地实践分享mglru 增强

在内核中,我们更换了 LRU 算法。原本是两级 mglru,我们 backpod 上游多级

OpenCloudOS 内存多级卸载落地实践分享● 精度提升:传统 LRU 仅使用两个 lru list(Active/Inactive)来区分页面热度。而 MGLRU 中将 LRU 分成了四个世代(Gen),每个世代中又分为 4 个层级(Tier)。表征页面精度的提升,意味着误回收“冷”页的可能性下降。

● mglru 拆分接口:

○将 mglru 文件页、匿名页的扫描和回收过程隔离,并且给出统一的用户接口。

○使用方式,例如:

对于访问频繁的匿名页面,可以 10s 扫描一次,5s 回收一次。

对于慢盘并且访问少的文件页,可以 20s 扫描一次,2s 回收一次,实现有针对性的回收。

● Workingset Evaluation:

○可以获取一个 Cgroup 过去 1分钟/10分钟/30分钟 内平均 Refault 距离,以及预估有效文件页回写数量。

● workingset refault 重构与优化:

○对 Linux 内核中传统 LRU 长期使用的 Workingset Refault Distance 算法进行了重新优化设计,并成功将其与 MGLRU 中的 Refault PID 算法结合。

○改进后的算法可以辅助不同场景下进行更加有效的页面平衡,并能更加有效地防止 Thrashing。新算法在一些应用场景中有着非常显著的性能提升(5% – 400%)。即使是在传统 LRU 场景下,新算法也有可见性能提升(1 – 5%)。部分改进已发至上游。

swap 隔离

在集群原本没有开启 swap,在使用多级卸载后,将会把集群的 swap 打开,对于非多级卸载 pod,在整机、容器内存紧缺的情况下,会将匿名页面换出到 swap 设备,这是业务非预期行为,得支持 swap 的隔离。

OpenCloudOS 内存多级卸载落地实践分享● 整机内存紧缺:在整机内存紧缺的情况下,内核内存子系统会从 root memcg 开始遍历 memcg,并且回收其 lruvec,由于可能会对非多级卸载的 pod 做回收。

● 容器内存紧缺:在容器内存紧缺的情况下,内核内存子系统会从当前 memcg 开始遍历 memcg,并且回收其 lruvec,如果当前 memcg 没有开启多级卸载,那么会导致业务的匿名页面换出到 swap 上。

接口与解决办法:

● 内核接口:vm.force_swappiness、memory.swappiness

● qos-agent:qos-agent 对开启多级卸载的集群,设置 vm.force_swappiness=1,强制在整机、容器内存紧缺的情况下,强制对 swappiness==0 的容器不回收匿名页面;并且,在 node 上 pod 状态发生变化的时候,对非多级卸载 pod 设置 swappiness=0,多级卸载 pod 设置 swappiness=60。

zram 增强

ZRAM Enhance 基于上游 Object Cgroup API 实现,每个 Cgroup 提供了:

OpenCloudOS 内存多级卸载落地实践分享● 独立更改 ZRAM 压缩级别:

/memory.zram.priority:每个 Cgroup 可以选择压缩等级 1 – 4,默认分别对应算法 lz4,lzo-rle,lz4hc,zstd,压缩率由高到低,性能损失由小增大,进而对不同敏感程度的 pod 用不同的压缩等级。

● 独立统计 ZRAM 压缩数据:

/memory.zram.raw_in_bytes:以 Byte 为单位的换出到 zram 压缩前的数据大小/memory.zram.usage_in_bytes:以 Byte 为单位的换出到 zram 压缩后的总数据大小

● 限制 ZRAM 压缩量

/memory.zram.limit_in_bytes:以 Byte 为单位,限制本 memcg 换出到 zram 的总数据大小,超出这个限制后,匿名页面将无法换出到 zram 设备。

同时,zram 压缩后的数据大小会计算到 memory.usage_in_bytes 上,方便 k8s 感知和限制。

三、在腾讯的落地效果目前内存多级卸载在腾讯在线容器平台、离线容器平台、混部容器平台都已成熟应用,覆盖业务包括:键值存储、文件存储、聊天图片存储、聊天消息存储、AI 平台、游戏 AI 训练、转码、数据库等。主要收益场景:超卖、降配、混部。

超卖场景

内存节省:提升单机的内存售卖率,降低内存存储的成本。相同数据量情况下,开启多级卸载,内存用量降低 35%。

延迟情况:请求延时基本没有波动。

OpenCloudOS 内存多级卸载落地实践分享开启多级卸载后内存量的变化

OpenCloudOS 内存多级卸载落地实践分享benchmark 的请求延迟没有波动

降配场景

内存节省:对 workload 开启多级内存卸载,稳定降低内存用量后,降低 workload 的配置,节省业务上云成本。

性能:降低业务 workload 86% 的 OOM 数量。

OpenCloudOS 内存多级卸载落地实践分享OpenCloudOS 内存多级卸载落地实践分享混部场景

内存节省:在混部集群中,节点内存接近打满,但 CPU 利用率还有空闲,此时内存资源成为混部瓶颈。对非内存敏感型 workload 开启多级卸载后,节省出额外的内存资源,调度更多的离线 pod。

性能:无影响(出现影响优先 kill 离线 pod)。

OpenCloudOS 内存多级卸载落地实践分享OpenCloudOS 内存多级卸载落地实践分享OpenCloudOS 内存多级卸载落地实践分享

以上就是OpenCloudOS 内存多级卸载落地实践分享的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/14396.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
最高5088mAh!iPhone 17全系内存、电池容量确定:标准版8GB 其余都是12GB
上一篇 2025年11月24日 20:02:05
华为 P70 直接开启先锋计划 正式开售
下一篇 2025年11月24日 20:05:08

相关推荐

  • Canva中AI生成图片如何导出?教你快速保存设计作品的方法

    答案:Canva中导出AI生成图片的操作与普通图片相同,点击右上角“分享”按钮,选择“下载”,可选PNG、JPG、PDF、SVG、MP4或GIF等格式;为保证画质,建议优先选用PNG格式,避免有损压缩,同时选择高分辨率和合适尺寸,Pro用户可进一步调整质量与透明背景设置;除下载外,还可通过分享链接、…

    2026年9月22日
    800
  • VSCode安全更新机制解析

    VSCode通过自动检查、数字签名验证和用户可控策略确保更新安全。启动时后台定期HTTPS请求检查新版本,每日一次;安装包经平台特定签名(Windows Authenticode、macOS代码签名、Linux GPG)验证完整性;用户可选自动更新、提示或关闭,企业可集中管控;微软通过安全入口响应漏…

    2026年9月22日
    000
  • Linux系统中文件属性和权限实战操作

    Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作Linux系统中文件属性和权限实战操作

    —–原本今天的文章是昨天晚上就要更新的,但是由于昨天晚上下班回到住的地方,发现停电了,所以就没写成。今天是在上一篇文章–linux系统中文件类型的基础上,继续进行深入的学习。好了,直接开干。 一、文件的操作权限: 1、在这之前我想还是很有必要介绍对文件的操作权限(…

    2026年9月22日 • 用户投稿
    000
  • PHP中为数组元素设置默认值的最佳实践:使用Null合并运算符

    本教程将介绍如何在PHP中为数组元素设置默认值,尤其当源数据可能为空或缺失时。通过利用PHP 7+提供的Null合并运算符(??),可以简洁高效地实现这一需求,避免冗长的条件判断,提高代码可读性和健壮性。 引言:处理缺失或空值时的数组赋值 在Web开发中,我们经常需要从用户请求、数据库查询或其他外部…

    2026年9月22日
    000
  • VSCode快速配置Dart:Flutter开发、中文提示、热加载

    安装vscode并下载flutter sdk,解压至无中文或特殊字符的路径;2. 将flutter sdk的bin目录添加到系统环境变量path中;3. 打开新终端执行flutter doctor,根据提示安装缺失的依赖;4. 在vscode扩展商店安装dart和flutter扩展;5. 确保在调试…

    2026年9月22日
    100
  • Inkscape如何导出AI生成的矢量图片?教你快速保存图像的步骤

    答案:在Inkscape中导出矢量图需根据用途选择格式,网页用优化SVG并转文本为路径,印刷则导出为PDF/EPS、转文字为路径、确保高分辨率位图,同时注意颜色模式与出血设置。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在Inkscap…

    2026年9月22日
    700
  • Laravel 8 登录后重定向至仪表盘的策略与实践

    本教程详细阐述了在 Laravel 8 中实现用户登录后重定向到仪表盘的多种策略。我们将探讨如何通过配置 LoginController 的 $redirectTo 属性、利用 RouteServiceProvider 定义常量以及在自定义登录方法中进行精确控制来管理重定向流程。文章还涵盖了相关中间…

    2026年9月22日
    000
  • VSCode配置GDB调试器 深入掌握VSCode调试C程序技巧

    配置vscode中gdb调试c程序的核心是正确设置tasks.json和launch.json;2. tasks.json负责使用gcc -g编译生成带调试信息的可执行文件,确保prelaunchtask与launch.json中的program路径一致;3. launch.json指定调试器gdb…

    2026年9月22日
    100
  • java定时任务之quartz

    大家好,很高兴再次与大家见面,我是你们的朋友全栈君。 一、Quartz简介 在企业应用中,我们常常需要处理定时任务调度,比如每天凌晨生成前一天的报表,每小时生成一次汇总数据等。Quartz是一个著名的任务调度框架,它可以与J2SE和J2EE应用结合,功能非常强大,易于与Spring集成,使用起来非常…

    2026年9月22日
    100
  • Java中异常处理与方法返回值结合

    异常发生时不应返回默认值,而应通过抛出异常或使用Optional、自定义结果类等方式明确传递错误信息,确保调用方能正确处理失败情况,提升代码健壮性与可读性。 在Java中,异常处理与方法返回值的结合是一个常见的编程问题。理解它们之间的关系有助于写出更健壮、可读性更强的代码。当一个方法可能发生异常时,…

    2026年9月22日
    000
  • 如何在Linux命令行中进行文件查找?

    最常用Linux查找文件方法是使用find命令。按名称搜索用-name选项,如find . -name “*.log”;忽略大小写用-iname;按类型查用-type f(文件)或d(目录);按大小查用-size,如+100M表示大于100MB;按修改时间用-mtime,-7…

    2026年9月22日
    000
  • tk做养生类目起号前期发什么视频?tk表示什么类目?

    在TikTok上运营养生类账号,起号阶段的内容策略尤为关键。优质的内容不仅能快速吸引目标用户,还能为后续发展奠定良好基础。本文将深入解析初期应发布的视频类型,并澄清“TK”所指的平台属性及内容分类体系。 一、养生类目起号初期适合发布哪些视频内容? 刚开始做养生赛道时,重点不在于变现,而在于建立专业形…

    2026年9月22日
    000
  • Grok官方网站直达页_Grok官网官方网页版入口

    Grok官网官方网页版入口为https://grok.com,用户可通过该网站访问网页端服务,支持跨设备同步;同时可下载移动应用或在X平台内使用Grok功能。未订阅用户可体验基础功能,Premium及Premium+需通过X平台订阅,SuperGrok则仅在官网提供,具备更强数据处理能力。账户升级后…

    2026年9月22日
    600
  • PHP如何利用缓存优化实时输出_PHP实时输出与缓存结合优化

    PHP实时输出需结合输出缓冲控制与flush()强制推送,同时考虑服务器和浏览器缓存影响;2. 长时间任务应使用APCu或Redis缓存频繁数据,避免重复计算;3. 动态页面可采用分块输出与片段缓存策略,静态内容从缓存读取,动态部分边生成边输出;4. 更优方案是通过异步任务与Redis存储进度,前端…

    2026年9月22日
    000
  • 华为天际通Go将支持eSIM:设备在路上了

    华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了华为天际通Go将支持eSIM:设备在路上了

    9月3日消息,今年的iphone 17 air将仅支持esim,彻底移除实体sim卡槽结构。随着新品发布日期的临近,国内esim政策的进展也愈发引人关注。 然而综合多方信息来看,iPhone 17 Air国行版本可能无法赶上首发,因前期在国内无法使用eSIM服务,导致该机型短期内难以在国内上市。 相…

    2026年9月22日 • 用户投稿
    000
  • VSCode配置C语言调试环境 从零开始VSCode搭建C开发工具

    要从零开始在#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8中搭建c语言开发和调试环境,首先需安装vscode本体、c/c++编译器(如mingw或gcc)并配置系统环境变量,接着安装vscode的c/c++扩展,然后创建项目并编写c…

    2026年9月22日
    000
  • 如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程如何用PhotoLab的AI裁剪图片?快速实现智能图像裁剪教程

    PhotoLab的AI裁剪功能通过智能识别主体与构图原则,提供优化裁剪建议,区别于传统手动裁剪的纯物理操作,能自动应用美学法则提升照片视觉吸引力;在人像、社交媒体适配、风景静物等场景中表现突出,尤其擅长保留核心焦点并适配多平台比例;用户可导入图片后使用AI裁剪工具,系统分析画面并生成建议裁剪框,支持…

    2026年9月22日 • 用户投稿
    000
  • 递归实现列表排序检查与条件移除最大值

    本文详细介绍了如何使用Java递归方法处理整数列表。核心内容包括:首先检查列表是否已排序,如果已排序则直接返回false;如果未排序,则查找列表中的最大值。仅当最大值位于列表的起始或结束位置时,才将其移除并递归地继续处理列表。如果最大值位于列表中间,则打印当前列表并终止递归。 在数据处理和算法设计中…

    2026年9月22日
    000
  • VSCode如何实现代码可视化调试 VSCode执行流程图形化分析方法

    vscode的可视化调试功能通过内置调试器和扩展生态,显著提升代码理解与问题排查效率。1. 首先配置launch.json文件以定义调试环境,支持多种语言如node.js、python等;2. 在代码中设置断点,程序运行至断点时暂停,便于检查变量状态和执行上下文;3. 利用调试面板查看变量、监视表达…

    2026年9月22日
    000
  • 每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧

    每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧每个 Linux 用户都应该知道的 5 个简单的 Bash 历史技巧

    无论您是bash 初学者还是专家,如果不使用超级有用的 bash 历史记录功能,您将无法继续在命令行中工作。 您可能已经知道,如果您在 Linux 终端中使用向上或向下箭头键,您可以查看之前运行的命令。 这要归功于bash history 命令。 1.查看您的 bash 历史记录 查看您之前键入的命…

    2026年9月22日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信