SlideShare a Scribd company logo
..
Проблема
Теория
Инструменты
Решения
.
..На что уходит
память?
..
Проблема
Теория
Инструменты
Решения
Проблема утечка памяти
...
2
..
Проблема
Теория
Инструменты
Решения
Проблема утечка памяти
...
3
..
Проблема
Теория
Инструменты
Решения
”
Решение“ проблемы
...
4
..
Проблема
Теория
Инструменты
Решения
Проблема: производительность
...
5
..
Проблема
Теория
Инструменты
Решения
Ограничение размера задачи
Объем памяти может ограничить максимальный размер
решаемой задачи
Изменить алгоритм так, чтобы не все держать в памяти,
часто сложно
...
6
..
Проблема
Теория
Инструменты
Решения
Делаем ненужную работу
Тратим лишнюю память и:
не в лезаем влезаем в кэш процессовра
делаем лишнюю работы по выделению и сборке памяти
...
7
..
Проблема
Теория
Инструменты
Решения
I/O bound?
Часто можно превратить I/O bound задачу в CPU или Memory
bound, и увеличить производительность
...
8
..
Проблема
Теория
Инструменты
Решения
Ограничение числа процессов
Хотим использовать все ядра сервера
...
9
..
Проблема
Теория
Инструменты
Решения
Ограничение числа процессов
Хотим использовать все ядра сервера
Типичный сервер:
8-256 Гб памяти
4-128 ядер, 1-2 процесса на ядро
0.5-5 Гб памяти на процесс
...
10
..
Проблема
Теория
Инструменты
Решения
Что такое память
Один из основных ресурсов
В ней храняться текущие данные программы, она быстра
и конечна
Скорость доступа: L1: 0.5 ns, RAM: 100 ns, SSD: 150 000 ns
...
11
..
Проблема
Теория
Инструменты
Решения
Что с ней происходит
Выделение (плюс взаимодействие с ОС)
Чтение/запись
Освобождение (сборщик мусора - GC)
...
12
..
Проблема
Теория
Инструменты
Решения
Как она используется
class Point(object):
def __init__(self, x, y, vx, vy):
self.x = x
self.y = y
self.vx = vx
self.vy = vy
...
13
..
Проблема
Теория
Инструменты
Решения
Как она используется: объект
...
14
..
Проблема
Теория
Инструменты
Решения
Как она используется: список
...
15
..
Проблема
Теория
Инструменты
Решения
Сборка мусора
освобождение объектов, к которым у нас уже нет
доступа
бесконечная память - сборщик не был бы нужен/заметен
Пример:
s = 0.0
for _ in xrange(10000000):
s = s + 0.34
...
16
..
Проблема
Теория
Инструменты
Решения
Сборка мусора: CPython
reference coun ng: если на объект нет ссылок, то память
можно освободить
но нужно уметь собирать и отдельно висящие циклы
только если в циклах нет объектов с __del__ (см.
gc.garbage)
...
17
..
Проблема
Теория
Инструменты
Решения
Циклы: пример
class Node:
def __init__(self, parent=None):
self.parent = parent
self.children = []
a = Node()
a.children.append(Node(parent=a))
a = 1
...
18
..
Проблема
Теория
Инструменты
Решения
Циклы: __del__
class Node:
def __init__(self, parent=None):
self.parent = parent
self.children = []
def __del__(self):
pass
a = Node(); a.children.append(Node(parent=a))
a = 1
...
19
..
Проблема
Теория
Инструменты
Решения
Циклы: __del__
class Node:
def __init__(self, parent=None):
self.parent = parent
self.children = []
def __del__(self):
pass
a = Node(); a.children.append(Node(parent=a))
a = 1
>>> gc.collect(); gc.garbage
[<__main__.Node instance at 0x10a0dd5f0>,
<__main__.Node instance at 0x10a0dd680>]
...
20
..
Проблема
Теория
Инструменты
Решения
Освобождение памяти
...
21
..
Проблема
Теория
Инструменты
Решения
Освобождение памяти
...
22
..
Проблема
Теория
Инструменты
Решения
Освобождение памяти
...
23
..
Проблема
Теория
Инструменты
Решения
(не)Освобождение памяти
...
24
..
Проблема
Теория
Инструменты
Решения
(не)Освобождение памяти
...
25
..
Проблема
Теория
Инструменты
Решения
(не)Освобождение памяти
...
26
..
Проблема
Теория
Инструменты
Решения
Освобождение памяти
”
Improving Python's Memory Allocator“ Evan Jones
http://www.evanjones.ca/memoryallocator/
...
27
..
Проблема
Теория
Инструменты
Решения
Фрагментация
...
28
..
Проблема
Теория
Инструменты
Решения
Инструменты
Сколько памяти используется?
Какие объекты занимают память?
Почему они занимают память?
...
29
..
Проблема
Теория
Инструменты
Решения
Статистика ОС
включает память C exten ons
включает shared libraries
дополнительная информация: vmmap, pmap -d
import resource
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
...
30
..
Проблема
Теория
Инструменты
Решения
Статистика ОС
starting vlist_blocker
...
finished vlist_blocker in 11.8649010658 s
vlist_blocker: memory
before: 32 440 k
after: 412 016 k
delta: 379 576 k
...
31
..
Проблема
Теория
Инструменты
Решения
heapy
CPython 2.x
overhead: нет (не считая времени на анализ)
анализ используемой памяти
сложно понять причину/источник
...
32
..
Проблема
Теория
Инструменты
Решения
heapy
from guppy import hpy
hp = hpy()
hp.setrelheap()
...
...
h = hp.heap()
print h
...
33
..
Проблема
Теория
Инструменты
Решения
heapy
8343695 objects. Total size = 401971888 bytes.
Index Count % Size % Cumulative % Kind (class / dict o
0 3337416 40 160M 40 160M 40 datetime.datetime
1 1668744 20 146M 37 307M 76 tuple
2 3336983 40 80M 20 387M 96 int
3 25 0 14M 4 401M 100 list
4 144 0 56K 0 401M 100 unicode
5 147 0 52K 0 401M 100 dict (no owner)
...
...
34
..
Проблема
Теория
Инструменты
Решения
heapy
(Pdb) print h[1].byid
1668748 <tuple> objects. Total size = 146849176 bytes.
Index Size % Cumulative % Address*Length
0 88 0.0 88 0.0 0x10c141050*4
...
9 88 0.0 88 0.0 0x10c141368*4
<1668738 more rows. Type e.g. '_.more' to view.>
(Pdb) print h[1].byid[0].theone
(108, 108, datetime.datetime(1, 1, 1, 0, 0),
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999))
...
35
..
Проблема
Теория
Инструменты
Решения
tracemalloc
CPython 3.4 (есть порт для 2.7)
overhead: ~2x и память и время
отслеживание выделения памяти с точностью до
строчки и traceback
но как и с heapy, нужно
”
поймать момент“
...
36
..
Проблема
Теория
Инструменты
Решения
tracemalloc
[ Top 10 ]
django/db/utils.py:106:
size=344 MiB, count=8343028, average=43 B
documents/utils.py:47:
size=13.3 MiB, count=1, average=13.3 MiB
<frozen importlib._bootstrap>:656:
size=59.7 KiB, count=520, average=118 B
django/db/backends/postgresql_psycopg2/operations.py:21
size=27.6 KiB, count=77, average=367 B
...
...
37
..
Проблема
Теория
Инструменты
Решения
Утечка
44 | values = []
45 | for d in _blocks_iterator(
46 | blocks, vlist, field_name, model, log):
47 | values.append(d)
48 | yield d
...
38
..
Проблема
Теория
Инструменты
Решения
tracemalloc
[ Top 10 ]
django/db/utils.py:106:
size=160 KiB, count=2050, average=80 B
<frozen importlib._bootstrap>:656:
size=59.1 KiB, count=515, average=118 B
django/db/backends/postgresql_psycopg2/operations.py:21
size=56.2 KiB, count=176, average=327 B
django/db/backends/util.py:74:
size=39.0 KiB, count=184, average=217 B
django/db/backends/util.py:76:
size=10.9 KiB, count=177, average=63 B
...
39
..
Проблема
Теория
Инструменты
Решения
”
Багфиксы“
просто багфиксы
weakref
генераторы/сопрограммы
алгоритмы
...
40
..
Проблема
Теория
Инструменты
Решения
Оптимизации: объекты
class Point(object):
def __init__(self, x, y, vx, vy):
self.x = x
self.y = y
self.vx = vx
self.vy = vy
points = [Point(x=random(), y=random(),
vx=random(), vy=random())
for _ in xrange(n)]
...
41
..
Проблема
Теория
Инструменты
Решения
А в памяти
...
42
..
Проблема
Теория
Инструменты
Решения
__slots__
class Point(object):
__slots__ = ['x', 'y', 'vx', 'vy']
def __init__(self, x, y, vx, vy):
self.x = x
self.y = y
self.vx = vx
self.vy = vy
...
43
..
Проблема
Теория
Инструменты
Решения
namedtuple
Point = namedtuple('Point', ['x', 'y', 'vx', 'vy'])
...
44
..
Проблема
Теория
Инструменты
Решения
Списки
Для примитивных типов:
array.array
numpy.array
...
45
..
Проблема
Теория
Инструменты
Решения
struct
class Point(object):
__slots__ = ['_data']
def __init__(self, x, y, vx, vy):
self._data = struct.pack(
'=dddd', x, y, vx, vy)
@property
def x(self):
return struct.unpack(
'=dddd', self._data)[0]
...
46
..
Проблема
Теория
Инструменты
Решения
cffi
from cffi import FFI
ffi = FFI()
ffi.cdef("""
typedef struct {
double x, y, vx, vy;
} Point;
""")
points = ffi.new("Point[]", 10000000)
...
47
..
Проблема
Теория
Инструменты
Решения
Сравнение
...
48
..
Проблема
Теория
Инструменты
Решения
Общая память
mmap: https://docs.python.org/2/library/mmap.html
mul processing: https:
//docs.python.org/2/library/multiprocessing.html#
sharing-state-between-processes
http://stackoverflow.com/a/5550156/217088
...
49
..
Проблема
Теория
Инструменты
Решения
Архитектурные решения
вынос жадных до памяти операций в отдельный процесс
(mul processing, Celery, ..., отдельный сервис)
вынос общей памяти в отдельный процесс/БД (redis,
memcached, ..., отдельный сервис)
...
50
..
Проблема
Теория
Инструменты
Решения
Ссылки: обзор
https://fedorahosted.org/pulp/wiki/Debugging/
MemoryLeaks
http://stackoverflow.com/questions/110259/
which-python-memory-profiler-is-recommended
...
51
..
Проблема
Теория
Инструменты
Решения
Ссылки: внутренности CPython
Improving Python's Memory Allocator:
http://www.evanjones.ca/memoryallocator/
Stepping Through CPython:
http://www.youtube.com/watch?v=XGF3Qu4dUqk
gc: https://docs.python.org/2/library/gc.html
Why Python is Slow: Looking Under the Hood:
http://jakevdp.github.io/blog/2014/05/09/
why-python-is-slow/
Python’s Innards: http://tech.blog.aknin.name/
category/my-projects/pythons-innards/
...
52
..
Проблема
Теория
Инструменты
Решения
Ссылки: оптимизации в PyPy
объекты: http://morepypy.blogspot.ru/2010/11/
efficiently-implementing-python-objects.html
списки: http://morepypy.blogspot.ru/2011/10/
more-compact-lists-with-list-strategies.html
...
53
..
Проблема
Теория
Инструменты
Решения
Ссылки: инструменты
Heapy:
http://guppy-pe.sourceforge.net/
http:
//smira.ru/wp-content/uploads/2011/08/heapy.html
Meliae:
http://jam-bazaar.blogspot.ru/2009/11/
memory-debugging-with-meliae.html
http://jam-bazaar.blogspot.ru/2010/08/
step-by-step-meliae.html
...
54
..
Проблема
Теория
Инструменты
Решения
Ссылки: tracemalloc
Документация: https:
//docs.python.org/3/library/tracemalloc.html
PEP: http://legacy.python.org/dev/peps/pep-0454/
...
55

