У меня есть некоторые проблемы с освобождением памяти в Торнадо. Мой обработчик загружает часть большого байтового файла и записывает его в ответ. Но чем больше параллельных запросов, тем больше памяти используется (это логично). Но после окончания запросов память не свободна!
Мой код:
import tornado.ioloop
import tornado.web
import tornado.gen
from tornado.httpclient import AsyncHTTPClient, HTTPRequest
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient", max_clients=50)
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
url = "http://example.com/big_bytes_file"
request = HTTPRequest(url, headers={'Range': 'bytes=0-1048576'}, method='GET')
client = AsyncHTTPClient()
range_resp = yield client.fetch(request)
self.write(range_resp.body)
def make_app():
return tornado.web.Application([(r"/", MainHandler), ])
if __name__ == "__main__":
app = make_app()
app.listen(5000)
tornado.ioloop.IOLoop.current().start()
Что я делаю?
Я вижу использование памяти после запуска приложения (111 МБ):
память после запуска
Отправка одного запроса. Увеличение памяти (114 МБ): 114 МБ
Отправка параллельных запросов от 25 пользователей. Память - 123 МБ.
Отправка параллельных запросов от 50 пользователей. Память - 153 МБ.
Отправка параллельных запросов от 100 пользователей. Память - 205 МБ.
Ожидание несколько минут. Память не уменьшается.
Почему это? :)
P.S. Например, мы отправляем запросы от 80 пользователей. После этого память увеличится. После этого память будет увеличиваться только в том случае, если количество пользователей превышает 80.