Skip to main content
 首页 » 编程设计

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

2025年05月04日17yxwkf

我的 App Engine 应用程序存在内存泄漏问题。 我一路记录内存使用情况以查找问题。

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

超过“128 MB 的软私有(private)内存限制”的函数在延迟任务中。它应该每次都表现相同。 我从控制台任务队列(后端)和前端通过 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 

我对结果有三个问题:

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

有人能帮我解释一下吗?

请您参考如下方法:

除了您根据与它们处理的请求相关的实际事件所期望的内存使用量之外,实例还具有可变的跨请求内存使用量偏移量,例如包括:

  • 语言(python)沙箱本身
  • 在处理迄今为止收到的先前请求时加载的其他 python 库(例如,后端可能会加载延迟库,而前端可能不会)
  • 垃圾收集器尚未清理的剩余物(它们最终应该会消失,但偶尔的事件高峰可能会导致超过限制甚至实例死亡(并重新启动) - 你会注意到死亡发生在使用结束时 显着超出限制,例如,我看到 128M 限制为 >150MB)

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

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