psutil

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

注意事项

  1. 权限要求:某些信息需要管理员/root权限

  2. 平台差异:部分功能在不同操作系统上可能不同

  3. 性能开销:频繁调用可能影响系统性能

  4. 异常处理 :进程可能随时结束,需要处理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 是一个功能强大且易于使用的库,特别适合需要系统级监控和管理的应用程序。

相关推荐
无心水2 小时前
4、Go语言程序实体详解:变量声明与常量应用【初学者指南】
java·服务器·开发语言·人工智能·python·golang·go
jiunian_cn2 小时前
【C++】线程库
开发语言·c++
0x532 小时前
JAVA|智能仿真并发项目-并行与并发
java·开发语言
漫漫求2 小时前
1、IM:基础连接
开发语言·后端·golang
gjxDaniel2 小时前
JavaScript编程语言入门与常见问题
开发语言·javascript
kk哥88992 小时前
C++新手入门
开发语言·c++
Hello eveybody2 小时前
Java发明者介绍
java·开发语言
Coding茶水间2 小时前
基于深度学习的红外镜头下的行人识别系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
代码游侠2 小时前
嵌入式开发代码实践——串口通信(UART)开发
c语言·开发语言·笔记·单片机·嵌入式硬件·重构