0

我在 python27 运行时有一个批处理后端(B4),启用了线程。它做了一堆 unpickle/pickle 和 Numpy/array 的东西。

最近我注意到我收到了更高的后端费用,几乎每次都会达到配额。我迁移到模块(也是 B4),认为这可能会解决它,因为我看到了“正在删除后端”通知。但是,我仍然看到同样的问题。

似乎发生的情况是代码挂在最后一个(总是最后一个)内存缓存写入,直到我的配额用完。/_ah/stop 调用的那一刻(由于配额)后端再次唤醒并恢复其处理,然后由于关闭请求而退出。

以下是所有相关日志:

2013-08-05 15:23:33.962 /BatchRankings 5​​00 19413478ms 0kb 实例=0 AppEngine-Google;(+http://code.google.com/appengine)

我 2013-08-05 10:00:04.118
meleerumble 开始时的内存使用量:24.55078125MB

...更多日志...

我 2013-08-05 10:01:03.550
将机器人分成 18 个部分

我 2013-08-05 15:23:03.086
向 memcache 写入了 564 个机器人

2013-08-05 15:23:33.962
进程终止,因为后端关闭时间过长。

查看拆分和写入内存缓存之间的时间戳。超过 5 个小时,这应该需要几秒钟(并且在所有其他时间循环此代码)。

此外,在实际请求处理程序下方的日志中,我看到了以下内容:

2013-08-05 15:23:02.938 /_ah/stop 200 5ms 0kb instance=0

因此,据我所知,后端似乎挂在内存缓存写入中,当我达到配额时 /_ah/stop 将其唤醒。

这是这两个日志记录点之间的相关代码:


client = memcache.Client()
if len(botsdict) > 0:
    splitlist = dict_split(botsdict,32)
    logging.info("split bots into " + str(len(splitlist)) + " sections")

    for d in splitlist:
    rpcList.append(client.set_multi_async(d))
    logging.info("wrote " + str(len(botsdict)) + " bots to memcache")

我看不出 18 个 set_multi_async 调用如何花费 5h23m。这里的日志可以信任吗?可能是实际代码已经完成,但不知何故退出从未注册并且日志记录是问题?因此,我不得不禁用我的后端处理,因为它只会吃掉我扔给它的配额。

任何有关地球上正在发生的事情的帮助将不胜感激。

4

0 回答 0