大数跨境
0
0

Kubernetes Linux 节点 Swap 调优深度解析

Kubernetes Linux 节点 Swap 调优深度解析 云原生SRE
2025-11-21
5

 

欢迎点击下方👇关注我,记得星标哟~

文末会有重磅福利赠送

引言

Kubernetes 的 NodeSwap 功能(详见 Kubernetes 文档)预计将在即将发布的 v1.34 版本中正式稳定。该功能标志着 Kubernetes 从传统禁用 Swap 以确保性能可预测性的实践转向允许使用 Swap 的重大转变。本文专注于 Linux 节点上的 Swap 调优,该功能仅在 Linux 环境中可用。通过允许节点在物理 RAM 耗尽时利用二级存储作为额外虚拟内存,NodeSwap 旨在提升资源利用率并减少内存不足(OOM)杀进程事件。

然而,启用 Swap 并非一劳永逸的解决方案。节点在内存压力下的性能和稳定性高度依赖于 Linux 内核参数的配置。错误配置可能导致性能下降并干扰 Kubelet 的驱逐逻辑。本文将深入探讨影响 Swap 行为的关键内核参数,分析其对 Kubernetes 工作负载性能、Swap 利用率和驱逐机制的影响。通过各种测试结果,我们分享优化配置的发现,以实现稳定、高性能的 Kubernetes 集群。

https://kubernetes.io/blog/2025/08/19/tuning-linux-swap-for-kubernetes-a-deep-dive/

Linux Swap 基础知识

Linux 内核通过页面(通常为 4KiB 大小)管理内存。当物理内存受限时,内核的页面替换算法决定将哪些页面移至 Swap 空间。该算法受页面访问模式、页面脏度(是否被修改)和内存压力等因素影响。

匿名内存 vs 文件支持内存

内核区分两种内存类型:

  • • 匿名内存:不与磁盘特定文件关联,例如程序的堆和栈。这些是应用程序的私有内存,当内核回收时,必须将其写入专用 Swap 设备。
  • • 文件支持内存:与文件系统文件关联,包括可执行代码、共享库和文件系统缓存。内核可丢弃未修改的“干净”页面;对于“脏”页面,则需先写回文件。

在无 Swap 系统下,内核可回收干净文件支持页面,但无法卸载匿名内存。启用 Swap 提供此能力,允许内核将不常访问的页面移至磁盘,从而节省 RAM 并避免系统 OOM 杀进程。

关键内核参数

Linux 通过 sysctl提供参数调优 Swap 行为:

  • • vm.swappiness(范围 0-200):控制内核对 Swap 匿名内存 vs 回收文件支持内存(页面缓存)的偏好。
    • • 高值(例如 90+):内核积极 Swap 出不活跃匿名内存,以保留文件缓存。
    • • 低值(例如 <10):内核优先丢弃文件缓存页面。
  • • vm.min_free_kbytes:设置内核保留的最小空闲内存缓冲区。当空闲内存低于此值时,内核更积极回收页面(包括 Swap),最终可能触发 OOM 杀进程。该参数作为安全机制,确保关键分配有足够内存。高值会使 Swap 在内存压力下更早启动。
  • • vm.watermark_scale_factor:控制基于 min_free_kbytes计算的 minlow和 high水印间的间隙。
    • • 水印解释
      • • low:空闲内存低于此值时,kswapd进程唤醒,在后台回收页面,开始 Swap 周期。
      • • min:空闲内存达到此值时,阻塞进程分配,进行激进回收;失败则触发 OOM。
      • • high:空闲内存达到此值时,停止回收。
    • • 高值创建更大的 low和 min间缓冲区,给 kswapd更多时间渐进回收内存,避免系统进入临界状态。

在典型服务器工作负载中,高 swappiness可通过 Swap 出“冷”内存释放 RAM,支持依赖文件缓存的进程。调高 min_free_kbytes和 watermark_scale_factor可提前移动 Swap 窗口,提供更多空间防止 OOM。

测试与结果分析

为评估这些参数的影响,我们设计了一系列压力测试。

测试环境

  • • 平台:Google Cloud GKE。
  • • Kubernetes 版本:1.33.2。
  • • 节点配置:n2-standard-2(8GiB RAM,50GB Swap 于 pd-balanced 磁盘,无加密),Ubuntu 22.04。
  • • 工作负载:自定义 Go 应用,可控速率分配内存、生成文件缓存压力,并模拟不同访问模式(随机 vs 顺序)。
  • • 监控:侧车容器每秒捕获系统指标。
  • • 保护:关键组件(如 kubelet、容器运行时、sshd)通过 cgroup 设置 memory.swap.max=0防止 Swap。

