Использование памяти сильно (и странно) отличается между внешним и внутренним интерфейсом
У моего приложения App Engine возникла проблема с утечкой памяти. Я регистрирую использование памяти по пути, чтобы найти проблему.
from google.appengine.api.runtime import memory_usage
memory_usage().current()
Функция, которая превысила "мягкое ограничение частной памяти 128 МБ", находится в отложенной задаче. Он должен вести себя одинаково каждый раз. Я перезапускаю его из очереди задач консоли (бэкэнда) и из внешнего интерфейса через запрос get. Оба получают исключение после 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
У меня три проблемы с результатом:
- Одна или две трети общего пула памяти выделяется в начале
- Backend использует вдвое больше памяти (работает с той же функцией)
- Использование памяти бэкэндом не увеличивается со временем, как это делает фронтенд.
Кто-нибудь может понять это для меня?
1 ответ
Помимо использования памяти, которое вы ожидаете, исходя из фактической активности, связанной с запросами, которые они обрабатывают, экземпляры также имеют переменное смещение использования памяти между запросами, включая, например:
- сама песочница языка (python)
- дополнительные библиотеки python, загруженные при обработке предыдущих запросов, полученных до сих пор (например, бэкэнд может загрузить защищенную библиотеку, а frontent - нет)
- остатки, еще не очищенные сборщиком мусора (они в конечном итоге должны исчезнуть, но случайные пики активности могут привести к превышению лимита и даже смерти экземпляра (и перезапуску) - вы заметите, что смерть происходит, когда использование значительно превышает лимит, я видел, например, >150MB для предела 128M)
Загрузка библиотек по требованию является типичным методом улучшения времени запуска экземпляра. Такая техника приведет именно к тому, что может появиться утечка памяти, но это не обязательно означает, что это действительно утечка памяти.
Также возможно, что 128M просто недостаточно для приложения (вы будете удивлены, сколько на самом деле может понадобиться, а 128M не так уж много!), Обновление типа экземпляра - единственный способ двигаться вперед. Вы можете попробовать это прямо сейчас и следить за использованием - 6 запросов ИМХО недостаточно для установления шаблона - если вы обновляете и видите, что использование памяти со временем выравнивается, вероятно, вам нужно обновление. Если он не выровняется, то, скорее всего, у вас есть утечка памяти.