У меня время от времени возникает Exceeded soft private memory limit
ошибка в большом количестве обработчиков запросов в движке приложений. Я понимаю, что эта ошибка означает, что объем ОЗУ, используемый экземпляром, превысил выделенный объем, и как это вызывает отключение экземпляра.
Я хотел бы понять, каковы могут быть возможные причины ошибки, и для начала я хотел бы понять, как экземпляры python движка приложений должны управлять памятью. Мои элементарные предположения были:
- Экземпляр F2 начинается с 256 МБ
- Когда он запускается, он загружает мой код приложения - скажем, 30 МБ
- When it handles a request it has 226 MB available
- so long as that request does not exceed 226 MB (+ margin of error) the request completes w/o error
- если он превышает 226 МБ + маржа, экземпляр завершает запрос, регистрирует ошибку «Превышено мягкое ограничение частной памяти», затем завершает работу - теперь вернитесь к шагу 1
- Когда этот запрос возвращается, вся используемая им память освобождается, т.е. неиспользуемая оперативная память возвращается к 226 МБ
- Шаги 3-4 повторяются для каждого запроса, переданного экземпляру, бесконечно.
Вот как я предположил, что это сработает, но, учитывая, что я иногда вижу эту ошибку в довольно широком наборе обработчиков запросов, я м сейчас не так уверен. Мои вопросы:
а) Происходит ли шаг №4?
б) Что могло привести к тому, что этого не произошло? или полностью не получиться? например как могла утечка памяти между запросами?
c) Может ли хранение в переменных уровня модуля вызвать утечку памяти? (Я не намеренно использую переменные уровня модуля таким образом)
г) Какие инструменты / методы я могу использовать для получения дополнительных данных? Например. измерить использование памяти при входе в обработчик запросов?
В ответах / комментариях, по возможности, ссылайтесь на документацию gae.
[править] Дополнительная информация: мое приложение сконфигурировано как threadsafe: false
. Если это имеет отношение к ответу, укажите, пожалуйста, что это такое. В ближайшее время планирую перейти на threadsafe: true
.
[править] Уточнение: Этот вопрос касается ожидаемого поведения gae в отношении управления памятью. Таким образом, хотя такие предложения, как «позвоните gc.collect()
», вполне могут быть частичным решением связанных проблем, они не дают полного ответа на этот вопрос. До тех пор, пока я не пойму, как ожидается поведение gae, использование gc.collect()
будет для меня ощущаться как программирование вуду.
Наконец: если у меня все это задом наперед, я заранее извиняюсь - я действительно не могу найти много полезной информации по этому поводу, поэтому в основном предполагаю ..