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

55
. . Проблема Теория Инструменты Решения . . . На что уходит память?

Upload: it-people

Post on 26-Jan-2015

390 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

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

..ПроблемаТеорияИнструментыРешения

.

..На что уходитпамять?

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

.. ПроблемаТеорияИнструментыРешения

Проблема утечка памяти

...2

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

.. ПроблемаТеорияИнструментыРешения

Проблема утечка памяти

...3

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

.. ПроблемаТеорияИнструментыРешения

”Решение“ проблемы

...4

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

.. ПроблемаТеорияИнструментыРешения

Проблема: производительность

...5

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

.. ПроблемаТеорияИнструментыРешения

Ограничение размера задачи

I Объем памяти может ограничить максимальный размеррешаемой задачи

I Изменить алгоритм так, чтобы не все держать в памяти,часто сложно

...6

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

.. ПроблемаТеорияИнструментыРешения

Делаем ненужную работу

Тратим лишнюю память и:I не в лезаем влезаем в кэш процессовраI делаем лишнюю работы по выделению и сборке памяти

...7

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

.. ПроблемаТеорияИнструментыРешения

I/O bound?

Часто можно превратить I/O bound задачу в CPU или Memorybound, и увеличить производительность

...8

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

.. ПроблемаТеорияИнструментыРешения

Ограничение числа процессов

Хотим использовать все ядра сервера

...9

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

.. ПроблемаТеорияИнструментыРешения

Ограничение числа процессов

Хотим использовать все ядра сервераТипичный сервер:

I 8-256 Гб памятиI 4-128 ядер, 1-2 процесса на ядроI 0.5-5 Гб памяти на процесс

...10

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

.. ПроблемаТеорияИнструментыРешения

Что такое память

I Один из основных ресурсовI В ней храняться текущие данные программы, она быстра

и конечнаI Скорость доступа: L1: 0.5 ns, RAM: 100 ns, SSD: 150 000 ns

...11

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

.. ПроблемаТеорияИнструментыРешения

Что с ней происходит

I Выделение (плюс взаимодействие с ОС)I Чтение/записьI Освобождение (сборщик мусора - GC)

...12

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

.. ПроблемаТеорияИнструментыРешения

Как она используется

class Point(object):def __init__(self, x, y, vx, vy):

self.x = xself.y = yself.vx = vxself.vy = vy

...13

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

.. ПроблемаТеорияИнструментыРешения

Как она используется: объект

...14

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

.. ПроблемаТеорияИнструментыРешения

Как она используется: список

...15

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

.. ПроблемаТеорияИнструментыРешения

Сборка мусора

I освобождение объектов, к которым у нас уже нетдоступа

I бесконечная память - сборщик не был бы нужен/заметенПример:

s = 0.0for _ in xrange(10000000):

s = s + 0.34

...16

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

.. ПроблемаТеорияИнструментыРешения

Сборка мусора: CPython

I reference coun ng: если на объект нет ссылок, то памятьможно освободить

I но нужно уметь собирать и отдельно висящие циклыI только если в циклах нет объектов с __del__ (см.

gc.garbage)

...17

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

.. ПроблемаТеорияИнструментыРешения

Циклы: пример

class Node:def __init__(self, parent=None):

self.parent = parentself.children = []

a = Node()a.children.append(Node(parent=a))a = 1

...18

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

.. ПроблемаТеорияИнструментыРешения

Циклы: __del__

class Node:def __init__(self, parent=None):

self.parent = parentself.children = []

def __del__(self):pass

a = Node(); a.children.append(Node(parent=a))a = 1

...19

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

.. ПроблемаТеорияИнструментыРешения

Циклы: __del__

class Node:def __init__(self, parent=None):

self.parent = parentself.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

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

.. ПроблемаТеорияИнструментыРешения

Освобождение памяти

...21

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

.. ПроблемаТеорияИнструментыРешения

Освобождение памяти

...22

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

.. ПроблемаТеорияИнструментыРешения

Освобождение памяти

...23

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

.. ПроблемаТеорияИнструментыРешения

(не)Освобождение памяти

...24

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

.. ПроблемаТеорияИнструментыРешения

(не)Освобождение памяти

...25

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

.. ПроблемаТеорияИнструментыРешения

(не)Освобождение памяти

...26

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

.. ПроблемаТеорияИнструментыРешения

Освобождение памяти

I”Improving Python's Memory Allocator“ Evan Jones

http://www.evanjones.ca/memoryallocator/

...27

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

.. ПроблемаТеорияИнструментыРешения

Фрагментация

...28

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

.. ПроблемаТеорияИнструментыРешения

Инструменты

I Сколько памяти используется?I Какие объекты занимают память?I Почему они занимают память?

...29

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

.. ПроблемаТеорияИнструментыРешения

Статистика ОС

I включает память C exten onsI включает shared librariesI дополнительная информация: vmmap, pmap -d

import resourceresource.getrusage(resource.RUSAGE_SELF).ru_maxrss

...30

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

.. ПроблемаТеорияИнструментыРешения

Статистика ОС

starting vlist_blocker...finished vlist_blocker in 11.8649010658 svlist_blocker: memory

before: 32 440 kafter: 412 016 kdelta: 379 576 k

...31

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

.. ПроблемаТеорияИнструментыРешения

heapy

I CPython 2.xI overhead: нет (не считая времени на анализ)I анализ используемой памятиI сложно понять причину/источник

...32

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

.. ПроблемаТеорияИнструментыРешения

heapy

from guppy import hpyhp = hpy()hp.setrelheap()......h = hp.heap()print h

...33

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

.. ПроблемаТеорияИнструментыРешения

heapy

8343695 objects. Total size = 401971888 bytes.Index Count % Size % Cumulative % Kind (class / dict of class)

