fix memory snapshot

This commit is contained in:
jxxghp
2025-06-08 21:57:49 +08:00
parent 69ade1ae37
commit 3de998051a
3 changed files with 21 additions and 7 deletions
+1 -1
View File
@@ -250,7 +250,7 @@ class ConfigModel(BaseModel):
# 是否启用内存监控 # 是否启用内存监控
MEMORY_ANALYSIS: bool = False MEMORY_ANALYSIS: bool = False
# 内存快照间隔(分钟) # 内存快照间隔(分钟)
MEMORY_SNAPSHOT_INTERVAL: int = 30 MEMORY_SNAPSHOT_INTERVAL: int = 60
# 保留的内存快照文件数量 # 保留的内存快照文件数量
MEMORY_SNAPSHOT_KEEP_COUNT: int = 20 MEMORY_SNAPSHOT_KEEP_COUNT: int = 20
# 全局图片缓存,将媒体图片缓存到本地 # 全局图片缓存,将媒体图片缓存到本地
+19 -5
View File
@@ -1,4 +1,5 @@
import gc import gc
import sys
import threading import threading
import time import time
from datetime import datetime from datetime import datetime
@@ -300,8 +301,8 @@ class MemoryHelper(metaclass=Singleton):
class_name = f"<unknown_class_{id(obj_class)}>" class_name = f"<unknown_class_{id(obj_class)}>"
logger.debug(f"获取类名失败: {e}") logger.debug(f"获取类名失败: {e}")
# 计算对象的内存使用 # 计算对象本身的内存使用(不包括引用对象,避免重复计算)
size_bytes = asizeof.asizeof(obj) size_bytes = sys.getsizeof(obj)
if size_bytes < 100: # 跳过太小的对象 if size_bytes < 100: # 跳过太小的对象
continue continue
@@ -334,9 +335,11 @@ class MemoryHelper(metaclass=Singleton):
def _get_large_variables(self, limit=100): def _get_large_variables(self, limit=100):
""" """
获取大内存变量信息,按内存大小排序 获取大内存变量信息,按内存大小排序
使用已计算对象集合避免重复计算
""" """
large_vars = [] large_vars = []
processed_count = 0 processed_count = 0
calculated_objects = set() # 避免重复计算
# 获取所有对象 # 获取所有对象
all_objects = muppy.get_objects() all_objects = muppy.get_objects()
@@ -347,16 +350,27 @@ class MemoryHelper(metaclass=Singleton):
if isinstance(obj, type): if isinstance(obj, type):
continue continue
try: # 跳过已经计算过的对象
# 计算对象大小 obj_id = id(obj)
size_bytes = asizeof.asizeof(obj) if obj_id in calculated_objects:
continue
try:
# 首先使用 sys.getsizeof 快速筛选
shallow_size = sys.getsizeof(obj)
if shallow_size < 1024: # 只处理大于1KB的对象
continue
# 对于较大的对象,使用 asizeof 进行深度计算
size_bytes = asizeof.asizeof(obj)
# 只处理大于10KB的对象,提高分析效率 # 只处理大于10KB的对象,提高分析效率
if size_bytes < 10240: if size_bytes < 10240:
continue continue
size_mb = size_bytes / 1024 / 1024 size_mb = size_bytes / 1024 / 1024
processed_count += 1 processed_count += 1
calculated_objects.add(obj_id)
# 获取对象信息 # 获取对象信息
var_info = self._get_variable_info(obj, size_mb) var_info = self._get_variable_info(obj, size_mb)
+1 -1
View File
@@ -18,6 +18,6 @@ DB_TIMEOUT=60
# 是否启用内存监控,开启后将定期生成内存快照文件 # 是否启用内存监控,开启后将定期生成内存快照文件
MEMORY_ANALYSIS=false MEMORY_ANALYSIS=false
# 内存快照间隔(分钟) # 内存快照间隔(分钟)
MEMORY_SNAPSHOT_INTERVAL=30 MEMORY_SNAPSHOT_INTERVAL=60
# 保留的内存快照文件数量 # 保留的内存快照文件数量
MEMORY_SNAPSHOT_KEEP_COUNT=20 MEMORY_SNAPSHOT_KEEP_COUNT=20