Вроде CPython умеет считать ссылки и, например, закрывать файлы, на которые больше никто не ссылается. Возможно, что-нибудь такое происходит с нативными буферами или чем-то таким, типа with забыли
Много читаю, сам не пишу. Знаю, что на этом канале есть Python специалисты. Хотел бы спросить вопрос связанный на тему memory leak/garbage collection.
На моем новом проекте используется Python. (Я сам не являюсь разработчиком Python). Один из сервисов приложения с CPython перевели на PyPy, чтобы сделать его более производительным.
Обнаружили, что сервис, запущенный на Pypy потребляет память так словно там есть memory leak. Однако, сервис запущен на PythonC работает иначе и с памятью все в порядке. Немного изучив то как работает GC в PythonC/Pypy решил собрать метрики с помощью memory_profiler и понять в чем разница. В итоге, обнаружил, что память затраченная на выполнение socketio.emit(source, payload, broadcast=True) только растет и практически не освобождается.
есть способы как заставить GC работать по другому, и я делал пару экспериментов, и все равно не добился результата. Я не уверен, что запускать gc.collect() с периодичностью считается правильным. Я также не уверен, что проблема в самом socketio package, и тем как он работает с PyPy.
Возможно нужно заставить работать GC правильнее, но мануально управлять памятью не хотелось бы.
да, читал про эти параметры и пробовал менять их. Запускал тест на 12 часов. Не заметил разницы, но возникла мысль попробовать поиграться еще раз и запустить сервис на более долгое время. Как раз выходные впереди :) спасибо
да, читал про эти параметры и пробовал менять их. Запускал тест на 12 часов. Не заметил разницы, но возникла мысль попробовать поиграться еще раз и запустить сервис на более долгое время. Как раз выходные впереди :) спасибо
обычно pypy отжирает память до максимума, а но потом не растет. Тюнинг PYPY_GC_MAX / PYPY_GC_MIN должен помочь
да, читал про эти параметры и пробовал менять их. Запускал тест на 12 часов. Не заметил разницы, но возникла мысль попробовать поиграться еще раз и запустить сервис на более долгое время. Как раз выходные впереди :) спасибо
дефолты точно есть, но я их не знаю. попробуй посмотреть что дает gc.get_stats
как там было, если ты хочешь вызывать gc.collect() - либо ты полностью даешь себе отчет что ты делаешь и зачем, либо от безысходности и совсем не понимаешь что делаешь