運(yùn)維小白也能上手:五分鐘搭建系統(tǒng)資源監(jiān)控告警神器
在運(yùn)維中,CPU爆滿、內(nèi)存溢出、磁盤寫滿是常見問題,輕則服務(wù)變慢,重則直接宕機(jī)。
這些故障往往不是突然發(fā)生,而是資源長期高負(fù)載卻沒被發(fā)現(xiàn)。
因此,實(shí)時(shí)監(jiān)控并主動(dòng)告警就顯得尤為重要。
Python的psutil庫能輕松獲取系統(tǒng)資源信息,配合一個(gè)小腳本,就能快速實(shí)現(xiàn)輕量級(jí)的自動(dòng)化監(jiān)控。

psutil是什么?
psutil 全稱process and system utilities,顧名思義,就是一個(gè)用來獲取 系統(tǒng)資源信息 的庫。
它能幫我們輕松拿到:
- CPU 使用情況:使用率、核心數(shù)、負(fù)載等
- 內(nèi)存信息:總量、已用、使用率
- 磁盤信息:容量、已用、剩余空間
- 網(wǎng)絡(luò)狀態(tài):帶寬流量、連接數(shù)
更重要的是:跨平臺(tái)支持(Windows、Linux、macOS 全都能用),適合做系統(tǒng)監(jiān)控和自動(dòng)化運(yùn)維。
簡單示例:
import psutil
print("CPU使用率:", psutil.cpu_percent(interval=1), "%")
print("內(nèi)存使用率:", psutil.virtual_memory().percent, "%")
print("磁盤使用率:", psutil.disk_usage('/').percent, "%")執(zhí)行結(jié)果一目了然,幾行代碼就能搞定系統(tǒng)資源采集。如下圖所示:

為什么要做系統(tǒng)資源監(jiān)控?
運(yùn)維中最常見的問題:
- CPU 爆滿 → 服務(wù)響應(yīng)變慢
- 內(nèi)存溢出 → 進(jìn)程直接崩潰
- 磁盤寫滿 → 應(yīng)用無法寫日志、數(shù)據(jù)庫宕機(jī)
這些問題一旦發(fā)生,輕則客戶體驗(yàn)變差,重則系統(tǒng)徹底掛掉。
如果有一個(gè)小腳本能幫你:
- 提前預(yù)警:在資源用滿前提醒你
- 快速響應(yīng):第一時(shí)間發(fā)告警郵件
- 自動(dòng)化運(yùn)維:無需人工盯著,減少巡檢工作
是不是很香???
實(shí)現(xiàn)思路
我們的思路非常清晰:
- 采集系統(tǒng)資源信息(用psutil)
- 判斷是否超過閾值(比如 CPU>80% 就報(bào)警)
- 觸發(fā)告警(通過釘釘發(fā)送告警信息)
核心代碼展示
記錄日志功能,方便后續(xù)排查錯(cuò)誤:
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('system_monitor.log'),
logging.StreamHandler()
]
)
logger = logging.getLogger(__name__)獲取主機(jī)和系統(tǒng)資源:
# 閾值配置(百分比)
THRESHOLD = {
"cpu": 80,
"mem": 75,
"disk": 85
}
def get_host_info():
"""獲取主機(jī)名和IP"""
try:
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
logger.info(f"獲取主機(jī)信息成功: {hostname} ({ip})")
return hostname, ip
except Exception as e:
logger.error(f"獲取主機(jī)信息失敗: {e}")
raise
def get_system_info():
"""獲取CPU/內(nèi)存/磁盤信息"""
try:
cpu_percent = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory()
disk = psutil.disk_usage('/')
system_info = {
"cpu": cpu_percent,
"mem": mem.percent,
"mem_total": round(mem.total / (1024**3), 2),
"mem_used": round(mem.used / (1024**3), 2),
"disk": disk.percent,
"disk_total": round(disk.total / (1024**3), 2),
"disk_used": round(disk.used / (1024**3), 2)
}
logger.info(f"系統(tǒng)資源狀態(tài) - CPU: {system_info['cpu']}%, "
f"內(nèi)存: {system_info['mem']}%, "
f"磁盤: {system_info['disk']}%")
return system_info
except Exception as e:
logger.error(f"獲取系統(tǒng)信息失敗: {e}")
raise判斷閾值并發(fā)送告警:
def monitor():
"""監(jiān)控并告警"""
try:
logger.info("開始系統(tǒng)監(jiān)控檢查")
hostname, ip = get_host_info()
info = get_system_info()
alarm_item = []
if info["cpu"] > THRESHOLD["cpu"]:
alarm_item.append(f"- CPU 使用率:{info['cpu']}% > {THRESHOLD['cpu']}%")
if info["mem"] > THRESHOLD["mem"]:
alarm_item.append(f"- 內(nèi)存使用率:{info['mem']}% > {THRESHOLD['mem']}%")
if info["disk"] > THRESHOLD["disk"]:
alarm_item.append(f"- 磁盤使用率:{info['disk']}% > {THRESHOLD['disk']}%")
if alarm_item: # 有異常才發(fā)告警
content = f"""## ?? 系統(tǒng)資源告警
---
### ??? 主機(jī)信息
- **主機(jī)名**: {hostname}
- **IP地址**: {ip}
- **告警時(shí)間**: {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
---
### ?? 異常詳情
{chr(10).join(alarm_item)}
---
### ?? 系統(tǒng)狀態(tài)詳情
#### ?? CPU狀態(tài)
- **使用率**: {info['cpu']}%
- **狀態(tài)**: {"?? 異常" if info["cpu"] > THRESHOLD["cpu"] else "?? 正常"}
#### ?? 內(nèi)存狀態(tài)
- **使用率**: {info['mem']}%
- **使用量**: {info['mem_used']} GB
- **總量**: {info['mem_total']} GB
- **狀態(tài)**: {"?? 異常" if info["mem"] > THRESHOLD["mem"] else "?? 正常"}
#### ?? 磁盤狀態(tài)
- **使用率**: {info['disk']}%
- **使用量**: {info['disk_used']} GB
- **總量**: {info['disk_total']} GB
- **狀態(tài)**: {"?? 異常" if info["disk"] > THRESHOLD["disk"] else "?? 正常"}
---
> ?? *請(qǐng)盡快處理系統(tǒng)資源異常,避免影響業(yè)務(wù)正常運(yùn)行*
"""
logger.warning(f"檢測到系統(tǒng)異常,準(zhǔn)備發(fā)送告警: {alarm_item}")
DingTalkPushUtil().send_md("系統(tǒng)資源告警", content)
else:
logger.info("系統(tǒng)資源正常,無異常項(xiàng)")
except Exception as e:
logger.error(f"監(jiān)控過程中發(fā)生錯(cuò)誤: {e}")
raise效果預(yù)覽
當(dāng)CPU或內(nèi)存超過閾值時(shí),你會(huì)立刻收到一封告警郵件:

