云迁移前评估:编写 Python 脚本统计待迁移应用的 CPU / 内存峰值(确定实例规格)
·
云迁移前资源峰值评估脚本
以下是一个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)
使用说明
-
安装依赖:
pip install psutil -
运行脚本:
- 监控整个系统:
python resource_monitor.py --duration 86400 # 监控24小时 - 监控特定应用:
python resource_monitor.py --pid 1234 --duration 7200 # 监控PID=1234的进程2小时
- 监控整个系统:
-
关键参数:
--pid:目标进程ID(可选,不指定则监控整个系统)--interval:采样频率(默认1秒)--duration:总监控时长(默认3600秒)
结果解读
-
CPU峰值:
- 单核系统:值接近100%表示CPU满载
- 多核系统:需结合核心数分析(如8核系统400%=使用4个核心)
-
内存峰值:
- 直接显示应用最大内存占用量(MB)
- 建议预留20%缓冲空间作为实例规格选择依据
最佳实践
-
监控周期:
- 至少覆盖1个完整业务周期(如日/周高峰)
- 推荐持续监控7天以捕获周期性峰值
-
规格计算:
- CPU核心数 = $\lceil \frac{\text{CPU峰值%}}{100} \times \text{物理核心数} \rceil$
- 内存规格 = $\text{内存峰值} \times 1.2$(含20%缓冲)
-
特殊场景:
- Java应用需监控JVM堆内存和非堆内存
- 容器化应用需考虑cgroup限制
注意:监控期间应保持业务正常负载,避免在维护窗口运行以获得真实数据。对于分布式系统,需在所有节点运行此脚本。
更多推荐



所有评论(0)