当前位置: 首页 > article >正文

使用飞书群机器人监控服务器GPU使用率

目标:如果服务器GPU空置,可以及时推送消息到飞书群。

其他类似的监控目标也可以修改代码实现。

步骤:

(1) 首先在群聊设置加入机器人,复制webhook_url

(2) 在服务器后台运行如下代码。注意替换webhook_url

"""
nohup python monitor_gpu.py my_server > monitor_gpu.log 2>&1 &
"""
import sys
import subprocess
import requests
import time
from datetime import datetime

import logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)


# 飞书机器人 webhook 地址
feishu_webhook_url = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxx"
if len(sys.argv) < 2:
    logger.error(f"Usage: python {__file__} <machine_id>")
    sys.exit(1)
machine_id = sys.argv[1]

def check_gpu_usage(util_threshold=10):
    # 执行 nvidia-smi 命令获取显卡使用情况
    result = subprocess.run(['nvidia-smi', '--query-gpu=utilization.gpu,memory.used,memory.total', '--format=csv,noheader,nounits'], stdout=subprocess.PIPE)
    output = result.stdout.decode('utf-8').strip()

    # 解析输出
    utils = []
    mems = []
    for info in output.split('\n'):
        if info:
            gpu_utilization, memory_used, memory_total = map(int, info.split(', '))
            utils.append(gpu_utilization)
            mems.append(memory_used)
    gpu_utilization_avg = sum(utils) / len(utils)
    memory_used_avg = sum(mems) / len(mems)

    # 判断是否空闲(假设利用率小于10%为空闲)
    if gpu_utilization_avg < util_threshold:
        return True, f"⚠️ {machine_id} GPU空闲:平均利用率 {gpu_utilization_avg}% 显存 {memory_used_avg/1000} GB"
    return False, f"✅ {machine_id} GPUs are in usage."

def send_feishu_message(message):
    headers = {
        "Content-Type": "application/json"
    }
    data = {
        "timestamp": int(datetime.now().timestamp()),
        "msg_type": "text",
        "content": {
            "text": message
        }
    }
    t = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    response = requests.post(feishu_webhook_url, json=data, headers=headers)
    response.raise_for_status()
    result = response.json()
    if result.get("code") and result.get("code") != 0:
        logger.info(f"{t} 发送\"{message}\"失败:{result['msg']}")
    else:
        logger.info(f"{t} 发送\"{message}\"成功")


send_feishu_message(f"🎉 {machine_id} GPU空闲状态监控已开启! 初始化状态为:GPU正在被使用中")
state_prev = False
max_retry = 3
while True:
    # 单次最多检查k次,全空才视为空
    is_idle, message = None, None
    for _ in range(max_retry):
        is_idle, message = check_gpu_usage()
        if not is_idle:
            break
        time.sleep(60)

    if is_idle ^ state_prev:
        send_feishu_message(message)
    state_prev = is_idle
    time.sleep(10 * 60)  # 每10分钟检查一次


http://www.kler.cn/a/520308.html

相关文章:

  • 动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践
  • 理解C++中的右值引用
  • ui-automator定位官网文档下载及使用
  • 第25篇 基于ARM A9处理器用C语言实现中断<一>
  • 无人机微波图像传输数据链技术详解
  • STM32使用VScode开发
  • XML外部实体注入--漏洞利用
  • 亚博microros小车-原生ubuntu支持系列:13 激光雷达避障
  • 基于OSAL的嵌入式裸机事件驱动框架——软件定时器osal_timer
  • 自由学习记录(32)
  • [VSCode] vscode下载安装及安装中文插件详解(附下载链接)
  • HBase-2.5.10 伪分布式环境搭建【Mac】
  • linux ——waitpid介绍及示例
  • Office2021下载与安装保姆级教程【Office Tool Plus】
  • 蓝桥杯c/c++需要掌握的基础语法总结
  • AWS Wavelength
  • LeetCode:2412. 完成所有交易的初始最少钱数(贪心 java)
  • Spring MVC 中的 DispatcherServlet:工作流程与应用场景解析
  • FreeRTOS实时操作系统学习小结
  • kubernetes 核心技术-Service