如何在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版本:
- 在Pod的yaml配置中添加如下字段:
env: - name: POD_MEM_LIMIT_BYTES valueFrom: resourceFieldRef: resource: limits.memory
- Python程序中直接读取环境变量结合cgroup的内存使用值计算利用率即可。
注意事项
- 不要直接使用
psutil.virtual_memory()计算利用率,该接口返回的是宿主机节点的内存统计,和Pod的内存限制无关 - 建议提前为Pod配置明确的
resources.limits.memory,避免内存限制值不明确导致利用率计算偏差 - 内存检查逻辑建议封装为独立函数,在每一步大数据量处理操作前调用,避免单次操作内存暴涨来不及转储
内容的提问来源于stack exchange,提问作者Vikas Garud
相关产品推荐
相关产品推荐

