#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.