ACK通过ack-node-problem-detector(NPD)组件监测GPU资源的健康状态。当GPU节点出现XID/SXID错误等异常时,NPD组件自动检测并隔离异常GPU卡,此时其他正常的GPU可以继续提供服务,以尽可能减少业务上的损失,提高集群的可靠性和运维效率。
前提条件
已安装ack-node-problem-detector(NPD),且组件版本为1.2.24及以上。
0.17.0及以上版本的ack-nvidia-device-plugin与1.2.24及以上版本的NPD搭配使用时,当NPD检测到GPU异常时,将自动隔离GPU卡,当NPD检测到GPU恢复正常后,将自动解除GPU卡的隔离。
关于如何查看ack-nvidia-device-plugin组件版本以及升级组件,请参见查看NVIDIA Device Plugin版本。
ack-node-problem-detector(NPD)是ACK基于社区开源项目node-problem-detector改造和增强的集群节点异常事件监控组件,提供丰富的GPU异常检测项以增强GPU场景的异常发现能力。发现对应的异常时,组件会根据异常类型产生相应的Kubernetes Event或Kubernetes Node Condition。
注意事项
当检测到 GPU 异常时,ack-node-problem-detector 组件将按照默认隔离策略生成 NVIDIA GPU 隔离文件,ack-nvidia-device-plugin 组件将根据该文件内容自动隔离异常 GPU 卡,以避免新的负载调度到异常 GPU 后无法正常运行,其他正常的 GPU 可以继续提供服务。隔离异常 GPU 卡后,若节点上剩余 GPU 不足以满足任务需求(如 8 卡任务在仅有 7 卡可用时),任务将无法调度,可能导致 GPU 资源闲置。 自动隔离并不等于自动修复,发生 GPU 卡自动隔离的节点实例将持续计费,您仍需修复节点,建议配置 GPU 异常告警以便及时处理。
您也可以根据业务需求,关闭异常GPU自动隔离功能。详细操作步骤,请参考如何关闭NPD的异常GPU卡自动隔离能力。NVIDIA Device Plugin组件在特定版本支持异常GPU卡自动隔离,但关闭隔离能力操作方式不同。详细操作,请参见如何关闭NVIDIA Device Plugin原生GPU隔离能力。
NVIDIA的XID和SXID是GPU驱动通过NVRM事件机制写入
/var/log/messages或/var/log/syslog中。NPD会记录每个XID和SXID是否已被处理,如果在发现XID或SXID后,只要对节点进行重启操作,不管这条XID或SXID所对应的问题是否已被解决(例如XID 79指明需要更换GPU设备才能解决问题),NPD将不会对这条XID或SXID产生Event或Node Condition,即NPD认为这条XID已被解决。NPD检测NVIDIA XID或者NVIDIA SXID是通过检测节点
/var/log/messages文件或/var/log/syslog文件完成的。如果dmesg日志被重定向到其他文件,NPD将无法检测NVIDIA XID和SXID。从NPD 1.2.29版本开始,NPD中GPU异常检测插件将单独以DaemonSet方式部署,DaemonSet名称为ack-accel-health-monitor。
某些情况下,当节点出现GPU异常后,可能会导致节点上无法创建GPU容器,GPU异常检测容器可能受到影响,导致该容器无法创建,继而检测工作无法正常执行。
由于NPD GPU检测插件Pod需要检测GPU设备和GPU组件状态,需要开启
privileged=true等高权限,具体参考下表。集群RBAC权限
容器权限
Node: get
Node/Status: update
Events: create
privileged: true只读挂载宿主机
/dev/kmsg只读挂载宿主机
/usr/lib只读挂载宿主机
/etc只读挂载宿主机
/usr/lib64只读挂载宿主机
/proc
检测项及修复建议
发现GPU异常后,请参照Nvidia Xid Errors进行修复。也可根据节点实例类型(如ECS、灵骏)在对应云产品控制台查询是否存在节点实例的运维事件,或者通过自主诊断工具对节点硬件异常进行排查。
修复建议为None表示无需对硬件采取任何操作,建议自行检查应用配置是否正常。
检测项名称 | 是否产生Node Condition | 是否产生Event | 描述 | 是否默认隔离GPU卡 | 修复建议 |
NvidiaXID13Error | 否 | 是
|
| 否 | None |
NvidiaXID31Error | 否 | 是
|
| 否 | None |
NvidiaXID43Error | 否 | 是
|
| 否 | None |
NvidiaXID44Error | 是
| 是
|
| 是(NPD <= 1.2.28) | 重启节点。 |
NvidiaXID45Error | 否 | 是
|
| 否 | None |
NvidiaXID48Error | 是
| 是
|
| 是 | 重启节点。 |
NvidiaXID61Error | 是
| 是
|
| 是(NPD <= 1.2.28) | 重启节点。 |
NvidiaXID62Error | 是
| 是
|
| 是 | 重启节点。 |
NvidiaXID63Error | 否 | 是
|
| 否 | None |
NvidiaXID64Error | 否 | 是
|
| 否 | None |
NvidiaXID69Error | 是
| 是
|
| 是(NPD <= 1.2.28) | 重启节点。 |
NvidiaXID74Error | 是
| 是
|
| 是 | 硬件维修。 |
NvidiaXID79Error | 是
| 是
|
| 是 | 硬件维修。 |
NvidiaXID94Error | 否 | 是
|
| 否 | None |
NvidiaXID95Error | 是
| 是
|
| 是 | 重启节点。 |
NvidiaXID109Error | 是
| 是
|
| 是(NPD <= 1.2.28) | None |
NvidiaXID119Error | 是
| 是
|
| 是 | 重启节点。 |
NvidiaXID120Error | 是
| 是
|
| 是 | 重启节点。 |
NvidiaXID140Error | 是
| 是
|
| 是 | 重启节点。 |
NvidiaXID[code]Error | 否 | 是(仅产生三次事件)
| 未出现在该表中的其他XID。 | 否 | 提交工单。 |
NvidiaSXID[code]Error | 否 | 是(仅产生三次事件)
|
| 否 | None |
NvidiaEccModeNotEnabled | 是
| 是(持续产生事件,直到问题修复)
| 节点ECC Mode未开启。 | 否 | 开启ECC Mode并重启节点。 |
NvidiaPendingRetiredPages | 是
| 是(持续产生事件,直到问题修复)
|
| 是 | 重启节点。 |
NvidiaRemappingRowsFailed | 是
| 是(持续产生事件,直到问题修复)
| GPU存在行重映射失败。 | 是 | 硬件维修。 |
NvidiaRemappingRowsRequireReset | 是
| 是(持续产生事件,直到问题修复)
| GPU遇到了无法纠正的、未包含的错误,需要通过重置GPU进行恢复。为了恢复操作,应该尽快重置GPU。 | 是(NPD <= 1.2.28) | 重启节点。 |
NvidiaDeviceLost | 是
| 是(持续产生事件,直到问题修复)
|
| 是 | 硬件维修。 |
NvidiaInfoRomCorrupted | 是
| 是(持续产生事件,直到问题修复)
|
| 是 | 硬件维修。 |
NvidiaPowerCableErr | 是
| 是(持续产生事件,直到问题修复)
|
| 是 | 硬件维修。 |
NvidiaPersistencedOffline | 是
| 是
| Nvidia Persistenced服务未运行。 | 否 | 重启nvidia-persistenced服务。 |
NvidiaFabricManagerOffline | 是
| 是
| Nvidia Fabric Manager服务未运行。 | 否 | 重启Fabric Manager服务。 |
NvidiaTemperatureHigh | 是
| 是
| GPU温度过高超过100摄氏度。 | 否 | None |
NvidiaNVLinkStateErr | 是
| 是
| Nvidia NVLink状态变成down。 | 否 | 重启机器。 |
其他相关Event
独占GPU场景下,NPD默认会根据异常检测项自动进行GPU卡的隔离。隔离后,新的GPU应用Pod不会被分配至该GPU卡。您可查看Kubernetes Node上报的Resource中的nvidia.com/gpu数量以查看隔离效果。等待GPU卡恢复后,ACK会自动解除隔离。
触发原因 | Event内容 | 描述 |
GPU卡隔离 | 是
| GPU卡因检测出的异常被隔离。 |
GPU卡解除隔离 | 是
| GPU卡异常恢复,解除卡隔离。 |
常见问题
如何关闭NPD的异常GPU卡自动隔离能力?
问题背景
当节点 GPU 出现异常时,ACK 会通过NPD自动隔离异常GPU,防止任务被调度到异常GPU上。而自动隔离并不会执行自动修复,发生 GPU 卡自动隔离的节点实例将持续计费,您仍需手动重启或维修节点,并建议配置 GPU 异常告警以便及时处理。
隔离后,若节点剩余 GPU 不足以满足任务需求(如 8 卡任务在仅有 7 卡可用时),任务将无法调度,可能导致GPU资源闲置。
GPU状态恢复正常后,对该GPU设备的隔离会自动解除。
如需关闭自动隔离(出现异常GPU仍然上报资源,不做异常GPU隔离),请参考后续解决方案。
解决方案
当 ack-node-problem-detector组件版本为 v1.2.30 及以上时,支持通过组件管理中的配置项 generateNvidiaGpuIsolationFile 控制是否自动隔离异常 GPU。
关闭NPD的GPU自动隔离能力。
(推荐)方式一:通过组件管理修改组件配置。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。
在日志与监控页签,查找ack-node-problem-detector组件,然后根据当前组件版本执行对应操作。
1.2.24 至 1.2.29 版本:查看可升级到的版本,若可升级到1.2.30及以上版本,请单击升级。
1.2.30版本正在灰度中,若您看不到 v1.2.30 或更高版本,请提交工单申请。
1.2.30 及以上版本:请单击配置。
在组件升级或组件配置界面中,将
generateNvidiaGpuIsolationFile(是否产生NVIDIA GPU 隔离文件)设置为false,然后单击确认。说明若您此前通过方式二临时关闭了 GPU 自动隔离功能,在升级NPD组件版本时该关闭配置会自动保留。如果您在关闭后希望重新开启GPU卡自动隔离功能,可将
generateNvidiaGpuIsolationFile设置为true。
方式二:通过YAML手动修改配置。
说明以下关闭NPD的GPU自动隔离能力为临时方案,NPD升级到1.2.30以下版本后配置会丢失,您需在升级后按照以下步骤重新配置。建议您升级到1.2.30及以上版本以持久化该组件配置。
编辑NPD组件YAML。
kubectl edit ds -n kube-system ack-node-problem-detector-daemonset修改
EnabledIsolateGPU配置为false。修改前:
--EnabledIsolateGPU=true修改后:
--EnabledIsolateGPU=false
解除已经产生的GPU卡自动隔离。
针对已经产生的GPU卡自动隔离,可通过登录到发生XID错误的节点,删除
/etc/nvidia-device-plugin/unhealthyDevices.json文件,来解除该节点上的GPU隔离。为了避免再次被隔离,可以参考上一步操作关闭自动隔离功能。