测试方法

在不同 swappiness(0、60、90)和水印参数下运行压力测试 Pod,观察高内存分配和 I/O 压力下的行为。

Swap 可视化

在 100MB/s 压力测试中,随着空闲内存减少,Swap 使用和换出活动增加,同时 I/O 活动和 CPU I/O 等待时间上升,表明系统压力增大(详见原文图表)。

关键发现

默认参数(swappiness=60min_free_kbytes=68MBwatermark_scale_factor=10)下,高压力迅速导致 OOM 和节点重启。通过优化,可实现节点稳定性和性能平衡。

swappiness的影响

测试显示:

  • • swappiness=90:内核优先 Swap 不活跃匿名内存,保留文件缓存,导致高 Swap 使用和 I/O 活动,CPU I/O 等待 spikes。
  • • swappiness=0:优先丢弃文件缓存,延迟 Swap。但这不禁用 Swap;高压力下仍会 Swap 匿名内存。

选择取决于工作负载:I/O 敏感负载宜低值;依赖文件缓存的负载宜高值,前提是磁盘足够快。

水印调优以防驱逐和 OOM

快速内存分配(300-500 MB/s)下,默认水印缓冲区过小,导致 kswapd无法及时回收,引发 Kubelet 驱逐或 OOM。

优化方案:

  • • min_free_kbytes增至 512MiB:提前回收,提供更大安全缓冲。
  • • watermark_scale_factor增至 2000:扩大 low和 high间隙(测试中从 ≈337MB 增至 ≈591MB),延长 Swap 窗口。

此配置成功防止了驱逐和 OOM(详见原文比较表和图表)。

A side-by-side comparison of different min_free_kbytes settings, showing differences in Swap, Memory Usage and Eviction impact

风险与推荐

启用 Swap 虽强大,但需谨慎管理风险:

  • • 性能下降风险:Swap 远慢于 RAM,若活跃工作集被 Swap 出,将导致抖动(thrashing)。建议使用 SSD 存储。
  • • 掩盖内存泄漏风险:Swap 可隐藏泄漏,导致渐进性能退化而非快速 OOM,便于诊断。
  • • 禁用驱逐风险:不当调优可能在 Kubelet 驱逐前触发 OOM。需确保 min_free_kbytes配置支持 Kubelet 机制。

Kubernetes 上下文

内核水印与 Kubelet 驱逐阈值共同定义内存压力区。理想配置应创建足够大的“Swap 区”(high和 min间),允许内核通过 Swap 处理压力,避免进入驱逐/直接回收区(详见原文阈值图)。

推荐起始配置

基于测试,以下为启用 Swap 的 Linux 节点起始点(建议在测试环境中基准您的负载):

  • • vm.swappiness=60:Linux 默认值,适合通用负载;敏感应用需进一步调优。
  • • vm.min_free_kbytes=500000(500MB):设置为节点总内存的 2-3%,提供合理安全缓冲。
  • • vm.watermark_scale_factor=2000:扩大 kswapd操作窗口,防止突发 OOM。

启用 Swap 时,强烈建议在测试环境中运行基准测试,考虑 CPU 负载、磁盘类型(SSD vs HDD)和 I/O 模式等因素。

 

往期回顾

K8S工具推荐,Kargo:下一代 GitOps 持续交付工具

K8S工具推荐:Bufstream-唯一通过 Jepsen 验证的云原生 Kafka 实现

K8S工具推荐: 使用 Kubemark 进行 Kubernetes 大规模集群模拟实践

K8S工具推荐:使用Argo Rollouts实现GitOps自动化测试与回滚

K8S工具推荐:资源编排新利器:三大云厂商联合推出 KRO

K8S工具推荐:告别复杂认证!Kubernetes登录神器kubelogin指南

K8S工具推荐:Kubernetes资源优化神器KRR:一键诊断集群资源浪费

Kubernetes工具推荐:使用 k8s-pod-restart-info-collector简化故障排查

K8S工具推荐:动态无缝的Kubernetes多集群解决方案-Liqo

K8S学习路线2025

𝙺̲𝚞̲𝚋̲𝚎̲𝚛̲𝚗̲𝚎̲𝚝̲𝚎̲𝚜̲ 管理的最佳实践(2025)

如何落地一个企业级PaaS容器云平台:从规划到实施全流程指南


【声明】内容源于网络
0
0
云原生SRE
懂点K8S的SRE,关注云原生、DevOps、AI&ChatGPT等技术热点
内容 313
粉丝 0
云原生SRE 懂点K8S的SRE,关注云原生、DevOps、AI&ChatGPT等技术热点
总阅读41
粉丝0
内容313