Files
MoviePilot/MEMORY_ANALYSIS_GUIDE.md
2025-07-09 08:04:10 +00:00

269 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 内存分析工具使用指南
## 概述
这个增强版的内存分析工具专门用于诊断Python应用程序的内存问题特别是解决"总内存比各对象占比内存大很多"的问题。
## 主要功能
### 1. 系统级内存分析
- 进程内存使用详情RSS、VMS、共享内存等
- 系统内存状态
- 内存映射分析
### 2. Python对象深度分析
- 对象类型统计(按内存大小排序)
- Python对象总内存计算
- 未统计内存识别
### 3. 内存映射详细分析
- 按权限分类的内存映射
- 按文件分类的内存映射
- 识别C扩展和系统库占用的内存
### 4. 大对象分析
- 识别大于1MB的对象
- 对象详细信息(类型、大小、内容预览)
### 5. 内存泄漏检测
- tracemalloc内存分配统计
- 内存分配最多的位置
- 垃圾回收统计
- 不可达对象检测
## 使用方法
### 基本使用
```python
from app.helper.memory import MemoryHelper
# 创建内存分析器实例
memory_helper = MemoryHelper()
# 获取内存摘要
summary = memory_helper.get_memory_summary()
print(f"总内存: {summary['total_memory_mb']:.2f} MB")
print(f"Python对象: {summary['python_objects_mb']:.2f} MB")
print(f"未统计内存: {summary['unaccounted_mb']:.2f} MB")
# 强制垃圾回收
collected = memory_helper.force_garbage_collection()
print(f"清理了 {collected} 个对象")
# 创建详细分析报告
analysis_file = memory_helper.create_detailed_memory_analysis()
print(f"详细报告已保存到: {analysis_file}")
```
### 内存增长分析
```python
# 分析内存增长趋势5分钟间隔
growth_info = memory_helper.analyze_memory_growth(300)
print(f"内存增长率: {growth_info['growth_rate_mb_per_hour']:.2f} MB/小时")
```
### 启动自动监控
```python
# 启动内存监控需要配置MEMORY_ANALYSIS=True
memory_helper.start_monitoring()
# 停止监控
memory_helper.stop_monitoring()
```
## 配置选项
在配置文件中设置以下选项:
```python
# 启用内存分析
MEMORY_ANALYSIS = True
# 内存快照间隔(分钟)
MEMORY_SNAPSHOT_INTERVAL = 5
# 保留的快照文件数量
MEMORY_SNAPSHOT_KEEP_COUNT = 30
```
## 输出文件
### 1. 内存快照文件
- 位置: `logs/memory_snapshots/memory_snapshot_YYYYMMDD_HHMMSS.txt`
- 内容: 基本的内存使用统计
### 2. 详细分析报告
- 位置: `logs/memory_snapshots/detailed_memory_analysis_YYYYMMDD_HHMMSS.txt`
- 内容: 完整的内存分析报告
## 解决内存问题的步骤
### 1. 识别未统计内存
```python
summary = memory_helper.get_memory_summary()
if summary['unaccounted_percent'] > 50:
print("警告: 超过50%的内存未被Python对象统计")
print("可能的原因: C扩展、系统缓存、内存碎片")
```
### 2. 分析内存映射
详细分析报告中的"内存映射详细分析"部分会显示:
- 哪些文件占用了大量内存
- 内存权限分布
- 识别C扩展库
### 3. 检测内存泄漏
```python
# 定期检查内存增长
growth_info = memory_helper.analyze_memory_growth(300)
if growth_info['growth_rate_mb_per_hour'] > 100:
print("警告: 内存增长过快,可能存在内存泄漏")
```
### 4. 分析大对象
详细分析报告会列出所有大于1MB的对象帮助识别
- 意外的内存占用
- 缓存未清理
- 数据结构过大
## 常见问题解决
### 问题1: 总内存比Python对象内存大很多
**原因**:
- C扩展库占用内存
- 系统缓存
- 内存碎片
- 共享库
**解决方法**:
1. 查看内存映射分析
2. 检查是否有大量C扩展
3. 分析系统级内存使用
### 问题2: 内存持续增长
**原因**:
- 内存泄漏
- 缓存未清理
- 循环引用
**解决方法**:
1. 使用tracemalloc分析内存分配
2. 检查垃圾回收统计
3. 分析大对象列表
### 问题3: 特定对象类型占用过多内存
**解决方法**:
1. 查看对象类型统计
2. 分析大对象详情
3. 检查对象引用关系
## 性能注意事项
1. **详细分析耗时**: `create_detailed_memory_analysis()` 可能需要几秒到几分钟
2. **内存开销**: 分析过程本身会消耗一些内存
3. **建议频率**: 不要过于频繁地运行详细分析建议间隔5分钟以上
## 调试技巧
### 1. 在关键点添加内存检查
```python
def critical_function():
memory_helper = MemoryHelper()
before = memory_helper.get_memory_summary()
# 执行关键操作
do_something()
after = memory_helper.get_memory_summary()
growth = after['total_memory_mb'] - before['total_memory_mb']
if growth > 10:
print(f"警告: 函数执行后内存增长 {growth:.2f} MB")
```
### 2. 监控特定操作
```python
def monitor_operation(operation_name):
memory_helper = MemoryHelper()
before = memory_helper.get_memory_summary()
# 执行操作
result = perform_operation()
after = memory_helper.get_memory_summary()
growth = after['total_memory_mb'] - before['total_memory_mb']
logger.info(f"{operation_name}: 内存增长 {growth:.2f} MB")
return result
```
## 示例输出
### 内存摘要示例
```
total_memory_mb: 708.20
python_objects_mb: 130.45
unaccounted_mb: 577.75
unaccounted_percent: 81.6
```
### 详细分析报告结构
```
详细内存分析报告 - 2025-07-09 14:26:00
====================================================================================================
1. 系统级内存分析
--------------------------------------------------
进程ID: 12345
进程名称: python
内存使用详情:
RSS (物理内存): 708.20 MB
VMS (虚拟内存): 1024.50 MB
共享内存: 45.30 MB
...
2. Python对象深度分析
--------------------------------------------------
总对象数: 1,234,567
对象类型统计 (按内存大小排序):
类型 数量 总大小(MB) 平均大小(B)
str 318,537 34.56 113.5
dict 101,049 32.23 319.2
...
3. 内存映射详细分析
--------------------------------------------------
按权限分类的内存映射:
权限 数量 大小(MB)
r-xp 45 156.78
rw-p 23 89.45
...
4. 大对象详细分析
--------------------------------------------------
大对象 (>1MB) 数量: 15
1. dict - 45.67 MB
字典项数: 125000
示例键: ['user_data', 'cache', 'config']
2. list - 23.45 MB
元素数量: 500000
5. 内存泄漏检测
--------------------------------------------------
tracemalloc当前内存: 125.67 MB
tracemalloc峰值内存: 145.23 MB
内存分配最多的位置 (前15个):
1. 1250 个对象, 45.67 MB
File "/app/core/cache.py", line 123
cache_data = load_large_dataset()
```
这个工具将帮助你全面了解应用程序的内存使用情况,特别是找出那些"消失"的内存去向。