系统资源监控:psutil 采集 RSS 内存 / CPU% / 线程数

一句话:psutil是Python的系统监控库,可以获取CPU、内存、磁盘、网络等系统资源信息。在AI应用中,常用于监控系统资源使用情况,防止资源耗尽。

1. psutil 基础

1.1 什么是psutil?


graph LR

    A[psutil] --> B[系统监控库]

    A --> C[跨平台]

    A --> D[获取系统信息]

    A --> E[进程管理]

    style A fill:#e1f5fe

psutil:Python的系统监控库,支持Linux、Windows、macOS等平台。

1.2 安装

 
pip install psutil
 

2. 系统资源采集

2.1 内存监控

 
import psutil
 
# 获取内存信息
 
memory = psutil.virtual_memory()
 
# RSS内存( Resident Set Size)
 
rss_memory = memory.used  # 已使用内存
 
# 内存使用率
 
memory_percent = memory.percent
 
# 可用内存
 
available_memory = memory.available
 
print(f"RSS内存: {rss_memory / 1024 / 1024:.2f} MB")
 
print(f"内存使用率: {memory_percent}%")
 
print(f"可用内存: {available_memory / 1024 / 1024:.2f} MB")
 

2.2 CPU监控

 
import psutil
 
# CPU使用率
 
cpu_percent = psutil.cpu_percent(interval=1)
 
# 每个CPU核心的使用率
 
cpu_per_core = psutil.cpu_percent(interval=1, percpu=True)
 
# CPU频率
 
cpu_freq = psutil.cpu_freq()
 
# CPU统计
 
cpu_stats = psutil.cpu_stats()
 
print(f"CPU使用率: {cpu_percent}%")
 
print(f"每个核心: {cpu_per_core}")
 
print(f"CPU频率: {cpu_freq.current} MHz")
 

2.3 进程监控

 
import psutil
 
# 获取当前进程
 
process = psutil.Process()
 
# 进程内存信息
 
memory_info = process.memory_info()
 
rss = memory_info.rss  # RSS内存
 
vms = memory_info.vms  # VMS内存
 
# 进程CPU信息
 
cpu_percent = process.cpu_percent(interval=1)
 
# 线程数
 
num_threads = process.num_threads()
 
print(f"进程RSS内存: {rss / 1024 / 1024:.2f} MB")
 
print(f"进程CPU使用率: {cpu_percent}%")
 
print(f"线程数: {num_threads}")
 

3. 完整监控脚本

3.1 系统资源监控

 
import psutil
 
import time
 
import json
 
from datetime import datetime
 
def monitor_system_resources():
 
    """监控系统资源"""
 
    while True:
 
        # 内存信息
 
        memory = psutil.virtual_memory()
 
        # CPU信息
 
        cpu_percent = psutil.cpu_percent(interval=1)
 
        # 磁盘信息
 
        disk = psutil.disk_usage('/')
 
        # 网络信息
 
        net_io = psutil.net_io_counters()
 
        # 监控数据
 
        data = {
 
            "timestamp": datetime.now().isoformat(),
 
            "memory": {
 
                "total": memory.total,
 
                "used": memory.used,
 
                "available": memory.available,
 
                "percent": memory.percent
 
            },
 
            "cpu": {
 
                "percent": cpu_percent,
 
                "count": psutil.cpu_count()
 
            },
 
            "disk": {
 
                "total": disk.total,
 
                "used": disk.used,
 
                "free": disk.free,
 
                "percent": disk.percent
 
            },
 
            "network": {
 
                "bytes_sent": net_io.bytes_sent,
 
                "bytes_recv": net_io.bytes_recv
 
            }
 
        }
 
        # 输出JSON
 
        print(json.dumps(data, indent=2))
 
        # 等待10秒
 
        time.sleep(10)
 
if __name__ == "__main__":
 
    monitor_system_resources()
 

3.2 进程资源监控

 
import psutil
 
import time
 
def monitor_process_resources(pid=None):
 
    """监控进程资源"""
 
    if pid:
 
        process = psutil.Process(pid)
 
    else:
 
        process = psutil.Process()
 
    while True:
 
        # 内存信息
 
        memory_info = process.memory_info()
 
        # CPU信息
 
        cpu_percent = process.cpu_percent(interval=1)
 
        # 线程信息
 
        num_threads = process.num_threads()
 
        # 文件描述符
 
        num_fds = process.num_fds() if hasattr(process, 'num_fds') else None
 
        print(f"PID: {process.pid}")
 
        print(f"RSS内存: {memory_info.rss / 1024 / 1024:.2f} MB")
 
        print(f"VMS内存: {memory_info.vms / 1024 / 1024:.2f} MB")
 
        print(f"CPU使用率: {cpu_percent}%")
 
        print(f"线程数: {num_threads}")
 
        if num_fds:
 
            print(f"文件描述符: {num_fds}")
 
        print("-" * 50)
 
        time.sleep(5)
 
if __name__ == "__main__":
 
    monitor_process_resources()
 

4. Prometheus集成

4.1 自定义指标

 
import psutil
 
from prometheus_client import Gauge, start_http_server
 
# 定义指标
 
MEMORY_USAGE = Gauge(
 
    'system_memory_usage_bytes',
 
    'System memory usage in bytes'
 
)
 
CPU_USAGE = Gauge(
 
    'system_cpu_usage_percent',
 
    'System CPU usage percentage'
 
)
 
THREAD_COUNT = Gauge(
 
    'process_thread_count',
 
    'Number of threads in process'
 
)
 
def collect_metrics():
 
    """收集系统指标"""
 
    # 内存
 
    memory = psutil.virtual_memory()
 
    MEMORY_USAGE.set(memory.used)
 
    # CPU
 
    cpu_percent = psutil.cpu_percent(interval=1)
 
    CPU_USAGE.set(cpu_percent)
 
    # 线程数
 
    process = psutil.Process()
 
    THREAD_COUNT.set(process.num_threads())
 
