如何用Python编写故意占用内存的程序用于测试?
模拟AWS Lambda内存耗尽的Python测试方案
以下是几种可控的内存占用实现方法,可用于复现Lambda无错误终止的场景:
方法1:大列表填充字节块(简单直接)
通过持续向列表中添加固定大小的字节块,精准控制内存占用量,适合快速模拟内存耗尽:
import sys def occupy_memory(target_mb): block_size = 1024 * 1024 # 单块1MB block = b'x' * block_size memory_blocks = [] # 循环添加块,直到接近目标内存 while sys.getsizeof(memory_blocks) + len(memory_blocks)*block_size < target_mb * block_size: memory_blocks.append(block) def lambda_handler(event, context): # 按需设置目标内存,比如接近你的Lambda配置上限(如512MB) occupy_memory(500) return {"statusCode": 200, "body": "内存占用测试执行中"}
说明:Lambda内存耗尽时会直接终止进程,不会输出常规错误日志,与你遇到的现象一致。可通过CloudWatch的Memory Used指标确认实际占用量。
方法2:大量小对象累积(贴近业务场景)
如果你的业务代码是因创建大量小对象导致内存溢出,可模拟这种场景:
import sys class BusinessObject: def __init__(self): # 每个实例携带1KB的业务数据 self.payload = b'data' * 256 def occupy_memory(target_mb): object_pool = [] per_obj_size = 1024 # 单对象约1KB target_bytes = target_mb * 1024 * 1024 count = 0 while sys.getsizeof(object_pool) + count * per_obj_size < target_bytes: object_pool.append(BusinessObject()) count += 1 def lambda_handler(event, context): occupy_memory(400) return {"statusCode": 200, "body": "小对象内存测试执行中"}
方法3:Numpy大数组(适合数据处理场景)
如果你的Lambda使用Numpy处理数据,可通过创建超大数组快速占满内存:
import numpy as np def lambda_handler(event, context): # 创建1024MB的float64数组(每个元素8字节,共134217728个元素) large_array = np.ones((134217728,), dtype=np.float64) # 保持引用防止GC回收 return {"statusCode": 200, "body": "Numpy内存测试执行中"}
测试注意事项
- 逐步调整目标内存值,从低于Lambda配置上限开始,逐步增加到超过上限,观察是否出现无错误终止
- 查看CloudWatch日志:内存耗尽时通常只有启动记录,无正常结束日志,或显示进程意外终止
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

