Pinterest 工程师通过深入排查,发现 AWS 深度学习 AMI 中默认启用的 ECS 代理崩溃循环导致内存 cgroup 泄漏,形成“僵尸”进程,最终通过禁用该代理解决了机器学习训练任务的 CPU 资源饥饿问题。
📝 详细摘要
本文详细记录了 Pinterest 工程师如何追踪并解决其基于 Kubernetes 的机器学习平台 PinCompute 上出现的间歇性 CPU 资源饥饿问题。该问题导致训练任务成功率下降超过 25%,表现为弹性网络适配器(ENA)设备重置和数据包丢失。由于高级仪表盘无法定位问题,团队转而使用 mpstat 进行逐核分析,发现个别内核的 CPU 使用率会持续 100%。通过性能捕获和 Netflix Flamescope 可视化,他们将问题根源定位到 kubelet 进程在内核函数 mem_cgroup_nr_lru_pages 上的异常高占用。最终发现,问题源于 AWS 深度学习 AMI 中默认启用的 Amazon ECS 代理,该代理在崩溃循环中泄漏了约 70000 个“僵尸”内存 cgroup,导致 kubelet 在同步状态时遍历列表而独占内核。解决方法是在基础镜像中禁用 ECS 代理并重启机器。文章强调了深入理解系统堆栈、质疑默认配置以及持续性能分析的重要性。
💡 主要观点
- Pinterest 的机器学习训练任务因 CPU 资源饥饿而崩溃,根源是“僵尸”cgroup。 AWS 深度学习 AMI 中默认启用的 ECS 代理陷入崩溃循环,泄漏了大量内存 cgroup,导致 kubelet 进程在同步状态时独占 CPU 内核,最终引发网络设备重置和任务失败。
💬 文章金句
- 通过识别团队所说的“僵尸”(即由崩溃循环的默认代理所留下的内存泄漏 cgroups),工程师们成功地恢复了分布式计算平台的稳定性。
- 这一经验表明,应用程序、编排器与内核之间的抽象层往往会掩盖真正的原因:在这个案例中,正是冗余的用户空间守护进程导致了内核状态泄漏。
- 他们的实践经验为软件工程师们敲响了重要的警钟:要对系统默认设置持质疑态度,并熟练掌握底层诊断工具。
📊 文章信息
AI 初评:86
来源:AI前线
作者:AI前线
分类:软件编程
语言:中文
阅读时间:7 分钟
字数:1664
标签: Pinterest, Kubernetes, CPU 瓶颈, 性能调优, cgroup