如何自動(dòng)運(yùn)行?
寫完腳本只是第一步,真正發(fā)揮價(jià)值要讓它自動(dòng)跑起來。
- 在 Linux 下:用 crontab 設(shè)置定時(shí)任務(wù)
- 在 Windows 下:用任務(wù)計(jì)劃程序定時(shí)執(zhí)行
這樣,你的系統(tǒng)就相當(dāng)于多了一個(gè)“自動(dòng)巡檢小助手”。下面以linux中的crontab為例
第一步:編輯定時(shí)任務(wù)
在終端輸入:
crontab -e這會(huì)打開當(dāng)前用戶的定時(shí)任務(wù)配置文件。
第二步:添加任務(wù)
在文件末尾添加一行,指定腳本執(zhí)行的時(shí)間和路徑,例如:
*/5 * * * * /usr/bin/python3 /home/code/monitor/main.py 2>&1解釋一下:
- */5 * * * * → 每 5 分鐘執(zhí)行一次
- /usr/bin/python3 → Python3 的路徑(可以用 which python3 查看)
- /home/code/monitor/main.py → 你的監(jiān)控腳本路徑
第三步:檢查任務(wù)是否生效
保存退出后,輸入:
crontab -l可以看到剛才添加的任務(wù)。
至此,一個(gè)自動(dòng)化的系統(tǒng)資源監(jiān)控告警就搭建完成。
從 psutil獲取數(shù)據(jù) → 腳本判斷閾值 → 釘釘發(fā)送告警 → crontab定時(shí)執(zhí)行,這就是一個(gè)完整的自動(dòng)化監(jiān)控閉環(huán)。
總結(jié)
- psutil:獲取系統(tǒng)資源神器,跨平臺(tái)支持
- DingTalkPushUtil:是自定義封裝的釘釘發(fā)送告警工具類
- Python 腳本:讓你從“被動(dòng)救火”變成“提前預(yù)防”
運(yùn)維的精髓就是:未雨綢繆,少挨老板罵。































