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

server/2025/2/4 2:11:02/

目标:如果服务器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 datetimeimport 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, Nonefor _ in range(max_retry):is_idle, message = check_gpu_usage()if not is_idle:breaktime.sleep(60)if is_idle ^ state_prev:send_feishu_message(message)state_prev = is_idletime.sleep(10 * 60)  # 每10分钟检查一次


http://www.ppmy.cn/server/164771.html

相关文章

Java面试题2025-并发编程基础(多线程、锁、阻塞队列)

并发编程 一、线程的基础概念 一、基础概念 1.1 进程与线程A 什么是进程&#xff1f; 进程是指运行中的程序。 比如我们使用钉钉&#xff0c;浏览器&#xff0c;需要启动这个程序&#xff0c;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;。 …

DeepSeek 云端部署,释放无限 AI 潜力!

1.简介 目前&#xff0c;OpenAI、Anthropic、Google 等公司的大型语言模型&#xff08;LLM&#xff09;已广泛应用于商业和私人领域。自 ChatGPT 推出以来&#xff0c;与 AI 的对话变得司空见惯&#xff0c;对我而言没有 LLM 几乎无法工作。 国产模型「DeepSeek-R1」的性能与…

LeetCode - #195 Swift 实现打印文件中的第十行

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

C++11新特性之范围for循环

1.介绍 C11标准之前&#xff0c;使用for循环遍历数组或容器&#xff0c;只能使用以下结构&#xff1a; for&#xff08;表达式1&#xff1b;表达式2&#xff1b;表达式3&#xff09;{ 循环体 } 那么在C11标准中&#xff0c;除了上面的方法外&#xff0c;又引入了一种全新的语…

算法设计-插入排序(C++)

一、算法原理 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是将未排序数据插入到已排序序列的合适位置。具体来说&#xff0c;插入排序将数组分为已排序和未排序两部分&#xff0c;初始时已排序部分只有数组的第一个元素&#xff0c;然后依次从未排序部分取出元…

java 异常处理

public class Main {/*what:exception copy withwhat character &#xff1a;1.try catch finally 测试语句 捕获异常后不再终止程序 函数结束后输出异常类名字 异常产生类 方法 行数2.小异常&#xff08;小范围&#xff09;在前 大异常在后 保证 大异常托底例&#xff1a;j…

Golang Gin系列-9:Gin 集成Swagger生成文档

文档一直是一项乏味的工作&#xff08;以我个人的拙见&#xff09;&#xff0c;但也是编码过程中最重要的任务之一。在本文中&#xff0c;我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证&#xff0c;请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…

第1节课:算法初印象—开启算法世界的大门

目录 一、算法是什么&#xff08;一&#xff09;官方定义&#xff08;二&#xff09;算法的五大特性&#xff08;三&#xff09;算法与程序的关系 二、算法在生活中的奇妙体现&#xff08;一&#xff09;日常出行中的算法&#xff08;二&#xff09;购物消费中的算法&#xff0…