Стандарт GAE Python: превышен лимит жесткой памяти, а RSS в два раза меньше

#python #google-app-engine #google-app-engine-python

#python #google-app-engine #google-app-engine-python

Вопрос:

У меня есть приложение в App Engine Python3 Standard Env (Flask). Приложение обрабатывает изображения. Он загружает и изменяет их размер, используя временное пространство (/tmp). Для обработки изображений используется Pillow (PIL.Image), который загружает все в память. Таким образом, приложение занимает довольно много памяти, потому что изображения могут быть большими (например, 6000×6000). Я начал получать ошибку «Превышен лимит жесткой памяти» в экземплярах F1 / F2 / B1 / B2. И это было отчасти понятно. Поэтому я добавил трассировку с текущим значением максимального размера резидентного набора RSS, используя модуль ресурсов Python:

 maxrss = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
 

и увеличил класс экземпляра до B4 (1 ГБ оперативной памяти).
Но это не помогло. Вот журнал из облачного ведения журнала:

 2021-12-09 18:17:49.352 MSK 291 - mem: 418,088
2021-12-09 18:17:49.476 MSK Exceeded hard memory limit of 1024 MB with 1075 MB after servicing 7 requests total. Consider setting a larger instance class in app.yaml.
2021-12-09 18:17:49.478 MSK [start] 2021/12/09 15:17:49.477740 Quitting on terminated signal
2021-12-09 18:17:49.483 MSK [10] [INFO] Handling signal: term
2021-12-09 18:17:49.616 MSK 292 - mem: 418,088
 

291 и 202 — количество итераций по всем изображениям, а mem — это max_rss, сообщаемый resource модулем.

Я не могу понять, почему существует такая большая разница между RSS серверного процесса и памятью службы GAE, как это видит AppEngine.

Я понимаю, что серверный код выполняется внутри ОС, а ОС находится внутри Docker, а GAE измеряет память сверху, но 600 МБ для Linux и Docker кажется слишком большим, не так ли?

Первый вопрос: как я могу понять, сколько памяти на самом деле потребляет мой код в GAE? И почему существует такая большая разница между памятью GAE и RSS процесса?

Комментарии:

1. Возможно ли, что 291 и 292 ссылаются на память, используемую в 1 запросе, если GAE вызывает проблему из-за кумуляции по нескольким запросам (в вашем журнале указано всего 7 запросов). Можете ли вы выяснить, запускает ли ваше приложение несколько запросов, и можете ли вы сузить его до 1, чтобы сравнить потребление памяти?

2. конечно, это всего лишь одна просьба. Это «после обслуживания всего 7 запросов» не имеет значения. На самом деле я запускаю серверный контроллер со стороны клиента, который выполняет всю обработку изображений. Это занимает около 10-15 минут. За это время больше никаких запросов не поступало.

Ответ №1:

Что ж, я нашел ответ на то, что занимало память. Согласно https://cloud.google.com/appengine/docs/standard/python3/using-temp-files:

Все файлы в этом каталоге (т. Е. /tmp, добавленный мной) хранятся в ОЗУ экземпляра, поэтому запись в /tmp занимает системную память. Кроме того, файлы в каталоге /tmp доступны только экземпляру приложения, создавшему эти файлы.

Это так просто. Итак, в основном ограничение памяти класса экземпляра — это сумма памяти процесса и всех файлов, которые вы создали в папке / tmp.