You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python程序中获取K8s Pod的当前内存使用情况

在K8s Pod的Python程序中获取内存利用率的实现方法

方法1:直接读取Cgroup文件(无额外依赖,推荐)

K8s容器的内存统计信息默认存储在cgroup虚拟文件系统中,不需要安装任何第三方依赖,适配绝大多数K8s发行版,不同cgroup版本对应的文件路径如下:

  • cgroup v1路径
    • 当前内存使用量:/sys/fs/cgroup/memory/memory.usage_in_bytes
    • 内存限制值:/sys/fs/cgroup/memory/memory.limit_in_bytes
  • cgroup v2路径
    • 当前内存使用量:/sys/fs/cgroup/memory.current
    • 内存限制值:/sys/fs/cgroup/memory.max

可直接使用以下封装好的工具函数获取内存利用率:

import os

def get_pod_memory_usage_rate() -> float:
    usage, limit = 0, 0
    # 优先适配cgroup v2
    if os.path.exists("/sys/fs/cgroup/memory.current"):
        with open("/sys/fs/cgroup/memory.current", "r") as f:
            usage = int(f.read().strip())
        with open("/sys/fs/cgroup/memory.max", "r") as f:
            limit_str = f.read().strip()
            limit = int(limit_str) if limit_str != "max" else float("inf")
    # 降级适配cgroup v1
    elif os.path.exists("/sys/fs/cgroup/memory/memory.usage_in_bytes"):
        with open("/sys/fs/cgroup/memory/memory.usage_in_bytes", "r") as f:
            usage = int(f.read().strip())
        with open("/sys/fs/cgroup/memory/memory.limit_in_bytes", "r") as f:
            limit = int(f.read().strip())
    # 非容器环境降级读取节点内存
    else:
        import psutil
        mem_info = psutil.virtual_memory()
        usage = mem_info.used
        limit = mem_info.total

    # 处理未配置Pod内存限制的场景(limit值会显示为非常大的数字)
    if limit == float("inf") or limit >= 2 ** 60:
        import psutil
        mem_info = psutil.virtual_memory()
        limit = mem_info.total

    return usage / limit

# 使用示例
if __name__ == "__main__":
    MEM_THRESHOLD = 0.9  # 90%内存阈值
    current_rate = get_pod_memory_usage_rate()
    print(f"当前内存利用率:{current_rate:.2%}")
    if current_rate >= MEM_THRESHOLD:
        # 此处执行数据转储逻辑,建议使用parquet/feather等二进制格式提升转储效率
        # df.to_parquet("./temp_dump.parquet", index=False)
        # del df
        # import gc
        # gc.collect()
        print("触发内存阈值,已完成数据转储")

方法2:通过Downward API获取(稳定性更高)

如果可以修改Pod部署配置,可通过K8s Downward API直接将内存限制值注入为容器环境变量,无需兼容cgroup版本:

  1. 在Pod的yaml配置中添加如下字段:
env:
  - name: POD_MEM_LIMIT_BYTES
    valueFrom:
      resourceFieldRef:
        resource: limits.memory
  1. Python程序中直接读取环境变量结合cgroup的内存使用值计算利用率即可。

注意事项

  • 不要直接使用psutil.virtual_memory()计算利用率,该接口返回的是宿主机节点的内存统计,和Pod的内存限制无关
  • 建议提前为Pod配置明确的resources.limits.memory,避免内存限制值不明确导致利用率计算偏差
  • 内存检查逻辑建议封装为独立函数,在每一步大数据量处理操作前调用,避免单次操作内存暴涨来不及转储

内容的提问来源于stack exchange,提问作者Vikas Garud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:06:03