Порождает ли торнадо новый процесс при получении запроса?

Я использую сервер Tornado с приложением Python Flask. По каждому запросу анализируется целая куча данных и выводятся результаты. Однако через несколько дней оперативная память (50 ГБ) заполняется. Не уверен, почему это происходит.

Дело в том, что как только запрос получен, Tornado порождает новый процесс, который выполняет анализ, доставляет вывод и затем умирает. Или он будет анализировать данные в том же процессе, и переменные, созданные во время него, будут продолжать скрываться даже после того, как ответ будет доставлен. Если это последнее, это может объяснить заполнение ОЗУ. Мой код:

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from app import app

if __name__ == '__main__':
    app.debug=True
    http_server = HTTPServer(WSGIContainer(app))
    http_server.listen(5000)
    IOLoop.instance().start()

Спасибо!

РЕДАКТИРОВАТЬ:

верхний вывод: верхний вывод


person huhahihi    schedule 26.03.2015    source источник
comment
В дополнение к ответу @Juca, какой процесс заполняет память? Что вы делаете в своем приложении? Вероятно, глобальная переменная становится все больше и больше.   -  person onur güngör    schedule 27.03.2015
comment
@onurgüngör нет глобальных переменных. Приложение получает некоторые данные поиска от пользователя, обрабатывает текст на их основе (~ 100 МБ) и затем выводит анализ. По поводу того, что забивает память, не уверен! Выполнение top показывает 50% используемой памяти на верхней панели, где упоминается память, но только 20%, когда я суммирую %MEM процессов.   -  person huhahihi    schedule 27.03.2015
comment
Я подозреваю, что вы ищете не в том месте, можете ли вы опубликовать вывод top?   -  person onur güngör    schedule 28.03.2015
comment
@onurgüngör Отредактировал мой вопрос с верхним выводом. Также ссылка на фото: i.stack.imgur.com/NTrJn.png   -  person huhahihi    schedule 28.03.2015
comment
Мы видим, что процесс, потребляющий память, — это java, а не python. Так что ваша проблема, вероятно, не связана с Tornado.   -  person onur güngör    schedule 28.03.2015
comment
Спасибо, но написано, что java занимает 9,6% mem? Почему %mem и virt не совпадают?   -  person huhahihi    schedule 28.03.2015
comment
Кроме того, когда я перезагружаю систему, virt сразу становится 32 г, однако используемая сверху память составляет всего пару ГБ. Но со временем количество используемой памяти продолжает расти, но virt в Java остается на уровне 32 г, а %mem на уровне ~ 9%.   -  person huhahihi    schedule 28.03.2015
comment
Процесс может отображать сколько угодно, так что это нормально. Я не могу сказать точную сумму, но она в основном ограничена вашей архитектурой, см. stackoverflow.com/a/11295206/645853   -  person onur güngör    schedule 28.03.2015


Ответы (1)


Нет, торнадо не создает новый процесс при каждом запросе.

person Juca    schedule 26.03.2015
comment
Спасибо. Означает ли это, что все выполняется в одном и том же процессе, а переменные, созданные в предыдущем запросе, все равно останутся в оперативной памяти после того, как запрос будет обслужен? - person huhahihi; 27.03.2015
comment
Тот же процесс да, одни и те же переменные нет (конечно, зависит от того, что вы делаете). Для каждого запроса создается новый экземпляр RequestHandler. - person Juca; 28.03.2015