More Related Content

PDF
Оптимизация производительности Python
PDF
Лекция 1. Начало.
PDF
Лекция 11. Тестирование.
PDF
How To Get All Your Ducks in A Row Between Exchange and Completion
PDF
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
PPTX
Денис Колодин: Low-latency и soft-realtime на Python
PPTX
Управление памятью в CPython
PPT
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...
Оптимизация производительности Python
Лекция 1. Начало.
Лекция 11. Тестирование.
How To Get All Your Ducks in A Row Between Exchange and Completion
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
Денис Колодин: Low-latency и soft-realtime на Python
Управление памятью в CPython
Самые частые проблемы и пути решения при росте нагрузки и масштабировании про...

More from it-people (20)

PDF
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
PDF
«Scrapy internals» Александр Сибиряков, Scrapinghub
PDF
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
PDF
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
PDF
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
PDF
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
PDF
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
PDF
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
PDF
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
PDF
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
PDF
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
PDF
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
PDF
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
PDF
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
PDF
«(Без)опасный Python», Иван Цыганов, Positive Technologies
PDF
«Python of Things», Кирилл Борисов, Яндекс
PDF
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
PDF
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
PDF
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
PDF
ЗАВИСИМОСТИ В КОМПОНЕНТНОМ ВЕБЕ, ПРИГОТОВЛЕННЫЕ ПРАВИЛЬНО, Гриненко Владимир,...
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«Python of Things», Кирилл Борисов, Яндекс
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
ЗАВИСИМОСТИ В КОМПОНЕНТНОМ ВЕБЕ, ПРИГОТОВЛЕННЫЕ ПРАВИЛЬНО, Гриненко Владимир,...
Ad

На что уходит память - Константин Лопухин, PyCon RU 2014