容器内存
明白,你的问题可以分为两部分,我帮你整理成清晰、详细的说明:
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
结论:
-
RSS / Working Set / Cache 不可直接设置,只能通过内存限制间接影响
-
Swap 可配置,通过 Docker 或 kubelet 控制
2️⃣ /sys/fs/cgroup 与 containerd/docker stats 区别
| 特性 | /sys/fs/cgroup | docker 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 stats或ctr metrics -
Prometheus/cAdvisor → 本质是读 cgroup 数据再封装成指标
如果你愿意,我可以帮你写一个 命令或脚本,在 Kubernetes 集群里一次性打印所有 heka-service Pod 的 RSS、Cache、Swap、Working Set 对比,便于验证告警阈值。
你希望我帮你写吗?
浙公网安备 33010602011771号