Python在芹菜检索结果时快速泄漏内存
我为将任务添加到my Cellery队列而编写的脚本正在泄漏内存(内核在20分钟后终止进程)。在这个脚本中,我只是每隔60秒重复执行相同的300个任务(在Python在芹菜检索结果时快速泄漏内存,python,memory-leaks,rabbitmq,celery,rpc,Python,Memory Leaks,Rabbitmq,Celery,Rpc,我为将任务添加到my Cellery队列而编写的脚本正在泄漏内存(内核在20分钟后终止进程)。在这个脚本中,我只是每隔60秒重复执行相同的300个任务(在中,而True:) 传递给任务的参数,makeGroupRequest(),是包含字符串的字典,根据hpy和objgraph,dicts和字符串也是内存中无法控制的增长。我已经在下面的循环的连续迭代中包含了hpy的输出 我花了好几天的时间在这上面,我不明白为什么内存会不可控地增长,因为循环之间没有重复使用的东西。如果我跳过任务的检索,内存似乎不
中,而True:
)
传递给任务的参数,makeGroupRequest()
,是包含字符串的字典,根据hpy和objgraph,dicts和字符串也是内存中无法控制的增长。我已经在下面的循环的连续迭代中包含了hpy的输出
我花了好几天的时间在这上面,我不明白为什么内存会不可控地增长,因为循环之间没有重复使用的东西。如果我跳过任务的检索,内存似乎不会泄漏(因此实际上是.get()调用泄漏内存)。我如何确定发生了什么以及如何阻止增长
下面是正在执行的代码的概要。我正在使用rpc://后端
while True:
# preparation is done here to set set up the arguments for the tasks (processedChains)
chains = []
for processedChain in processedChains:
# shorthanding
supportingData = processedChain["supportingDataAndCheckedGroups"]
# init the first element, which includes the supportingData and the first group
argsList = [(supportingData, processedChain["groups"][0])]
# add in the rest of the groups
argsList.extend([(groupInChain,) for groupInChain in processedChain["groups"][1:]])
# actually create the chain
chain = celery.chain(*[makeGroupRequest.signature(params, options={'queue':queue}) for params in argsList])
# add this to the list of chains
chains.append(chain)
groupSignature = celery.group(*chains).apply_async()
# this line appears to cause a large increase in memory each cycle
results = groupSignature.get(timeout = 2 * acceptableLoopTime)
time.sleep(60)
以下是成功运行时的hpy
输出:
循环2:
Partition of a set of 366560 objects. Total size = 57136824 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 27065 7 17665112 31 17665112 31 dict (no owner)
1 122390 33 11966720 21 29631832 52 unicode
2 89133 24 8291952 15 37923784 66 str
3 45448 12 3802968 7 41726752 73 tuple
4 548 0 1631072 3 43357824 76 dict of module
5 11195 3 1432960 3 44790784 78 types.CodeType
6 9224 3 1343296 2 46134080 81 list
7 11123 3 1334760 2 47468840 83 function
8 1414 0 1274552 2 48743392 85 type
9 1414 0 1240336 2 49983728 87 dict of type
循环3:
Index Count % Size % Cumulative % Kind (class / dict of class)
0 44754 9 29240496 37 29240496 37 dict (no owner)
1 224883 44 20946280 26 50186776 63 unicode
2 89104 18 8290248 10 58477024 74 str
3 45455 9 3803288 5 62280312 79 tuple
4 14955 3 2149784 3 64430096 81 list
5 548 0 1631072 2 66061168 83 dict of module
6 11195 2 1432960 2 67494128 85 types.CodeType
7 11122 2 1334640 2 68828768 87 function
8 1402 0 1263704 2 70092472 88 type
9 1402 0 1236976 2 71329448 90 dict of type
原来这是芹菜里的虫子。切换到
memcache
后端完全解决了内存泄漏问题。希望这个问题能在后续版本中得到解决 原来这是芹菜里的虫子。切换到memcache
后端完全解决了内存泄漏问题。希望这个问题能在后续版本中得到解决 每个任务返回的是什么?可能是您的任务返回的值太大,生产者无法重新计算。每个任务都在构造一个字典,然后将该字典附加到列表并返回该列表(该列表将传递给链中的下一个任务)。我刚刚打印出返回值的大小,它在给定的周期内从~539字节增长到~12890字节(即完成的第一个任务的返回值为539字节,最后一个任务的返回值为12890字节)。我不应该手动沿链传递结果吗?我已经完成了另一个脚本,没有内存泄漏。我如何测试你的猜测是否正确?每个任务返回的是什么?可能是您的任务返回的值太大,生产者无法重新计算。每个任务都在构造一个字典,然后将该字典附加到列表并返回该列表(该列表将传递给链中的下一个任务)。我刚刚打印出返回值的大小,它在给定的周期内从~539字节增长到~12890字节(即完成的第一个任务的返回值为539字节,最后一个任务的返回值为12890字节)。我不应该手动沿链传递结果吗?我已经完成了另一个脚本,没有内存泄漏。我如何测试你的猜测是否正确?