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

Post on 26-Jan-2015

392 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

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

.

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

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

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

...2

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

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

...3

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

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

...4

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

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

...5

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

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

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

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

...6

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

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

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

...7

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

I/O bound?

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

...8

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

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

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

...9

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

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

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

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

...10

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

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

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

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

...11

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

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

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

...12

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

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

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

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

...13

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

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

...14

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

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

...15

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

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

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

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

s = 0.0for _ in xrange(10000000):

s = s + 0.34

...16

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

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

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

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

gc.garbage)

...17

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

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

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

self.parent = parentself.children = []

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

...18

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

Циклы: __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

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

Циклы: __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

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

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

...21

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

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

...22

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

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

...23

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

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

...24

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

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

...25

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

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

...26

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

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

I”Improving Python's Memory Allocator“ Evan Jones

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

...27

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

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

...28

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

Инструменты

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

...29

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

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

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

import resourceresource.getrusage(resource.RUSAGE_SELF).ru_maxrss

...30

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

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

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

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

...31

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

heapy

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

...32

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

heapy

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

...33

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

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

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

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

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

tracemalloc

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

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

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

...36

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

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

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

Утечка

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

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

”Багфиксы“

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

...40

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

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

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

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

А в памяти

...42

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

__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

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

namedtuple

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

...44

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

Списки

Для примитивных типов:I array.arrayI 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)

@propertydef x(self):

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

...46

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

cffi

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

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

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

...47

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

Сравнение

...48

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

Общая память

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

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

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

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

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

...50

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

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

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

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

...51

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

Ссылки: внутренности 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

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

Ссылки: оптимизации в 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

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

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

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

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

Ссылки: tracemalloc

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

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

...55

top related