前端和后端之间的内存使用差别很大(而且很奇怪)

时间:2015-12-14 13:41:09

标签: python google-app-engine memory memory-leaks task-queue

My App Engine应用程序存在内存泄漏问题。 我记录了内存使用情况以找到问题。

from google.appengine.api.runtime import memory_usage
memory_usage().current()

超出“128 MB的软私有内存限制”的功能在延迟任务范围内。它每次都应该表现相同。 我从控制台任务队列(后端)和前端通过get-request重新运行它。两者都在第6个日志之后获得异常。

结果不同是我无法绕过的方式:

<Frontend-run>
1: 40.3515625
2: 50.3515625
3: 59.71875
4: 63.5234375
5: 72.49609375
6: 75.48046875

<Backend-run>
1: 98.83203125
2: 98.83203125
3: 98.83203125
4: 98.83203125
5: 98.83203125
6: 98.83203125

结果有三个问题:

  • 在开始时分配总内存池的一分之二到三分之二
  • 后端使用两倍的内存(运行相同的功能)
  • 后端内存使用量不会像前端那样随时间增加。

任何人都可以为我理解这一点吗?

1 个答案:

答案 0 :(得分:1)

除了根据与其处理的请求相关的实际活动所期望的内存使用情况,实例还具有可变的交叉请求内存使用偏移量,例如:

  • 语言(python)沙箱本身
  • 在处理到目前为止收到的先前请求时加载的其他python库(例如,后端可能会加载deferred库而前端可能不会加载)
  • 垃圾收集器尚未清理残羹剩饭(它们应该最终消失,但偶尔的活动高峰可能会导致超出限制甚至实例死亡(并重新开始) - 你会发现死亡发生在使用时显着超出限制,我看到,例如,对于128M限制,> 150MB)

库的按需加载是改善实例启动时间的典型方法。这种技术将导致内存泄漏,但并不一定意味着它确实是内存泄漏。

128M对于一个应用程序来说也是不够的(你会惊讶地发现实际需要多少而且128M不是很多!),升级实例类型是前进的唯一方法。你现在可以尝试并监控使用情况 - 6个请求是恕我直言,不足以建立一个模式 - 如果你升级,你看到内存使用最终趋于稳定,那么你很可能需要升级。如果它没有平衡,那么你可能实际上有内存泄漏。