2015-12-14 2 views
2

У приложения App Engine возникают проблемы с утечкой памяти. Я записываю использование памяти на пути поиска проблемы.Использование памяти сильно отличается (и, как ни странно) между интерфейсом и бэкендом

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

Функция, которая превысила «ограниченную ограниченную память» в 128 МБ, находится в отложенной задаче. Он должен вести себя одинаково каждый раз. Я перезапускаю его из очереди задач консоли (backend) и из внешнего интерфейса через 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 

У меня есть три проблемы с результатом:

  • Один vs. две трети общего объема памяти бассейном выделяется в начале
  • Бэкэнд использует вдвое больше памяти (работает с той же функцией)
  • Использование памяти backend не увеличивается со временем, как это делает frontend.

Может ли кто-нибудь это понять для меня?

ответ

1

Помимо использования памяти можно было бы ожидать на основании фактической деятельности, связанную с запросами они работают, экземпляры также имеют переменное использование памяти кросса-запрос смещение, в то числе, например:

  • в язык (питон) песочница сам
  • дополнительные библиотеки питона, загруженные во время обработки предыдущих запросов, полученных до сих пор (например, бэкенд может загрузить defered библиотеку, а frontent не мог)
  • остатков еще не очищен сборщик мусор (они должны в конечном итоге уйти, но случайные пики активности может вызвать превышение предела и даже смерть экземпляра (и перезагрузка) - вы заметите, что смерть происходит, когда использование идет значительно выше предела, я видел, например,> 150MB для предела 128M)

Загрузка библиотек по требованию является типичным методом улучшения времени запуска экземпляра. Такая техника приведет именно к тому, что может показаться утечкой памяти, но это не обязательно означает, что это действительно утечка памяти.

Также возможно, что 128M просто недостаточно для приложения (вы будете удивлены, сколько действительно может понадобиться, а 128M - не много!), Обновление типа экземпляра - единственный способ двигаться вперед. На самом деле вы можете попробовать его сейчас и следить за использованием - 6 запросов - IMHO недостаточно для установки шаблона - если вы обновляете и видите, что использование памяти в конечном итоге выравнивается, то, скорее всего, вам потребуется обновление. Если он не выравнивается, то, скорее всего, у вас действительно есть утечка памяти.

Смежные вопросы