psutil 是一个跨平台的 Python 库,用于获取系统信息和进程管理。它可以轻松获取 CPU、内存、磁盘、网络等系统信息,以及管理运行中的进程。
一、主要功能
1. 系统信息
python
import psutil
import os
# CPU信息
print(f"CPU逻辑核心数: {psutil.cpu_count()}") # 逻辑核心数
print(f"CPU物理核心数: {psutil.cpu_count(logical=False)}") # 物理核心数
print(f"CPU使用率: {psutil.cpu_percent(interval=1)}%") # CPU使用率(间隔1秒)
print(f"CPU各核心使用率: {psutil.cpu_percent(percpu=True)}") # 每个核心使用率
# 内存信息
mem = psutil.virtual_memory()
print(f"总内存: {mem.total / (1024**3):.2f} GB")
print(f"可用内存: {mem.available / (1024**3):.2f} GB")
print(f"内存使用率: {mem.percent}%")
# 交换内存(虚拟内存)
swap = psutil.swap_memory()
print(f"交换内存使用率: {swap.percent}%")
# 磁盘信息
disk = psutil.disk_usage('/') # 根目录使用情况
print(f"磁盘总空间: {disk.total / (1024**3):.2f} GB")
print(f"磁盘使用率: {disk.percent}%")
# 磁盘IO
disk_io = psutil.disk_io_counters()
print(f"磁盘读取字节数: {disk_io.read_bytes}")
print(f"磁盘写入字节数: {disk_io.write_bytes}")
# 网络信息
net_io = psutil.net_io_counters()
print(f"发送字节数: {net_io.bytes_sent}")
print(f"接收字节数: {net_io.bytes_recv}")
# 网络连接
connections = psutil.net_connections()
for conn in connections[:5]: # 显示前5个连接
print(f"连接: {conn.laddr} -> {conn.raddr if conn.raddr else 'None'} 状态: {conn.status}")
2. 进程管理
python
# 获取所有进程ID
pids = psutil.pids()
print(f"系统进程数: {len(pids)}")
# 获取当前进程
current_process = psutil.Process(os.getpid())
print(f"当前进程PID: {current_process.pid}")
print(f"进程名: {current_process.name()}")
print(f"进程状态: {current_process.status()}")
print(f"进程创建时间: {current_process.create_time()}")
print(f"进程CPU时间: {current_process.cpu_times()}")
print(f"进程内存使用: {current_process.memory_info().rss / 1024**2:.2f} MB")
# 遍历所有进程
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
try:
info = proc.info
print(f"PID: {info['pid']}, 名称: {info['name']}, CPU: {info['cpu_percent']}%, 内存: {info['memory_percent']:.1f}%")
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
# 查找特定进程
for proc in psutil.process_iter():
if 'python' in proc.name().lower():
print(f"Python进程: PID={proc.pid}, 名称={proc.name()}")
# 结束进程
try:
proc = psutil.Process(1234) # 假设PID为1234
proc.terminate() # 温和终止
proc.wait(timeout=5) # 等待终止
except psutil.NoSuchProcess:
print("进程不存在")
except psutil.AccessDenied:
print("权限不足")
3. 系统监控工具示例
python
import time
import psutil
import pandas as pd
from datetime import datetime
class SystemMonitor:
"""系统监控类"""
def __init__(self, log_file='system_monitor.csv'):
self.log_file = log_file
self.columns = ['timestamp', 'cpu_percent', 'mem_percent',
'disk_percent', 'net_sent', 'net_recv']
self.initialize_log()
def initialize_log(self):
"""初始化日志文件"""
if not os.path.exists(self.log_file):
df = pd.DataFrame(columns=self.columns)
df.to_csv(self.log_file, index=False)
def collect_metrics(self):
"""收集系统指标"""
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
cpu = psutil.cpu_percent(interval=1)
mem = psutil.virtual_memory().percent
disk = psutil.disk_usage('/').percent
net = psutil.net_io_counters()
return {
'timestamp': timestamp,
'cpu_percent': cpu,
'mem_percent': mem,
'disk_percent': disk,
'net_sent': net.bytes_sent,
'net_recv': net.bytes_recv
}
def monitor(self, interval=5, duration=60):
"""监控系统一段时间"""
print("开始系统监控...")
print("时间戳 CPU(%) 内存(%) 磁盘(%) 网络发送(MB) 网络接收(MB)")
print("-" * 70)
start_time = time.time()
data_points = []
try:
while time.time() - start_time < duration:
metrics = self.collect_metrics()
# 打印当前状态
print(f"{metrics['timestamp']} "
f"{metrics['cpu_percent']:>6.1f}% "
f"{metrics['mem_percent']:>6.1f}% "
f"{metrics['disk_percent']:>6.1f}% "
f"{metrics['net_sent']/1024**2:>10.1f} "
f"{metrics['net_recv']/1024**2:>10.1f}")
data_points.append(metrics)
time.sleep(interval)
except KeyboardInterrupt:
print("\n监控被用户中断")
# 保存数据
if data_points:
df = pd.DataFrame(data_points)
df.to_csv(self.log_file, mode='a', header=False, index=False)
print(f"\n数据已保存到 {self.log_file}")
return data_points
def analyze_performance(self):
"""分析性能数据"""
if os.path.exists(self.log_file):
df = pd.read_csv(self.log_file)
print("\n=== 性能分析报告 ===")
print(f"数据点数: {len(df)}")
print(f"CPU平均使用率: {df['cpu_percent'].mean():.1f}%")
print(f"内存平均使用率: {df['mem_percent'].mean():.1f}%")
print(f"磁盘平均使用率: {df['disk_percent'].mean():.1f}%")
print(f"网络总发送: {df['net_sent'].max()/1024**2:.1f} MB")
print(f"网络总接收: {df['net_recv'].max()/1024**2:.1f} MB")
# 使用示例
if __name__ == "__main__":
monitor = SystemMonitor()
# 监控60秒,每5秒采样一次
data = monitor.monitor(interval=5, duration=60)
# 分析性能
monitor.analyze_performance()
4. 在DQN训练中添加系统监控
python
def train_with_monitoring(env, agent, num_episodes=500):
"""带系统监控的训练"""
import psutil
import time
process = psutil.Process() # 当前进程
monitor_interval = 10 # 每10回合监控一次
scores = []
for i_episode in range(num_episodes):
# 重置环境
state = env.reset()
if isinstance(state, tuple):
state = state[0]
score = 0
while True:
action = agent.select_action(state)
next_state, reward, done, _, _ = env.step(action)
score += reward
agent.memory.push(state, action, reward, next_state, done)
agent.optimize_model()
state = next_state
if done:
scores.append(score)
break
# 定期监控系统资源
if i_episode % monitor_interval == 0:
# 系统资源
cpu_percent = psutil.cpu_percent(interval=None)
mem_percent = psutil.virtual_memory().percent
# 进程资源
process_memory = process.memory_info().rss / 1024**2 # MB
process_cpu = process.cpu_percent() / psutil.cpu_count()
print(f"回合 {i_episode+1} | "
f"得分: {score:.0f} | "
f"系统CPU: {cpu_percent:.1f}% | "
f"系统内存: {mem_percent:.1f}% | "
f"进程内存: {process_memory:.1f}MB | "
f"进程CPU: {process_cpu:.1f}%")
# 更新目标网络
if i_episode % agent.target_update == 0:
agent.update_target_network()
return scores
二、常用函数速查
系统信息
| 函数 | 说明 |
|---|---|
psutil.cpu_count() |
CPU核心数 |
psutil.cpu_percent() |
CPU使用率 |
psutil.virtual_memory() |
虚拟内存信息 |
psutil.swap_memory() |
交换内存信息 |
psutil.disk_usage(path) |
磁盘使用情况 |
psutil.disk_io_counters() |
磁盘I/O统计 |
psutil.net_io_counters() |
网络I/O统计 |
psutil.net_connections() |
网络连接 |
psutil.boot_time() |
系统启动时间 |
psutil.users() |
登录用户 |
进程管理
| 函数 | 说明 |
|---|---|
psutil.pids() |
所有进程ID列表 |
psutil.process_iter() |
迭代所有进程 |
psutil.Process(pid) |
获取指定进程对象 |
proc.name() |
进程名称 |
proc.exe() |
进程可执行文件路径 |
proc.cwd() |
进程工作目录 |
proc.status() |
进程状态 |
proc.create_time() |
进程创建时间 |
proc.cpu_times() |
进程CPU时间 |
proc.memory_info() |
进程内存信息 |
proc.threads() |
进程线程信息 |
proc.open_files() |
进程打开的文件 |
proc.connections() |
进程网络连接 |
proc.terminate() |
终止进程 |
proc.kill() |
强制杀死进程 |
三、应用场景
1. 性能监控
-
监控服务器资源使用情况
-
实时显示系统负载
-
预警资源瓶颈
2. 进程管理
-
查找和结束特定进程
-
监控子进程状态
-
分析进程资源占用
3. 自动化运维
-
自动清理僵尸进程
-
监控服务健康状态
-
资源使用报告生成
4. 调试工具
-
监控Python程序内存泄漏
-
分析多进程/多线程程序
-
性能瓶颈定位
5. 安全监控
-
检测异常进程
-
监控网络连接
-
分析系统活动
四、安装与注意事项
安装
bash
pip install psutil
注意事项
-
权限要求:某些信息需要管理员/root权限
-
平台差异:部分功能在不同操作系统上可能不同
-
性能开销:频繁调用可能影响系统性能
-
异常处理 :进程可能随时结束,需要处理
NoSuchProcess异常
五、实用技巧
1. 获取进程树
python
def get_process_tree(pid, depth=0):
"""递归获取进程树"""
try:
proc = psutil.Process(pid)
print(f"{' ' * depth}├─ PID: {pid}, 名称: {proc.name()}")
for child in proc.children(recursive=False):
get_process_tree(child.pid, depth + 1)
except psutil.NoSuchProcess:
return
2. 监控特定应用的资源使用
python
def monitor_application(app_name, interval=2):
"""监控特定应用程序的资源使用"""
while True:
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_info']):
if app_name in proc.info['name'].lower():
try:
mem = proc.info['memory_info'].rss / 1024**2
print(f"{proc.info['name']} (PID: {proc.info['pid']}): "
f"CPU: {proc.info['cpu_percent']}%, "
f"内存: {mem:.1f} MB")
except:
pass
time.sleep(interval)
3. 系统健康检查
python
def system_health_check():
"""系统健康检查"""
warnings = []
# CPU检查
if psutil.cpu_percent(interval=1) > 80:
warnings.append("CPU使用率超过80%")
# 内存检查
mem = psutil.virtual_memory()
if mem.percent > 85:
warnings.append(f"内存使用率超过85% ({mem.percent}%)")
# 磁盘检查
disk = psutil.disk_usage('/')
if disk.percent > 90:
warnings.append(f"磁盘使用率超过90% ({disk.percent}%)")
return warnings
psutil 是一个功能强大且易于使用的库,特别适合需要系统级监控和管理的应用程序。