云迁移前资源峰值评估脚本

以下是一个Python脚本,用于监控目标应用的CPU和内存使用峰值,帮助确定云迁移所需的实例规格。该脚本使用psutil库进行系统监控,需在待迁移服务器上运行。

import psutil
import time
import argparse

def monitor_resources(pid=None, interval=1, duration=3600):
    """
    监控CPU和内存使用峰值
    :param pid: 目标进程ID(None表示监控整个系统)
    :param interval: 采样间隔(秒)
    :param duration: 监控总时长(秒)
    """
    cpu_peak = 0.0
    mem_peak = 0.0
    samples = 0
    
    print(f"开始监控,持续时间: {duration//60}分钟,采样间隔: {interval}秒")
    start_time = time.time()
    
    try:
        while time.time() - start_time < duration:
            # 获取CPU使用率
            current_cpu = psutil.cpu_percent(interval=interval)
            
            # 获取内存使用量
            if pid:
                process = psutil.Process(pid)
                current_mem = process.memory_info().rss / (1024 ** 2)  # MB
            else:
                current_mem = psutil.virtual_memory().used / (1024 ** 2)  # MB
            
            # 更新峰值
            cpu_peak = max(cpu_peak, current_cpu)
            mem_peak = max(mem_peak, current_mem)
            samples += 1
            
            print(f"\r采样: {samples} | CPU: {current_cpu:.1f}% | 内存: {current_mem:.1f}MB", end="")
    
    except KeyboardInterrupt:
        print("\n监控被用户中断")
    
    except Exception as e:
        print(f"\n监控错误: {str(e)}")
    
    finally:
        print("\n" + "="*50)
        print(f"监控结果 (峰值):")
        print(f"CPU峰值: {cpu_peak:.1f}%")
        print(f"内存峰值: {mem_peak:.1f}MB")
        print("="*50)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='应用资源监控工具')
    parser.add_argument('--pid', type=int, help='目标进程ID(可选)')
    parser.add_argument('--interval', type=float, default=1, help='采样间隔(秒)')
    parser.add_argument('--duration', type=int, default=3600, help='监控时长(秒)')
    
    args = parser.parse_args()
    monitor_resources(pid=args.pid, interval=args.interval, duration=args.duration)

使用说明

  1. 安装依赖

    pip install psutil
    

  2. 运行脚本

    • 监控整个系统:
      python resource_monitor.py --duration 86400  # 监控24小时
      

    • 监控特定应用:
      python resource_monitor.py --pid 1234 --duration 7200  # 监控PID=1234的进程2小时
      

  3. 关键参数

    • --pid:目标进程ID(可选,不指定则监控整个系统)
    • --interval:采样频率(默认1秒)
    • --duration:总监控时长(默认3600秒)

结果解读

  1. CPU峰值

    • 单核系统:值接近100%表示CPU满载
    • 多核系统:需结合核心数分析(如8核系统400%=使用4个核心)
  2. 内存峰值

    • 直接显示应用最大内存占用量(MB)
    • 建议预留20%缓冲空间作为实例规格选择依据

最佳实践

  1. 监控周期

    • 至少覆盖1个完整业务周期(如日/周高峰)
    • 推荐持续监控7天以捕获周期性峰值
  2. 规格计算

    • CPU核心数 = $\lceil \frac{\text{CPU峰值%}}{100} \times \text{物理核心数} \rceil$
    • 内存规格 = $\text{内存峰值} \times 1.2$(含20%缓冲)
  3. 特殊场景

    • Java应用需监控JVM堆内存和非堆内存
    • 容器化应用需考虑cgroup限制

注意:监控期间应保持业务正常负载,避免在维护窗口运行以获得真实数据。对于分布式系统,需在所有节点运行此脚本。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