使用Python编写VPS服务器监控脚本
文章分类:售后支持 /
创建时间:2025-09-30
想高效掌握VPS服务器运行状态?本文教你用Python结合psutil库(跨平台系统监控工具库),编写实时监控CPU、内存、磁盘I/O及网络带宽的脚本,通过量化数据提前发现潜在问题,保障服务器稳定运行。
一、监控脚本需求概述
VPS服务器作为网站或应用的核心载体,资源过载可能导致服务卡顿甚至宕机。传统人工登录服务器查看的方式效率低、易遗漏,通过Python编写自动化监控脚本,能实现7×24小时无死角监测,实时抓取CPU、内存、磁盘I/O和网络带宽的使用数据,帮你提前发现进程异常、内存泄漏等潜在风险,为服务器稳定运行上道“安全锁”。
二、监控指标及实现思路
1. CPU使用率
CPU使用率指CPU在一段时间内被使用的比例,是衡量服务器计算负载的核心指标。这里推荐用psutil库的`cpu_percent`方法获取数据,需注意:监控脚本建议以普通用户权限运行,避免因脚本异常导致的系统权限泄露风险,符合《数据安全法》中最小权限原则要求。
import psutil
cpu_percent = psutil.cpu_percent(interval=1) # interval=1表示间隔1秒采样
print(f"CPU使用率: {cpu_percent}%")
若发现CPU长期超过80%,可能是高计算任务或恶意进程占用,需及时排查。
2. 内存使用率
内存使用率是已用内存占总内存的比例,内存不足会直接导致服务崩溃。曾遇到客户因未监控内存,PHP应用内存泄漏持续一周后服务器宕机。通过psutil的`virtual_memory`方法可快速获取数据。
import psutil
memory = psutil.virtual_memory()
memory_percent = memory.percent # 直接获取使用率百分比
print(f"内存使用率: {memory_percent}%")
建议为内存使用率设置阈值(如90%),触发时通过邮件或短信告警,避免类似事故。
3. 磁盘I/O
磁盘I/O用读写速度衡量,过高的I/O会拖慢文件读写和数据库操作。psutil的`disk_io_counters`方法能获取字节数,实际使用中可转换为MB(1MB=1024×1024字节)更易读。
import psutil
disk_io = psutil.disk_io_counters()
read_mb = disk_io.read_bytes / 1048576 # 转换为MB
write_mb = disk_io.write_bytes / 1048576
print(f"磁盘读取: {read_mb:.2f}MB, 写入: {write_mb:.2f}MB")
若写入量异常激增,可能是日志文件过大或数据库批量操作,需检查业务逻辑。
4. 网络带宽
网络带宽指每秒传输的字节数,异常流量可能是DDoS攻击或恶意爬虫。通过psutil的`net_io_counters`方法可监控上下行流量。
import psutil
net_io = psutil.net_io_counters()
sent_mb = net_io.bytes_sent / 1048576 # 发送流量MB
recv_mb = net_io.bytes_recv / 1048576 # 接收流量MB
print(f"网络发送: {sent_mb:.2f}MB, 接收: {recv_mb:.2f}MB")
若接收流量突然暴增,可结合防火墙做流量清洗,或联系服务商开启DDoS防护。
三、完整监控脚本优化版
当前脚本仅打印数据到控制台,实际使用中建议将结果写入日志文件(如/var/log/vps_monitor.log),方便后续用ELK(Elasticsearch、Logstash、Kibana)分析。以下是优化后的脚本:
import psutil
import time
from datetime import datetime
def monitor_server(log_path="/var/log/vps_monitor.log"):
while True:
# 获取监控数据
cpu_percent = psutil.cpu_percent(interval=1)
memory_percent = psutil.virtual_memory().percent
disk_io = psutil.disk_io_counters()
net_io = psutil.net_io_counters()
# 格式化日志内容
log_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_content = (
f"[{log_time}] CPU: {cpu_percent}% | 内存: {memory_percent}% | "
f"磁盘读取: {disk_io.read_bytes}B | 磁盘写入: {disk_io.write_bytes}B | "
f"网络发送: {net_io.bytes_sent}B | 网络接收: {net_io.bytes_recv}B\n"
)
# 写入日志文件
with open(log_path, "a") as f:
f.write(log_content)
time.sleep(5) # 可根据需求调整监控间隔
if __name__ == "__main__":
monitor_server()
脚本默认每5秒记录一次数据,可通过修改`time.sleep(5)`调整间隔(如10秒降低IO压力)。
掌握这一技能后,你不仅能手动排查问题,还能为VPS服务器配置自动化告警(如达到80%CPU使用率时发送邮件)。如需了解如何扩展脚本功能或获取VPS弹性升级方案,欢迎访问官网技术文档库查看更多教程。