if __name__ == "__main__":
 
    # 启动Prometheus HTTP服务器
 
    start_http_server(8000)
 
    # 定期收集指标
 
    while True:
 
        collect_metrics()
 
        time.sleep(10)
 

5. 告警集成

5.1 内存告警

 
import psutil
 
def check_memory_usage(threshold=80):
 
    """检查内存使用率"""
 
    memory = psutil.virtual_memory()
 
    if memory.percent > threshold:
 
        print(f"警告:内存使用率过高!当前: {memory.percent}%")
 
        return True
 
    return False
 
def check_process_memory(pid=None, threshold_mb=1024):
 
    """检查进程内存使用"""
 
    if pid:
 
        process = psutil.Process(pid)
 
    else:
 
        process = psutil.Process()
 
    memory_info = process.memory_info()
 
    rss_mb = memory_info.rss / 1024 / 1024
 
    if rss_mb > threshold_mb:
 
        print(f"警告:进程内存使用过高!当前: {rss_mb:.2f} MB")
 
        return True
 
    return False
 

5.2 CPU告警

 
import psutil
 
def check_cpu_usage(threshold=80):
 
    """检查CPU使用率"""
 
    cpu_percent = psutil.cpu_percent(interval=1)
 
    if cpu_percent > threshold:
 
        print(f"警告:CPU使用率过高!当前: {cpu_percent}%")
 
        return True
 
    return False
 

6. 实际案例

6.1 FastAPI应用监控

 
import psutil
 
from fastapi import FastAPI
 
from prometheus_client import Gauge
 
app = FastAPI()
 
# 定义指标
 
APP_MEMORY_USAGE = Gauge(
 
    'app_memory_usage_bytes',
 
    'Application memory usage'
 
)
 
APP_CPU_USAGE = Gauge(
 
    'app_cpu_usage_percent',
 
    'Application CPU usage'
 
)
 
@app.on_event("startup")
 
async def startup():
 
    # 启动时记录初始状态
 
    process = psutil.Process()
 
    APP_MEMORY_USAGE.set(process.memory_info().rss)
 
@app.middleware("http")
 
async def monitor_middleware(request, call_next):
 
    # 请求处理前
 
    process = psutil.Process()
 
    start_memory = process.memory_info().rss
 
    # 处理请求
 
    response = await call_next(request)
 
    # 请求处理后
 
    end_memory = process.memory_info().rss
 
    memory_diff = end_memory - start_memory
 
    # 更新指标
 
    APP_MEMORY_USAGE.set(end_memory)
 
    APP_CPU_USAGE.set(psutil.cpu_percent(interval=0.1))
 
    return response
 

7. 常见坑点

1. 采样间隔太短

 
# 问题:采样间隔太短,CPU使用率不准
 
cpu_percent = psutil.cpu_percent(interval=0.1)  # 太短
 
# 解决:使用合适的采样间隔
 
cpu_percent = psutil.cpu_percent(interval=1)  # 1秒
 

2. 忘记处理异常

 
# 问题:没有处理psutil异常
 
memory = psutil.virtual_memory()
 
# 解决:添加异常处理
 
try:
 
    memory = psutil.virtual_memory()
 
except Exception as e:
 
    print(f"获取内存信息失败: {e}")
 

3. 跨平台兼容性

 
# 解决:检查平台兼容性
 
import psutil
 
import platform
 
if platform.system() == "Linux":
 
    # Linux特定代码
 
    num_fds = process.num_fds()
 
elif platform.system() == "Windows":
 
    # Windows特定代码
 
    num_handles = process.num_handles()
 

核心要点

 
import psutil
 
# 内存
 
memory = psutil.virtual_memory()
 
rss = memory.used
 
percent = memory.percent
 
# CPU
 
cpu_percent = psutil.cpu_percent(interval=1)
 
# 进程
 
process = psutil.Process()
 
rss = process.memory_info().rss
 
cpu_percent = process.cpu_percent(interval=1)
 
threads = process.num_threads()
 

速记卡(面试闪卡)

Q1:一句话讲清「系统资源监控:psutil 采集 RSS 内存 / CPU% / 线程数」到底是什么?

A:用 psutil 库采集内存、CPU、线程等系统资源指标。

Q2:1. psutil 基础 —— 怎么理解?

A:psutil 是个跨平台系统监控库(System Monitoring Library),像给服务器装了个体检仪:Linux、Windows、macOS 通吃,一行 pip install 就能上手。

Q3:2. 系统资源采集 —— 怎么理解?

A:想量 RSS 内存(RSS Memory)就 virtual_memory(),想量 CPU 占用(CPU Percent)就 cpu_percent(interval=1);进程级用 Process().num_threads() 数线程——像拿尺子量三围。

Q4:4. Prometheus 集成 —— 怎么理解?

A:把采集到的指标注册成 Gauge(计量表),start_http_server 一开,Prometheus 就能来拉(Pull);线程数、内存、CPU 全变成可监控的时间序列(Time Series)。

Q5:5. 告警集成 —— 怎么理解?

A:阈值(Threshold)一超就报警:内存率 > 80% 喊「内存过高」,CPU 同理。系统监控(System Monitoring)的最后一公里,就是让异常自己喊疼。

Q6:核心速记主线有哪些?

  • psutil 跨平台采集资源

  • RSS/CPU/线程都能量

  • Prometheus 用 Gauge 暴露

  • 超阈值就触发告警

口诀

A:psutil 装好体检仪,

内存 CPU 量仔细。

Gauge 一挂 Prometheus,

超阈报警不迟疑。

相关链接