Upload
anton-patrushev
View
616
Download
8
Tags:
Embed Size (px)
DESCRIPTION
Доклад о GC в риалтайм приложениях.
Citation preview
Памяти.Питона
Трактатъ. АнтонПатрушевMoscow Python Meetup, 19/07/2014
« ? ?»А тыкто такой Откуда взялся
« …»С того берега моря © Арменфильм
Noda Interaction Platforms (former Naumen Phone) CTO, Co-Founder, Software Architect
PyCon Russia основатель ипрограммныйдиректор
« ? ?»А тыкто такой Откуда взялся
15 лет C++ / 10 лет Python -Сервер сайд / Проектирование разработка
Highload, Real-time. Naumen way.
ПОдля контактных центров / Тысячи операторов одновременныхвызовов
Микросервисная архитектура C++/Python/Java ( и даже node.js, , вроде F-u-u-u-u!!!) Home-made XML-RPC
Twisted 1000 rps на один процесс Python – Время ответа не более парымиллисекунд
Кто знает как устроено управление
памятьюв CPython?
Управление памятьюв CPython
Reference counting Garbage collector Anything else?
Подсчёт ссылок
Считается механизмом сборки мусора Python Documentation: http://goo.gl/j0mL84 obj->refcnt++ if (--obj->refcnt == 0) delete obj
На самом деле конечноже не delete Каскадное уменьшение счётчиков
ссылок при удалении объекта
Подсчёт ссылок
Подсчёт ссылок
!!!Бинго
__del__
Никогда не используйте __del__ Я вас предупредил __del__ не деструктор из C++ ( - из за
)автоматической сборки мусора [del x] не приводит к вызову [x.__del__] Делать RAII __с использование del__ ОПАСНО
Resource Acquisition Is Initialization Есть ситуации в которых ваш __del__ не будет
вызван вообще никогда
__del__
Подсчёт ссылок
Циклы GC
GC. Основы
Stop The World Базируется на поколениях Запуск по событиям
Gen(0): (allocates-deallocates) Gen(x): num(Gen(x-1)) for x in (1,2)
Управляется при помощиgc.set_threshold
Возвращает память ОС (!!!)
GC и Realtime
?Когда запустится сборка .Не известно ? .Сколько она будет длиться Не известно =Наш выбор > gc.disable
Есть лижизнь без gc?
Финализировать объекты явно Explicit is better than implicit
Следить за памятью при тестировании ипосле
gc.get_count()[0]=>Gen(0) работать не перестаёт Ловить циклы
gc.set_debug(gc.DEBUG_SAVEALL) gc.collect gc.garbage
Есть лижизнь без gc?
(!!!)Сделайте бэкдор в своё приложение twisted.manhole rfoo.utils.rconsole pydevd ( ) теоретически возможно подключиться GDB
Включите в установку objgraph
gc.garbage + objgraph
gc.garbage + objgraph
?Что делать с циклами
Явная финализация с чисткой ссылок weakref Можно хранить id(obj) вместо obj
Не делайте так – Хотя иногда можно
, Уважаемые знатоки пишет…вам
Неожиданныйцикл: __closure__
Опасный трюк с id(obj)
… или безопасныйweakref
Какжить не отключая GC?
Полная сборка мусора после warm-up « 2»Переместит вечные объекты в поколение
Настройка threshold’s Зависит от приложения Gen(0) => - кол во объектов при предельнойнагрузке
Gen(1) => X Gen(2) => 0 ( )отключаем
Это в любом случае фриз
Ссылки
Python Doc’s https://docs.python.org/2/library/gc.html https://docs.python.org/2/c-api/intro.html
Visualizing Garbage Collection in Ruby and Python http://patshaughnessy.net/2013/10/24/visualizing-
garbage-collection-in-ruby-and-python http://www.youtube.com/watch?v=qzEekAnAS_g
. ?Костя Лопухин На что уходит память http://www.youtube.com/watch?v=OYgRozleVG4