0 3337416 40 160M 40 160M 40 datetime.datetime1 1668744 20 146M 37 307M 76 tuple2 3336983 40 80M 20 387M 96 int3 25 0 14M 4 401M 100 list4 144 0 56K 0 401M 100 unicode5 147 0 52K 0 401M 100 dict (no owner)...

...34

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

.. ПроблемаТеорияИнструментыРешения

heapy

(Pdb) print h[1].byid1668748 <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

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

.. ПроблемаТеорияИнструментыРешения

tracemalloc

I CPython 3.4 (есть порт для 2.7)I overhead: ~2x и память и времяI отслеживание выделения памяти с точностью до

строчки и tracebackI но как и с heapy, нужно

”поймать момент“

...36

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

.. ПроблемаТеорияИнструментыРешения

tracemalloc

[ Top 10 ]django/db/utils.py:106:

size=344 MiB, count=8343028, average=43 Bdocuments/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 Bdjango/db/backends/postgresql_psycopg2/operations.py:214:

size=27.6 KiB, count=77, average=367 B...

...37

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

.. ПроблемаТеорияИнструментыРешения

Утечка

44 | values = []45 | for d in _blocks_iterator(46 | blocks, vlist, field_name, model, log):47 | values.append(d)48 | yield d

...38

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

.. ПроблемаТеорияИнструментыРешения

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 Bdjango/db/backends/postgresql_psycopg2/operations.py:214:

size=56.2 KiB, count=176, average=327 Bdjango/db/backends/util.py:74:

size=39.0 KiB, count=184, average=217 Bdjango/db/backends/util.py:76:

size=10.9 KiB, count=177, average=63 B

...39

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

.. ПроблемаТеорияИнструментыРешения

”Багфиксы“

I просто багфиксыI weakrefI генераторы/сопрограммыI алгоритмы

...40

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

.. ПроблемаТеорияИнструментыРешения

Оптимизации: объекты

class Point(object):def __init__(self, x, y, vx, vy):

self.x = xself.y = yself.vx = vxself.vy = vy

points = [Point(x=random(), y=random(),vx=random(), vy=random())

for _ in xrange(n)]

...41

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

.. ПроблемаТеорияИнструментыРешения

А в памяти

...42

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

.. ПроблемаТеорияИнструментыРешения

__slots__

class Point(object):__slots__ = ['x', 'y', 'vx', 'vy']def __init__(self, x, y, vx, vy):

self.x = xself.y = yself.vx = vxself.vy = vy

...43

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

.. ПроблемаТеорияИнструментыРешения

namedtuple

Point = namedtuple('Point', ['x', 'y', 'vx', 'vy'])

...44

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

.. ПроблемаТеорияИнструментыРешения

Списки

Для примитивных типов:I array.arrayI numpy.array

...45

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

.. ПроблемаТеорияИнструментыРешения

struct

class Point(object):__slots__ = ['_data']

def __init__(self, x, y, vx, vy):self._data = struct.pack(

'=dddd', x, y, vx, vy)

@propertydef x(self):

return struct.unpack('=dddd', self._data)[0]

...46

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

.. ПроблемаТеорияИнструментыРешения

cffi

from cffi import FFIffi = FFI()ffi.cdef("""

typedef struct {double x, y, vx, vy;

} Point;""")points = ffi.new("Point[]", 10000000)

...47

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

.. ПроблемаТеорияИнструментыРешения

Сравнение

...48

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

.. ПроблемаТеорияИнструментыРешения

Общая память

I mmap: https://docs.python.org/2/library/mmap.htmlI mul processing: https:

//docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

I http://stackoverflow.com/a/5550156/217088

...49

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

.. ПроблемаТеорияИнструментыРешения

Архитектурные решения

I вынос жадных до памяти операций в отдельный процесс(mul processing, Celery, ..., отдельный сервис)

I вынос общей памяти в отдельный процесс/БД (redis,memcached, ..., отдельный сервис)

...50

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

.. ПроблемаТеорияИнструментыРешения

Ссылки: обзор

I https://fedorahosted.org/pulp/wiki/Debugging/MemoryLeaks

I http://stackoverflow.com/questions/110259/which-python-memory-profiler-is-recommended

...51

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

.. ПроблемаТеорияИнструментыРешения

Ссылки: внутренности CPython

I Improving Python's Memory Allocator:http://www.evanjones.ca/memoryallocator/

I Stepping Through CPython:http://www.youtube.com/watch?v=XGF3Qu4dUqk

I gc: https://docs.python.org/2/library/gc.htmlI Why Python is Slow: Looking Under the Hood:

http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/

I Python’s Innards: http://tech.blog.aknin.name/category/my-projects/pythons-innards/

...52

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

.. ПроблемаТеорияИнструментыРешения

Ссылки: оптимизации в PyPy

I объекты: http://morepypy.blogspot.ru/2010/11/efficiently-implementing-python-objects.html

I списки: http://morepypy.blogspot.ru/2011/10/more-compact-lists-with-list-strategies.html

...53

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

.. ПроблемаТеорияИнструментыРешения

Ссылки: инструменты

Heapy:I http://guppy-pe.sourceforge.net/I http:

//smira.ru/wp-content/uploads/2011/08/heapy.html

Meliae:I http://jam-bazaar.blogspot.ru/2009/11/

memory-debugging-with-meliae.htmlI http://jam-bazaar.blogspot.ru/2010/08/

step-by-step-meliae.html

...54

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

.. ПроблемаТеорияИнструментыРешения

Ссылки: tracemalloc

I Документация: https://docs.python.org/3/library/tracemalloc.html

I PEP: http://legacy.python.org/dev/peps/pep-0454/

...55