容器内存

明白,你的问题可以分为两部分,我帮你整理成清晰、详细的说明:


1️⃣ 容器怎么设置 RSS、Cache、Swap、Working Set

核心概念

指标是否可直接设置控制方式
RSS ❌ 不可直接设置 通过 内存限制 (limits.memory) 间接控制;RSS 会受到内核调度和工作集影响
Cache ❌ 不可直接设置 内核 page cache 自动管理;内存压力大时会回收,可通过 memory limit 间接控制
Swap ✅ 可设置 通过 Docker --memory-swap 或 Kubernetes swap 配置控制
Working Set ❌ 不可直接设置 由内核自动计算 (RSS + 活跃缓存 - 可回收缓存),间接受 memory limit 控制

Docker / containerd 设置示例

# 限制 RSS/Working Set 最大 1G,禁止 swap
docker run -it \
  --memory=1g \
  --memory-swap=1g \
  --memory-swappiness=0 \
  ubuntu:24.04 bash

说明:

  • --memory=1g → 容器最大内存(限制 RSS + working set)

  • --memory-swap=1g → 容器总内存 + swap 限制

  • --memory-swappiness=0 → 尽量不使用 swap


Kubernetes 设置示例

apiVersion: v1
kind: Pod
metadata:
  name: heka-service
  namespace: styx-zzt
spec:
  containers:
  - name: heka-service
    image: heka:latest
    resources:
      requests:
        memory: 512Mi    # 最小保证
      limits:
        memory: 1Gi      # 最大内存,间接控制 RSS 和 Working Set

说明:

  • limits.memory → 控制 RSS + working set 最大值

  • requests.memory → 保证最小内存,不会被 K8s 驱逐

  • swap 默认禁用,如需开启,需要修改 kubelet 参数 --fail-swap-on=false


结论:

  1. RSS / Working Set / Cache 不可直接设置,只能通过内存限制间接影响

  2. Swap 可配置,通过 Docker 或 kubelet 控制


2️⃣ /sys/fs/cgroupcontainerd/docker stats 区别

特性/sys/fs/cgroupdocker stats / containerd stats
数据来源 Linux 内核 cgroup 容器运行时封装 cgroup 数据
精确度 高,原始数据 中等,做了汇总和格式化
可查看指标 rss, working_set, cache, swap, limit memory usage (≈ working set), CPU%, limit
易用性 较低,需要手动查找容器 cgroup 路径 高,一条命令显示所有容器
依赖 不依赖 Docker/containerd 依赖 Docker/containerd
用途 精细调试、告警验证 日常运维监控、快速查看

实际使用建议

  • 精细分析/sys/fs/cgroup,可看到 RSS、Cache、Working Set、Swap 具体值

  • 日常监控/快速查看docker statsctr metrics

  • Prometheus/cAdvisor → 本质是读 cgroup 数据再封装成指标


如果你愿意,我可以帮你写一个 命令或脚本,在 Kubernetes 集群里一次性打印所有 heka-service Pod 的 RSS、Cache、Swap、Working Set 对比,便于验证告警阈值。

你希望我帮你写吗?

posted on 2025-10-09 20:06  吃草的青蛙  阅读(13)  评论(0)    收藏  举报

导航