Торнадо не освобождает память после многих подключений для скачивания - PullRequest
0 голосов
/ 10 мая 2018

У меня есть некоторые проблемы с освобождением памяти в Торнадо. Мой обработчик загружает часть большого байтового файла и записывает его в ответ. Но чем больше параллельных запросов, тем больше памяти используется (это логично). Но после окончания запросов память не свободна!

Мой код:

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()

Что я делаю?

  1. Я вижу использование памяти после запуска приложения (111 МБ): память после запуска

  2. Отправка одного запроса. Увеличение памяти (114 МБ): 114 МБ

  3. Отправка параллельных запросов от 25 пользователей. Память - 123 МБ.

  4. Отправка параллельных запросов от 50 пользователей. Память - 153 МБ.

  5. Отправка параллельных запросов от 100 пользователей. Память - 205 МБ.

  6. Ожидание несколько минут. Память не уменьшается.

Почему это? :)

P.S. Например, мы отправляем запросы от 80 пользователей. После этого память увеличится. После этого память будет увеличиваться только в том случае, если количество пользователей превышает 80.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...