我们有一个设置,其中 Azure DevOps Pipelines 自托管代理作为 Kubernetes Pod 运行,以便我们可以在单个 Azure VM 上运行多个构建代理。
现在我想测量某些管道作业期间的最大内存消耗。我的目标是弄清楚某个作业至少需要多少内存才能运行,而不会因 OOM 而被 K8s 杀死。
为此,我编写了一个脚本,该脚本在管道作业开始时启动,并每隔几秒测量一次当前内存,直到作业结束。最后,测量数据作为管道工件提供以供以后分析。
由于这是 Kubernetes,我无法使用 top、free 等。相反,我正在解析 Kubernetes pod 特定 cgroup 的 memory.stat 文件(cgroups v2)。
从该 memory.stat 文件中,我总结了以下值:
我现在已经执行了几次测试运行,但尽管在同一个 Git 存储库提交上始终运行相同的管道,但我得到的最大值非常不同。
我计算最大不可回收内存的方式是否有问题,或者当 Azure DevOps 构建代理已经在内存测量之间运行了许多管道时,它甚至可能存在某种(临时)内存泄漏?
我很感激任何建议,因为我知道这个话题非常复杂。
根据捕获资源利用率详细信息:
使用 Azure DevOps Services 时,通过启用详细日志,您可以在日志中查看资源利用率,包括磁盘使用情况、内存使用情况和 CPU 利用率。管道完成后,在日志中搜索每个步骤的
Agent environment resources
条目:
要为单次运行配置详细日志,您可以通过选择运行管道并选择启用系统诊断来启动新构建: