记一次python mem排错

在运行Docker容器时遇到内存占用过高导致测试样例被kill的问题,通过使用memory_profiler和meliae等工具定位到Python中不当使用range导致内存泄漏,将range替换为xrange后问题得以解决。

docker run 一个容器(多个测试样例)。结果显示 有个测试样例被 killed 。

docker stats 查看 ,发现内存接近90G;而我实际运行时 只有 1G的内存。所以被killed。

[root@a34h05007.cloud.h05.amtest87 /root]
#docker stats --no-stream|head -n 1;while [[ true ]];do echo time sleep 1 >/dev/null 2>&1;docker stats --no-stream|grep aedfae9724a8;done
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
aedfae9724a8 119.02% 85.88 GiB / 94.28 GiB 91.08% 0 B / 0 B 12.29 kB / 33.52 MB 4
aedfae9724a8 126.96% 86.16 GiB / 94.28 GiB 91.39% 0 B / 0 B 12.29 kB / 33.52 MB 4
aedfae9724a8 72.66% 86.34 GiB / 94.28 GiB 91.58% 0 B / 0 B 12.29 kB / 33.52 MB 4
aedfae9724a8 54.95% 86.56 GiB / 94.28 GiB 91.81% 0 B / 0 B 12.29 kB / 33.52 MB 4

接着用
在用 memory_profiler, meliae等工具分析,
debug 一步步排查。
发现有个 dict ,
DEFAULT_QUERY_RETRY_COUNT =1000000
for _c in range(DEFAULT_QUERY_RETRY_COUNT):
而我的 python version 为 2.7 , 此时的range是展开一个dict,而不是生成器,所以占据了大量内存。 遂修改。用xrange.

sed -i 's/for _c in range(DEFAULT_QUERY_RETRY_COUNT/for _c in xrange(DEFAULT_QUERY_RETRY_COUNT/' logclient.py

修改之后。好了。 就这样。

### Python 内存管理 Python 的内存管理主要依赖于私有的堆空间,所有 Python 对象和数据结构都位于此私有堆中。当解释器启动时,会自动初始化并管理这块区域。Python 使用引用计数作为垃圾回收的主要手段之一;每当有一个新的引用指向某个对象时,其内部的引用计数就会增加,而当不再有任何引用指向该对象时,则减少相应的计数直至变为零,此时对象会被销毁并释放所占用的空间[^1]。 此外,在 Python 中还存在一种称为“自由列表”的特殊机制,专门用来处理频繁创建和销毁的小型固定大小的对象(如整数、短字符串)。这种技术能够显著降低因不断申请/释放相同尺寸内存带来的开销,从而提升整体效率[^5]。 ### 内存泄漏检测方法 针对可能出现的内存泄漏情况,开发者可以利用多种工具来进行诊断: - **`tracemalloc` 模块**:自 Python 3.4 版本起被引入的标准库组件,允许追踪程序执行期间发生的每一次动态内存分配操作。借助 `tracemalloc` 提供的功能,不仅可以获取到当前活跃分配的信息统计摘要,还能对比不同时间点之间的差异,进而定位潜在的问题源头[^3]。 ```python import tracemalloc # 开始跟踪前先清空之前的数据 tracemalloc.clear_traces() # 启动跟踪 tracemalloc.start() # 执行待测代码... data = [] for i in range(10000): data.append([i]*10) snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') print("[ Top 10 ]") for stat in top_stats[:10]: print(stat) ``` 除了上述官方提供的解决方案外,还有其他第三方软件包可供选择,比如 Py-Spy 或者 Memory Profiler 等,它们各自具备独特的优势来辅助分析复杂场景下的资源消耗状况。 ### 内存优化建议 为了避免不必要的内存浪费现象发生,并确保应用程序能够在长时间稳定运行的同时保持良好的性能表现,应当遵循以下几个原则: - 尽量采用弱引用代替强引用,尤其是在缓存设计方面; - 明确控制好各个实例化对象在整个生命周期内的存活范围; - 减少全局变量的数量及其作用域影响程度; - 定期审查现有逻辑是否存在循环引用等问题,及时清理无用项以防止隐匿式的泄露风险积累[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值