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 是一个功能强大且易于使用的库,特别适合需要系统级监控和管理的应用程序。

相关推荐
JaguarJack19 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo19 小时前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack2 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理2 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1232 天前
matlab画图工具
开发语言·matlab
dustcell.2 天前
haproxy七层代理
java·开发语言·前端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054962 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
QQ5110082852 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php