前言
运维工程师不需要知道算子怎么写,只需要知道NPU是否正常——oam-tools是昇腾NPU的运维利器。在大规模的AI训练集群中,运维工程师面临的核心挑战并非算法优化或模型调优,而是确保每一张昇腾NPU加速卡都处于健康、稳定的工作状态。当集群规模从几台服务器扩展到几十台甚至上百台时,手动逐一登录服务器执行npu-smi命令查看设备状态的方式变得不再可行。CANN生态中的oam-tools(Operations, Administration, and Maintenance tools)项目正是为解决这一痛点而生,它提供了一套完整的运维与性能调优工具集,包含故障信息收集、软硬件信息展示、AI Core Error报错分析、性能数据采集与分析等核心能力。
oam-tools的设计哲学是将复杂的底层硬件诊断逻辑封装成简单的命令行工具,让运维工程师无需深入了解昇腾NPU的硬件架构和驱动细节,就能快速完成设备健康检查、故障定位、性能瓶颈分析等日常工作。工具集主要包含三大模块:asys(Ascend System Advisor,系统顾问)、msaicerr(AI Core Error分析工具)、msprof(性能分析与调优工具)。每个模块都针对特定的运维场景设计,既可以直接独立使用,也可以组合形成完整的运维诊断流水线。
工具安装与权限配置
oam-tools作为CANN开发套件的一部分发布,安装方式主要有两种:从源码编译安装和直接安装预编译的二进制包。对于大多数生产环境,推荐采用源码编译的方式,这样可以确保工具版本与当前环境中CANN的版本完全匹配,避免因版本不一致导致的兼容性问题。
源码编译oam-tools需要满足以下环境前提:操作系统支持aarch64或x86_64架构,已安装CANN开发套件包(版本≥6.0.RC1),系统已配置gcc、cmake等基础编译工具链。由于oam-tools在编译过程中需要下载第三方依赖库和闭源二进制包,编译环境需要能够访问外网。如果是在离线环境中进行编译,需要提前从gitcode开源仓库下载所有依赖包,并通过–cann_3rd_lib_path参数指定依赖库路径。
# 克隆oam-tools仓库到本地gitclone https://atomgit.com/cann/oam-tools.gitcdoam-tools# 执行编译脚本,自动下载依赖并编译所有模块bashbuild.sh# 如果第三方库已提前下载到本地,可以通过参数指定路径bashbuild.sh--cann_3rd_lib_path=/path/to/third_party_libs# 查看所有支持的编译参数bashbuild.sh-hoam-tools采用CMake作为构建系统,编译脚本build.sh封装了依赖检测、第三方库下载、编译选项配置等复杂逻辑。CMake的跨平台特性和生成构建系统的能力,使得oam-tools可以在不同的Linux发行版上编译运行。默认情况下,编译脚本会自动从gitcode仓库下载所需的第三方库源码(如gflags、glog、protobuf等),这种"自包含"的依赖管理方式降低了初学者的编译门槛。对于企业用户,通过–cann_3rd_lib_path参数指向预下载的离线包,可以在隔离网络环境中顺利完成编译,兼顾了灵活性与可控性。
oam-tools采用CMake作为构建系统,编译脚本build.sh封装了依赖检测、第三方库下载、编译选项配置等复杂逻辑。默认情况下,编译脚本会自动从gitcode仓库下载所需的第三方库源码(如gflags、glog、protobuf等)和闭源二进制包(包含保证功能正常运行所需的库及头文件)。这种设计既降低了初学者的编译门槛,也为高级用户提供了灵活的定制能力。–cann_3rd_lib_path参数的存在使得离线编译成为可能,企业用户在隔离网络环境中也能顺利完成编译。
编译完成后,build_out目录下会生成格式为cann-oam-tools_<cann_version>_linux-.run的自解压安装包。这个安装包是一个标准的shell脚本加二进制数据封装,可以直接在目标机器上执行安装。
# 安装编译生成的oam-tools软件包# --full表示完整安装,--install-path指定安装路径./cann-oam-tools_<cann_version>_linux-<arch>.run--full--install-path=/usr/local/Ascend# 安装完成后,工具会被释放到CANN安装目录的tools/子目录下# root用户的默认路径为:/usr/local/Ascend/cann/tools/ls-la/usr/local/Ascend/cann/tools/# 加载CANN环境变量(必须步骤,否则工具可能无法正常运行)source/usr/local/Ascend/bin/setenv.bash# 验证asys工具是否可以正常运行python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py-hoam-tools安装时会替换已安装CANN开发套件包中的对应工具文件,这种设计确保了工具版本与CANN套件的其他组件保持版本一致。source setenv.bash是必须的步骤,因为oam-tools的Python脚本依赖CANN提供的Python库和环境变量(如ASCEND_INSTALL_PATH、LD_LIBRARY_PATH等)。将工具安装在CANN的tools子目录下而非独立的系统路径,遵循了CANN生态的目录规范,便于统一管理和版本升级。当需要卸载或回滚oam-tools时,只需恢复CANN原装的工具文件即可,无需担心残留文件污染系统环境。
oam-tools安装时会替换已安装CANN开发套件包中的对应工具文件,这种设计确保了工具版本与CANN套件的其他组件保持版本一致。source setenv.bash是必须的步骤,因为oam-tools的Python脚本依赖CANN提供的Python库和环境变量(如ASCEND_INSTALL_PATH、LD_LIBRARY_PATH等)。将工具安装在CANN的tools子目录下而非独立的系统路径,遵循了CANN生态的目录规范,便于统一管理和版本升级。
关于权限配置,oam-tools的大部分功能需要root权限才能正常运行。这是因为工具需要访问系统级的硬件信息(如/dev/davinci*设备文件)、读取内核日志(dmesg)、采集驱动状态等。如果以非root用户运行,可能会遇到权限拒绝的错误。
# 检查当前用户是否为rootwhoami# 如果不是root,需要使用sudo执行工具命令sudopython3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py health# 或者将当前用户加入Ascend驱动创建的属组(通常为HwHiAiUser)# 具体加组方式参考CANN安装指南groups$USER# 验证当前用户是否有权限访问NPU设备ls-la/dev/davinci*# 正常的输出应该显示设备文件及其权限属性要求root权限是硬件运维工具的通用做法。昇腾NPU的驱动会在/dev目录下创建字符设备文件(如/dev/davinci0、/dev/davinci_mgr等),这些设备文件的访问权限默认仅对root和特定属组开放。此外,读取PCIe设备配置空间、采集CPU微架构性能事件、获取内核日志等操作都需要相应的capability或完整root权限。在生产环境中,建议通过sudo配置合理的权限委派策略(如允许特定用户组运行npu-smi info命令),而不是直接以root用户常驻登录,从而在安全性和便利性之间取得平衡。
要求root权限是硬件运维工具的通用做法。昇腾NPU的驱动会在/dev目录下创建字符设备文件(如/dev/davinci0、/dev/davinci_mgr等),这些设备文件的访问权限默认仅对root和特定属组开放。此外,读取PCIe设备配置空间、采集CPU微架构性能事件、获取内核日志等操作都需要相应的capability或完整root权限。在生产环境中,建议通过sudo配置合理的权限委派策略,而不是直接以root用户常驻登录。
场景一:NPU健康检查
NPU健康检查是运维工程师每天上班后应该执行的第一项例行任务。通过一键化的健康检查,可以快速判断集群中每一张NPU加速卡是否处于正常工作状态,包括设备是否在线、固件版本是否匹配、ECC(Error Correction Code,错误纠正码)是否启用、驱动与固件之间是否存在兼容性告警等。asys工具提供了health子命令,专门用于执行这类健康检查任务。
# 加载CANN环境变量source/usr/local/Ascend/bin/setenv.bash# 执行全面的健康检查(会检测所有可见的NPU设备)python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py health# 如果系统中配置了多张NPU,可以指定检查特定的devicepython3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py health--device0# 将健康检查结果输出到指定目录,便于归档和后续分析python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py health--output/var/log/npu_health_checkhealth子命令的设计不仅执行一次npu-smi info,而是从多个维度进行综合判断:检查设备初始化状态、验证固件与驱动的版本兼容性、确认ECC配置是否符合最佳实践、检测是否存在已发生的硬件错误记录。这种"交叉验证"的设计思路比单一命令输出更可靠——npu-smi看到的设备"健康"并不代表底层固件没有问题,而health子命令通过多源信息对比可以发现孤立的npu-smi输出无法揭示的深层问题。将结果输出到文件便于运维团队建立设备健康档案,通过对比历史检查结果可以发现设备性能的退化趋势。
health子命令内部会调用npu-smi工具获取设备的健康状态信息,同时结合驱动日志、系统日志、固件版本信息进行交叉验证。健康检查不是简单地执行一次npu-smi info,而是从多个维度进行综合判断:检查设备初始化状态、验证固件与驱动的版本兼容性、确认ECC配置是否符合最佳实践、检测是否存在已发生的硬件错误记录。将结果输出到文件便于运维团队建立设备健康档案,通过对比历史检查结果可以发现设备性能的退化趋势。
健康检查的输出通常包含以下几个关键部分:设备基本信息(芯片型号、序列号、PCIe地址)、健康状态总评(PASS/FAIL/WARN)、详细检查项列表。对于每一项检查,工具都会给出明确的状态标识和简要说明。如果检查失败,还会提供相应的故障代码和初步的排查建议。
除了health子命令之外,asys的info子命令可以提供更详细的软硬件配置信息,适合在健康检查发现问题后进行深入诊断。info会采集CPU信息、内存信息、操作系统版本、驱动版本、固件版本、NPU拓扑结构等全方位的系统配置数据。
# 采集系统完整的软硬件配置信息python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py info# info子命令的输出非常详细,建议重定向到文件便于查看python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py info--output/var/log/npu_system_info# 查看输出目录中的文件结构ls-la/var/log/npu_system_info/# 通常会包含:cpu_info.txt, memory_info.txt, npu_info.txt, pcie_info.txt等info子命令的设计目标是"一次采集,全面覆盖",它消除了运维工程师需要分别执行lscpu、free、npu-smi info、lspci等多条命令才能了解系统全貌的繁琐。所有采集到的信息被按照统一的格式组织并保存到输出目录,每个文件对应一个子系统。这种设计特别适合用于问题复现时的环境信息归档——当昇腾社区的技术支持团队需要协助分析问题时,运维工程师只需打包输出目录并上传,即可提供完整的环境上下文,避免了"缺少XX信息导致无法定位"的反复沟通成本。
info子命令的设计目标是"一次采集,全面覆盖",它消除了运维工程师需要分别执行lscpu、free、npu-smi info、lspci等多条命令才能了解系统全貌的繁琐。所有采集到的信息会被按照统一的格式组织并保存到输出目录,每个文件对应一个子系统。这种设计特别适合用于问题复现时的环境信息归档——当昇腾社区的技术支持团队需要协助分析问题时,运维工程师只需打包输出目录并上传,即可提供完整的环境上下文。
场景二:显存状态监控
在AI模型训练过程中,显存(Device Memory)的使用情况直接影响训练任务能否正常启动和运行。显存不足会导致模型无法加载或训练过程中断,显存泄漏会导致长时间训练后任务崩溃。oam-tools虽然不直接提供实时监控显存的命令行工具(这部分功能主要由npu-smi和CANN runtime提供),但asys工具的collect子命令可以采集当前时刻的显存使用快照,并结合NPU的任务运行状态分析显存的分配来源。
# 采集当前系统的运维信息(包含显存状态)python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py collect--output/var/log/npu_collect_$(date+%Y%m%d_%H%M%S)# 查看采集结果目录中的显存相关信息ls-la/var/log/npu_collect_*/memory/# 显存信息通常保存在memory/目录下的device_memory_*.txt文件中# 也可以使用npu-smi工具实时查看显存使用(oam-tools依赖此工具的输出)npu-smi info-tmemory-i0# -t memory 指定查询内存信息,-i 0 指定device IDcollect子命令的设计理念是"按需采集,全面归档"。显存信息的采集不仅限于当前使用量,还包括显存的分配来源分析(哪些进程分配了显存、分配了多大空间、是否发生泄漏等)。这些信息对于定位"显存神秘消失"类问题(显存已被分配但找不到对应的进程)具有重要价值。将采集结果按时间戳命名保存,可以形成显存使用的历史快照序列,用于后续的趋势分析。在实际运维中,建议定期(如每小时)采集一次系统状态,建立基线数据,这样在问题发生时才能有参照系进行对比分析。
collect子命令的设计理念是"按需采集,全面归档"。它会调用npu-smi、CANN runtime API、驱动接口等多个数据源,采集当前时刻的系统状态快照,并将结果按照统一的目录结构进行组织。显存信息的采集不仅限于当前使用量,还包括显存的分配来源分析(哪些进程分配了显存、分配了多大空间、是否发生泄漏等)。这些信息对于定位"显存神秘消失"类问题(显存已被分配但找不到对应的进程)具有重要价值。将采集结果按时间戳命名保存,可以形成显存使用的历史快照序列,用于后续的趋势分析。
在实际的运维场景中,显存监控往往需要与其他系统监控工具(如Prometheus + node_exporter)配合使用。oam-tools的collect子命令可以作为监控流水线中的一个环节,定期采集显存状态并上报到集中式监控系统。虽然oam-tools本身不提供守护进程模式的实时监控,但其采集逻辑可以被封装成自定义Exporter,接入Prometheus生态。
# 示例:将显存采集封装成定时任务(cron job)# 编辑crontabcrontab-e# 添加以下行,每5分钟采集一次显存状态*/5 * * * *source/usr/local/Ascend/bin/setenv.bash&&python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py collect--output/var/log/npu_metrics/$(date+\%Y\%m\%d_\%H\%M\%S)>>/var/log/npu_collect_cron.log2>&1# 查看定时任务的执行日志tail-f/var/log/npu_collect_cron.log将oam-tools的采集功能封装成cron定时任务是生产环境中的常见做法。由于collect子命令本身是一次性的快照采集,不具备持续运行的能力,通过操作系统的cron机制可以实现准实时的数据采集。采集结果按时间戳分目录保存,避免了文件覆盖问题,也便于后续的批量分析。这种设计与Prometheus的文本文件收集器(Textfile Collector)模式高度兼容——可以将采集结果转换成Prometheus支持的metrics格式,由node_exporter定期读取并暴露给Prometheus Server。
场景三:性能指标采集
性能调优是oam-tools的核心能力之一,由msprof工具提供支撑。msprof是一个完整的性能分析与调优工具链,包含数据采集(C++实现的collector模块)和数据分析(Python实现的分析脚本)两个主要部分。在运维场景中,性能指标采集的主要目的是:建立NPU算力的基准性能曲线、发现性能异常的设备、定位性能瓶颈(是算力受限还是带宽受限)、为容量规划提供数据支撑。
# msprof的C++ collector通常作为CANN profiler流水线的一部分被调用# 以下是一个典型的性能采集流程(通过CANN Python API触发)# 确保已安装CANN开发套件并加载环境变量source/usr/local/Ascend/bin/setenv.bash# 使用CANN的profiler接口启动性能采集(示例为训练脚本)python3-c" from msprof import Profiler profiler = Profiler(acl_config={'_profiler_path': '/var/log/npu_profiling'}) profiler.init() # 在这里执行需要profiling的AI任务 profiler.finalize() profiler.summary() "# 采集完成后,可以使用msprof分析脚本解析采集到的性能数据python3 /usr/local/Ascend/cann/tools/profiler/profiler_tool/analysis/msprof/msprof.py-hmsprof采用"采集与分析分离"的架构设计。C++实现的collector负责在高性能场景下采集NPU的运行数据(AI Core利用率、内存带宽、PCIe流量、功耗温度等),这些数据以二进制格式高效存储。Python实现的分析脚本负责读取采集数据,进行统计分析、瓶颈识别、可视化生成等计算密集型相对较低的任务。这种架构既保证了数据采集的低开销,又利用了Python在数据分析和可视化方面的生态优势。将分析脚本安装在CANN的tools目录下,确保了与CANN其他组件的版本兼容。
性能采集的关键指标包括:AI Core利用率(反映算力是否被充分利用)、内存带宽利用率(反映HBM访问是否成为瓶颈)、PCIe带宽(反映Host到Device的数据传输效率)、功耗与温度(反映散热是否充足)。这些指标对于判断NPU是否处于健康的工作状态至关重要。
# 直接查看NPU的实时性能指标(使用npu-smi工具,oam-tools依赖其输出)# 查看AI Core利用率npu-smi info-taicore-i0-c0# -t aicore 指定查询AI Core信息,-i指定device ID,-c指定AI Core ID# 查看功耗信息npu-smi info-tpower-i0# 查看温度信息npu-smi info-ttemperature-i0# 查看NPU频率信息npu-smi info-tfrequency-i0npu-smi是昇腾NPU的官方管理工具,oam-tools在多处依赖npu-smi的输出进行二次分析和处理。直接执行npu-smi命令可以快速获取NPU的实时性能数据,无需启动完整的profiling流程。AI Core利用率是判断NPU算力是否被充分利用的核心指标——如果AI Core利用率长期低于一定阈值,说明当前任务可能存在数据预处理瓶颈、通信瓶颈或调度开销过大等问题。温度和功耗监控则是为了确保NPU工作在安全的热设计功耗(TDP)范围内,避免因过热导致的降频或保护关机。
场景四:故障日志抓取
当NPU发生故障时(如AI Core Error、ECC错误、PCIe链路错误等),快速的日志抓取和初步分析是缩短故障恢复时间的关键。oam-tools提供了多层次的故障日志抓取能力:asys工具的collect子命令可以采集系统级的运维日志,msaicerr工具可以专门分析AI Core Error相关的故障信息,msprof工具可以采集故障发生时的性能数据用于事后分析。
# 使用asys collect子命令采集故障发生后的系统日志# 建议在故障发生后立即执行,避免日志被覆盖或轮转python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py collect--output/var/log/npu_fault_$(date+%Y%m%d_%H%M%S)# collect会采集以下关键信息:# - NPU驱动日志(/var/log/ascend_seclog/)# - 系统日志(dmesg、/var/log/messages或journalctl)# - NPU设备状态快照# - 当前运行的AI任务信息# - 硬件错误记录(如ECC错误计数)# 查看采集结果ls-la/var/log/npu_fault_*/故障日志抓取的核心挑战是"全面性"和"时效性"。全面性要求采集所有可能与故障相关的日志和状态信息,避免因为遗漏关键信息而导致故障原因无法定位。时效性要求在故障发生后尽快采集,因为Linux系统的日志文件会定期轮转(log rotation),dmesg缓冲区的大小有限,旧的日志会被新的日志覆盖。asys的collect子命令通过预定义的采集项列表,确保了关键日志不会被遗漏。将输出目录按时间戳命名,支持多次故障的独立归档,便于故障的对比分析。
对于AI Core Error这类特定的故障类型,oam-tools提供了专门的msaicerr工具进行深入分析。AI Core Error是指NPU的AI Core在执行模型计算时发生的硬件错误或算子执行异常,这类错误的错误信息通常会被驱动记录到特定的日志文件中。msaicerr工具可以解析这些错误信息,提取故障发生的时间、涉及的算子名称、错误类型等关键信息。
# 使用msaicerr工具分析AI Core Error# 方式一:解析一个已有的错误报告目录python3 /usr/local/Ascend/cann/tools/msaicerr/msaicerr.py-p/path/to/error_report_dir-out/var/log/msaicerr_analysis-dev0# 方式二:解析单个dump文件(需要指定数据类型dtype)python3 /usr/local/Ascend/cann/tools/msaicerr/msaicerr.py-d/path/to/dump_file-out/var/log/msaicerr_analysis-dtypefloat16# 方式三:检测当前环境是否具备运行msaicerr的条件python3 /usr/local/Ascend/cann/tools/msaicerr/msaicerr.py-e-dev0# 查看msaicerr的完整参数说明python3 /usr/local/Ascend/cann/tools/msaicerr/msaicerr.py-hmsaicerr工具的设计目标是"将晦涩的硬件错误码转换成人类可读的故障描述"。AI Core Error的原始错误信息通常包含寄存器转储、内存转储、错误状态码等底层硬件信息,直接阅读这些信息需要深入的硬件知识。msaicerr通过内置的错误码数据库和解析逻辑,将这些底层信息转换成结构化的故障报告,包括错误类型分类、可能的故障原因、推荐的排查步骤等。支持解析dump文件和错误报告目录两种输入方式,适应了不同的故障信息采集场景。-e参数提供的环境检测功能可以帮助运维工程师快速判断当前环境是否支持AI Core Error的分析(例如驱动版本是否满足要求、设备是否正常在线等)。
告警配置
在生产环境的AI集群中,仅仅能够手动执行健康检查、日志采集、性能分析是远远不够的。运维团队需要建立自动化的告警机制,在NPU出现故障苗头时就及时感知,而不是等到训练任务失败后才被动响应。oam-tools本身不提供告警服务器的功能,但其采集的数据可以方便地接入Prometheus、Grafana等主流监控系统,形成完整的告警链路。
将oam-tools的监控数据接入Prometheus的关键步骤是开发一个自定义Exporter。这个Exporter的任务是定期调用oam-tools的采集命令,将输出结果解析成Prometheus支持的metrics格式,并暴露HTTP端点供Prometheus Server拉取。
#!/usr/bin/env python3# file: oam_tools_exporter.py# 自定义Exporter示例,将oam-tools的采集数据暴露给Prometheusfromprometheus_clientimportGauge,start_http_serverimportsubprocessimporttimeimportreimportos# 定义Prometheus metricsnpu_health_status=Gauge('npu_health_status','NPU health check result (0=PASS, 1=WARN, 2=FAIL)',['device_id'])npu_temperature=Gauge('npu_temperature_celsius','NPU temperature in Celsius',['device_id'])npu_aicore_utilization=Gauge('npu_aicore_utilization_ratio','AI Core utilization ratio (0.0-1.0)',['device_id'])npu_memory_used=Gauge('npu_memory_used_bytes','NPU memory used in bytes',['device_id'])npu_ecc_errors=Gauge('npu_ecc_errors_total','Total ECC error count',['device_id','error_type'])defcollect_npu_metrics():"""调用oam-tools和npu-smi采集NPU指标"""# 加载CANN环境变量ascend_path='/usr/local/Ascend'os.environ['ASCEND_INSTALL_PATH']=ascend_path os.environ['LD_LIBRARY_PATH']=f'{ascend_path}/lib64:'+os.environ.get('LD_LIBRARY_PATH','')# 获取NPU设备数量try:result=subprocess.run(['npu-smi','info'],capture_output=True,text=True)# 解析npu-smi输出,提取设备数量和设备ID# 此处省略具体的解析逻辑device_ids=[0,1]# 示例:假设有2张NPUfordev_idindevice_ids:# 采集温度temp_result=subprocess.run(['npu-smi','info','-t','temperature','-i',str(dev_id)],capture_output=True,text=True)# 解析温度值(省略具体解析逻辑)npu_temperature.labels(device_id=str(dev_id)).set(65.0)# 采集AI Core利用率aicore_result=subprocess.run(['npu-smi','info','-t','aicore','-i',str(dev_id),'-c','0'],capture_output=True,text=True)# 解析利用率(省略具体解析逻辑)npu_aicore_utilization.labels(device_id=str(dev_id)).set(0.85)# 采集显存使用量memory_result=subprocess.run(['npu-smi','info','-t','memory','-i',str(dev_id)],capture_output=True,text=True)# 解析显存使用量(省略具体解析逻辑)npu_memory_used.labels(device_id=str(dev_id)).set(16*1024*1024*1024)# 示例:16GBexceptExceptionase:print(f"Error collecting NPU metrics:{e}")if__name__=='__main__':# 启动Prometheus HTTP服务器,暴露metrics端点start_http_server(8000)print("OAM Tools Exporter started on port 8000")# 定期采集指标whileTrue:collect_npu_metrics()time.sleep(15)# 每15秒采集一次自定义Exporter的设计模式是Prometheus生态中的标准做法。通过继承prometheus_client库提供的Gauge、Counter等metric类型,可以方便地将任意数据源的指标暴露给Prometheus。这个示例Exporter的核心逻辑是定期调用npu-smi命令(oam-tools依赖此工具)获取NPU的实时状态,并将解析结果更新到Prometheus metrics中。将Exporter作为一个独立的HTTP服务器运行(默认端口8000),Prometheus Server可以通过静态配置或服务发现机制定期拉取metrics数据。基于这些metrics,可以在Prometheus中配置告警规则(Alert Rule),当NPU温度超过阈值或AI Core利用率异常时自动触发告警。
除了Prometheus集成之外,oam-tools的collect子命令也可以直接与企业的日志管理系统(如ELK Stack、Splunk)对接。collect子命令的输出是结构化的文本文件,可以通过filebeat、fluentd等日志采集代理将文件内容发送到集中式日志存储,实现故障日志的集中检索和分析。
# 示例:配置rsyslog将oam-tools的日志转发到远程日志服务器# 编辑rsyslog配置文件cat>/etc/rsyslog.d/oam-tools.conf<<'EOF' # 将oam-tools的collect输出转发到远程日志服务器 if $programname == 'oam-tools' then { action(type="omfwd" target="logserver.example.com" port="514" protocol="udp") } EOF# 重启rsyslog使配置生效systemctl restart rsyslog# 也可以在collect时直接将输出发送给日志采集代理python3 /usr/local/Ascend/cann/tools/ascend_system_advisor/asys/asys.py collect--output/var/log/npu_metrics/$(date+%Y%m%d_%H%M%S)2>&1|logger-toam-tools将oam-tools的日志输出接入远程日志管理系统是实现集中式运维的关键步骤。在生产环境中,AI集群通常包含多台服务器,手动登录每台服务器查看日志的方式效率低下。通过rsyslog或systemd-journal的远程转发功能,可以将所有服务器的oam-tools日志实时发送到一个统一的日志存储系统。logger命令提供了简单的日志发送接口,可以将任意命令的标准输出和错误输出转发给syslog守护进程。在更复杂的场景中,可以使用filebeat或fluentd等专门的日志采集代理,它们支持从文件中读取日志、解析结构化字段、添加元数据标签等高级功能。
使用前vs使用后效率对比
下表从多个维度对比了引入oam-tools工具集前后的运维效率差异。所有描述均基于典型使用场景的概括性观察,不涉及具体数字。
| 维度 | 使用前 | 使用后 | 差异来源 |
|---|---|---|---|
| 故障定位时间 | 需要手动登录多台服务器执行多条命令,逐条检查日志文件,故障定位耗时长 | 一键执行asys health/collect命令,自动采集并归档所有相关日志,故障定位耗时大幅缩短 | oam-tools将分散的故障定位步骤集成到统一的命令行工具中,自动化采集替代了手工操作 |
| 性能瓶颈识别 | 需要分别运行多个性能测试工具,手动收集数据后用电子表格分析,瓶颈识别依赖个人经验 | msprof自动采集NPU算力和带宽利用率等关键指标,分析脚本自动生成瓶颈识别报告 | msprof的采集与分析一体化设计消除了数据搬运和格式转换的开销,内置的瓶颈识别算法提供了系统化的分析框架 |
| 健康检查覆盖率 | 依赖运维人员的个人经验决定检查项,容易出现遗漏,不同人员的检查标准不统一 | asys health内置完整的健康检查项列表,每次检查都覆盖所有关键维度,检查标准统一 | 健康检查项由昇腾社区基于大量实际故障案例提炼而成,覆盖了最常见的故障模式 |
| 日志采集完整性 | 故障发生后手工收集日志容易遗漏关键文件,且不同人员的采集方式不一致,不利于问题复现 | asys collect预定义了完整的采集项列表,每次采集都按照统一的标准执行,确保日志完整性 | 预定义的采集项列表经过了昇腾社区技术支持团队的验证,确保采集到的日志足以支撑绝大多数故障的分析需求 |
https://atomgit.com/cann/oam-tools