From 59170b15c6b7e962d4005df86e12067bdc5c6cb8 Mon Sep 17 00:00:00 2001 From: joy Date: Mon, 28 Jul 2025 16:52:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20scripts/deploy=5Fgpu=5Fmon?= =?UTF-8?q?itor.sh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/deploy_gpu_monitor.sh | 142 +++++++++++++--------------------- 1 file changed, 52 insertions(+), 90 deletions(-) diff --git a/scripts/deploy_gpu_monitor.sh b/scripts/deploy_gpu_monitor.sh index db44f45..c62e692 100644 --- a/scripts/deploy_gpu_monitor.sh +++ b/scripts/deploy_gpu_monitor.sh @@ -1,102 +1,64 @@ #!/bin/bash -# 功能:监控 GPU 温度、功率、使用率、数量及在线状态(固定8卡:0~7) -# 路径:/usr/local/bin/gpu_monitor.sh -METRICS_FILE="/var/lib/node_exporter/textfile_collector/gpu_metrics.prom" -mkdir -p "$(dirname "${METRICS_FILE}")" +# 脚本部署工具 - 下载并配置GPU监控脚本 +set -euo pipefail +IFS=$'\n\t' -# 预期的8张GPU编号 -EXPECTED_GPUS="0 1 2 3 4 5 6 7" +# 配置信息 +SCRIPT_URL="http://116.205.97.109/scripts/gpu_metrics.sh" # 脚本下载地址 +TARGET_DIR="/opt/scripts" # 脚本存放目录 +TARGET_SCRIPT="${TARGET_DIR}/gpu_monitor.sh" # 目标脚本路径 +CRON_SCHEDULE="*/2 * * * *" # 定时任务执行频率 +LOG_FILE="/var/log/gpu_monitor.log" # 日志文件路径 -# 临时文件存储当前检测到的 GPU 编号和使用率 -TMP_GPU_IDS=$(mktemp) -TMP_GPU_UTIL=$(mktemp) +# 创建目标目录 +mkdir -p "${TARGET_DIR}" +cd "${TARGET_DIR}" -# 1. 收集所有在线 GPU 基础指标,并记录在线编号和使用率 -{ - echo "# HELP gpu_temperature GPU 核心温度 (℃)" - echo "# TYPE gpu_temperature gauge" - - echo "# HELP gpu_power_limit GPU 额定功率(最大功率限制,W)" - echo "# TYPE gpu_power_limit gauge" - - echo "# HELP gpu_power_current GPU 当前功率(实时功耗,W)" - echo "# TYPE gpu_power_current gauge" - - echo "# HELP gpu_utilization GPU 计算核心使用率 (%)" - echo "# TYPE gpu_utilization gauge" +# 下载脚本 +echo "正在下载GPU监控脚本..." +wget -q -O "${TARGET_SCRIPT}" "${SCRIPT_URL}" || { + echo "错误: 无法从 ${SCRIPT_URL} 下载脚本" >&2 + exit 1 +} - # GPU 在线状态(1=在线,0=离线) - echo "# HELP gpu_online GPU 在线状态(1=在线,0=离线)" - echo "# TYPE gpu_online gauge" +# 赋予执行权限 +chmod +x "${TARGET_SCRIPT}" - # 聚合指标:所有 GPU 的平均使用率 - echo "# HELP gpu_utilization_avg 所有 GPU 的平均使用率 (%)" - echo "# TYPE gpu_utilization_avg gauge" - - # 聚合指标:所有 GPU 的总使用率 (%) - echo "# HELP gpu_utilization_total 所有 GPU 的总使用率 (%)" - echo "# TYPE gpu_utilization_total gauge" +# 修改脚本内容(示例:将GPU总数设置为8) +echo "正在修改脚本配置..." +sed -i 's/BASELINE_GPUS=".*"/BASELINE_GPUS="0 1 2 3 4 5 6 7"/' "${TARGET_SCRIPT}" - # 收集单块 GPU 指标 - total_util=0 # 初始化总使用率 - online_count=0 # 初始化在线 GPU 数量 - - nvidia-smi --query-gpu=index,power.limit,power.draw,temperature.gpu,utilization.gpu \ - --format=csv,noheader,nounits | while IFS=',' read -r idx limit current temp util; do - idx=$(echo "${idx}" | xargs) - limit=$(echo "${limit}" | xargs) - current=$(echo "${current}" | xargs) - temp=$(echo "${temp}" | xargs) - util=$(echo "${util}" | xargs) - - # 输出单块 GPU 指标 - echo "gpu_temperature{gpu=\"${idx}\"} ${temp}" - echo "gpu_power_limit{gpu=\"${idx}\"} ${limit}" - echo "gpu_power_current{gpu=\"${idx}\"} ${current}" - echo "gpu_utilization{gpu=\"${idx}\"} ${util}" - echo "gpu_online{gpu=\"${idx}\"} 1" # 标记为在线 - - # 记录在线 GPU 编号和使用率 - echo "${idx}" >> "${TMP_GPU_IDS}" - echo "${util}" >> "${TMP_GPU_UTIL}" - - # 累加总使用率 - ((total_util += util)) - ((online_count++)) - done +# 确保metrics文件目录存在 +METRICS_DIR="/var/lib/node_exporter/textfile_collector" +mkdir -p "${METRICS_DIR}" +chmod 755 "${METRICS_DIR}" - # 2. 计算当前在线 GPU 总数 - echo "# HELP gpu_total 在线 GPU 总数" - echo "# TYPE gpu_total gauge" - gpu_count=$(wc -l < "${TMP_GPU_IDS}" | xargs) - echo "gpu_total ${gpu_count}" +# 添加定时任务到crontab +echo "正在配置定时任务..." +( + crontab -l 2>/dev/null || true # 获取现有crontab(如果有) + echo "${CRON_SCHEDULE} ${TARGET_SCRIPT} >> ${LOG_FILE} 2>&1" # 添加新任务 +) | crontab - - # 3. 计算并输出聚合使用率指标 - if [ "${online_count}" -gt 0 ]; then - # 平均使用率 = 总使用率 / 在线 GPU 数量 - avg_util=$(echo "scale=2; ${total_util} / ${online_count}" | bc) - echo "gpu_utilization_avg ${avg_util}" - - # 总使用率(所有 GPU 使用率之和) - echo "gpu_utilization_total ${total_util}" - else - # 无在线 GPU 时设为 0 - echo "gpu_utilization_avg 0" - echo "gpu_utilization_total 0" - fi +# 验证定时任务 +echo "验证定时任务配置:" +crontab -l | grep "${TARGET_SCRIPT}" || { + echo "错误: 定时任务添加失败" >&2 + exit 1 +} - # 4. 标记离线的 GPU - for expected_gpu in ${EXPECTED_GPUS}; do - if ! grep -q "^${expected_gpu}$" "${TMP_GPU_IDS}"; then - echo "gpu_online{gpu=\"${expected_gpu}\"} 0" # 标记为离线 - echo "gpu_temperature{gpu=\"${expected_gpu}\"} 0" - echo "gpu_power_limit{gpu=\"${expected_gpu}\"} 0" - echo "gpu_power_current{gpu=\"${expected_gpu}\"} 0" - echo "gpu_utilization{gpu=\"${expected_gpu}\"} 0" - fi - done -} > "${METRICS_FILE}" +# 首次执行脚本 +echo "执行脚本进行测试..." +"${TARGET_SCRIPT}" || { + echo "错误: 脚本首次执行失败,请检查 ${LOG_FILE}" >&2 + exit 1 +} -# 清理临时文件 -rm -f "${TMP_GPU_IDS}" "${TMP_GPU_UTIL}" +echo "=====================================================" +echo "GPU监控脚本已成功部署!" +echo "脚本位置: ${TARGET_SCRIPT}" +echo "定时任务: ${CRON_SCHEDULE}" +echo "日志文件: ${LOG_FILE}" +echo "指标文件: ${METRICS_DIR}/gpu_metrics.prom" +echo "====================================================="