Traquer les fuites
mémoires Python
Pycon 2013, Strasbourg

Victor Stinner

victor.stinner@gmail.com
Distributed under CC B...
Victor Stinner
Core developer Python depuis 2010
github.com/haypo/
bitbucket.org/haypo/
Employé par eNovance
Sommaire
Mémoire RSS
Cycle référence
Calcul manuel
Heapy, Pympler, Melia
PEP 445 : API malloc()
PEP 454 : tracemalloc
Mémoire RSS
Représentatif pour le système
Mesure grossière
Difficile à exploiter
Fragmentation du tas
Fragmentation du tas
2 Mo / 2 Mo
10 Mo / 10 Mo
1.5 Mo / 10 Mo
memory_profiler
Mem usage Increment Line Contents
=====================================
@profile
5.97 MB
0.00 MB def my_fu...
Cycle de références
a.b = b
b.a = a
a = None
b = None
gc.collect()
Cycle de références
a.b
b.a
# a
a =

= b
= weakref.ref(a)
= b.a()
None
Visualiser les liens
Project objgraph

http://mg.pov.lt/objgraph/
Introspection Python
gc.get_objects()
gc.get_referrers()
gc.get_refents()
id(obj)
sys.getsizeof(obj)
Calcul manuel
>>> import gc, sys
>>> dict1 = {None: b'x' * 10000}
>>> sys.getsizeof(dict1)
296
>>> sum(sys.getsizeof(ref)
...
Calcul manuel
>>> data = b'x' * 10000
>>> dict2 = {index:data
...
for index in range(500)}
>>> sum(sys.getsizeof(ref)
...
...
Calcul manuel
>>> refs = gc.get_referents(dict2)
>>> len(refs)
1000
>>> refs = set(map(id, refs))
>>> len(refs)
501
>>> su...
Heapy, Pympler, Melia
Liste l'ensemble des objets Python
Calcul la taille des objets
Groupe les objets par taille
Heapy, Pympler, Melia
Total 17916 objects, 96 types,
Total size = 1.5MiB
Count
701
7,138
208
1,371
...

Size
546,460
414,6...
Heapy, Pympler, Melia
Ne trace pas toute la mémoire
(ex: zlib)
Ne donne pas l'origine des objects
Difficile à exploiter
Heapy, Pympler, Melia
http://guppy-pe.sourceforge.net/
http://code.google.com/p/pympler/
https://pypi.python.org/pypi/meli...
PEP 445 : API malloc()
PyMem_GetAllocator()
PyMem_SetAllocator()
Implementée dans Python 3.4
PEP 454 : tracemalloc
Memory
File
File
File
File
File

block: 768 kB
"test/support/__init__.py", line 142
"test/support/__...
PEP 454 : tracemalloc
Memory block: 768 kB
File "test/support/__init__.py", line 142
__import__(name)
File "test/support/_...
PEP 454 : tracemalloc
[ Top 5 ]
#1: Lib/linecache.py:127: 225.5 kB
#2: collections.py:368: 200.6 kB
#3: unittest/case.py:5...
PEP 454 : tracemalloc
[ Top 5 differences ]
#1: test.py:4: 0.0 kB (-5.0 kB)
#2: test.py:1: 2.4 kB (0.0 kB)
#3: test.py:20:...
Status tracemalloc
Disponible sur PyPI
Nécessite de patcher et recompiler
Python
... voir aussi recompiler les extensions
...
Status PEP 454
PEP 445 (API malloc) implémentée dans
Python 3.4
PEP 454 (tracemalloc) : brouillon,
implémentation prête
Po...
Suite de tracemalloc ?
Faire accepter la PEP 454 !
Mettre à jour les projets PyPI
Outils pour générer des graphiques
GUI p...
Questions ?
http://pypi.python.org/pypi/pytracemalloc
http://www.python.org/dev/peps/pep-0445/
http://www.python.org/dev/p...
PEP 445 (API malloc)
Ticket ouvert en 2008
Patch proposé en mars 2013
Patch commité en juin 2013
Commit reverté -> écritur...
PEP 454 (tracemalloc)
Stocke la traceback, pas juste 1 frame
Beaucoup de code supprimé
Code généralisé et plus haut niveau...
Merci David Malcom
pour le modèle LibreOffice
http://dmalcolm.livejournal.com/
Prochain SlideShare
Chargement dans…5
×

Traquer les fuites mémoires avec Python

3 304 vues

Publié le

Les fuites mémoire en Python ne peuvent pas être analysées avec les outils traditionnels car Python repose sur les compteurs de référence. Je vais présenter des outils spécifiques à Python pour vous aider à localiser vos fuites mémoires.

* Consommation globale du processus (mémoire RSS)
* Comprendre les cycles de référence
* Générer une image représentant les liens entre les objets
* Utilisation de gc.get_objects() et calcul manuel de la taille des objets
* Tracer les allocations mémoires à leur création
* PEP 445: Add new APIs to customize Python memory allocators implementée dans Python 3.4
* Projet pytracemalloc

Publié dans : Business
  • Soyez le premier à commenter

Traquer les fuites mémoires avec Python

  1. 1. Traquer les fuites mémoires Python Pycon 2013, Strasbourg Victor Stinner victor.stinner@gmail.com Distributed under CC BY-SA license: http://creativecommons.org/licenses/by-sa/3.0/
  2. 2. Victor Stinner Core developer Python depuis 2010 github.com/haypo/ bitbucket.org/haypo/ Employé par eNovance
  3. 3. Sommaire Mémoire RSS Cycle référence Calcul manuel Heapy, Pympler, Melia PEP 445 : API malloc() PEP 454 : tracemalloc
  4. 4. Mémoire RSS Représentatif pour le système Mesure grossière Difficile à exploiter Fragmentation du tas
  5. 5. Fragmentation du tas 2 Mo / 2 Mo 10 Mo / 10 Mo 1.5 Mo / 10 Mo
  6. 6. memory_profiler Mem usage Increment Line Contents ===================================== @profile 5.97 MB 0.00 MB def my_func(): 13.61 MB 7.64 MB a = [1] * (10 ** 6) 166.20 MB 152.59 MB b = [2] * (10 ** 8) 13.61 MB -152.59 MB del b 13.61 MB 0.00 MB return a http://pypi.python.org/pypi/memory_profiler
  7. 7. Cycle de références a.b = b b.a = a a = None b = None gc.collect()
  8. 8. Cycle de références a.b b.a # a a = = b = weakref.ref(a) = b.a() None
  9. 9. Visualiser les liens Project objgraph http://mg.pov.lt/objgraph/
  10. 10. Introspection Python gc.get_objects() gc.get_referrers() gc.get_refents() id(obj) sys.getsizeof(obj)
  11. 11. Calcul manuel >>> import gc, sys >>> dict1 = {None: b'x' * 10000} >>> sys.getsizeof(dict1) 296 >>> sum(sys.getsizeof(ref) ... for ref in gc.get_referents(dict1)) 10049
  12. 12. Calcul manuel >>> data = b'x' * 10000 >>> dict2 = {index:data ... for index in range(500)} >>> sum(sys.getsizeof(ref) ... for ref in gc.get_referents(dict2)) 5030496
  13. 13. Calcul manuel >>> refs = gc.get_referents(dict2) >>> len(refs) 1000 >>> refs = set(map(id, refs)) >>> len(refs) 501 >>> sum(sys.getsizeof(ref) ... for ref in refs) 16028
  14. 14. Heapy, Pympler, Melia Liste l'ensemble des objets Python Calcul la taille des objets Groupe les objets par taille
  15. 15. Heapy, Pympler, Melia Total 17916 objects, 96 types, Total size = 1.5MiB Count 701 7,138 208 1,371 ... Size 546,460 414,639 94,016 93,228 Kind dict str type code
  16. 16. Heapy, Pympler, Melia Ne trace pas toute la mémoire (ex: zlib) Ne donne pas l'origine des objects Difficile à exploiter
  17. 17. Heapy, Pympler, Melia http://guppy-pe.sourceforge.net/ http://code.google.com/p/pympler/ https://pypi.python.org/pypi/meliae
  18. 18. PEP 445 : API malloc() PyMem_GetAllocator() PyMem_SetAllocator() Implementée dans Python 3.4
  19. 19. PEP 454 : tracemalloc Memory File File File File File block: 768 kB "test/support/__init__.py", line 142 "test/support/__init__.py", line 206 "test/test_decimal.py", line 48 "importlib/__init__.py", line 95 "test/regrtest.py", line 1269
  20. 20. PEP 454 : tracemalloc Memory block: 768 kB File "test/support/__init__.py", line 142 __import__(name) File "test/support/__init__.py", line 206 _save_and_remove_module(name) File "test/test_decimal.py", line 48 C = import_fresh_module('decimal') File "importlib/__init__.py", line 95 return _bootstrap._gcd_import(name) File "test/regrtest.py", line 1269 the_module = importlib.import(abstest)
  21. 21. PEP 454 : tracemalloc [ Top 5 ] #1: Lib/linecache.py:127: 225.5 kB #2: collections.py:368: 200.6 kB #3: unittest/case.py:571: 108.6 kB #4: Lib/abc.py:133: 87.3 kB #5: Lib/shutil.py:401: 61.9 kB 10347 other: 3279.3 kB Total allocated size: 4188.3 KB
  22. 22. PEP 454 : tracemalloc [ Top 5 differences ] #1: test.py:4: 0.0 kB (-5.0 kB) #2: test.py:1: 2.4 kB (0.0 kB) #3: test.py:20: 0.6 kB (+0.6 kB) #4: test.py:8: 0.2 kB (0.0 kB) #5: test.py:25: 0.1 kB (0.0 kB)
  23. 23. Status tracemalloc Disponible sur PyPI Nécessite de patcher et recompiler Python ... voir aussi recompiler les extensions Python écrites en C Patchs pour Python 2.5, 2.7, 3.4
  24. 24. Status PEP 454 PEP 445 (API malloc) implémentée dans Python 3.4 PEP 454 (tracemalloc) : brouillon, implémentation prête Portable ! Windows, Linux, FreeBSD, ... 2x plus lent et mémoire x 2 Pérenne : va être intégré à Python 3.4
  25. 25. Suite de tracemalloc ? Faire accepter la PEP 454 ! Mettre à jour les projets PyPI Outils pour générer des graphiques GUI pour exploiter les données GUI pour suivre l'évolution avec le temps
  26. 26. Questions ? http://pypi.python.org/pypi/pytracemalloc http://www.python.org/dev/peps/pep-0445/ http://www.python.org/dev/peps/pep-0454/ Contact : victor.stinner@gmail.com Distributed under CC BY-SA license: http://creativecommons.org/licenses/by-sa/3.0/
  27. 27. PEP 445 (API malloc) Ticket ouvert en 2008 Patch proposé en mars 2013 Patch commité en juin 2013 Commit reverté -> écriture PEP 445 Meilleure API grâce à la PEP PEP delegate : Antoine Pitrou
  28. 28. PEP 454 (tracemalloc) Stocke la traceback, pas juste 1 frame Beaucoup de code supprimé Code généralisé et plus haut niveau Échanges avec Kristján Valur Jónsson PEP delegate : Charles-François Natali Restaurant avec Charles-François
  29. 29. Merci David Malcom pour le modèle LibreOffice http://dmalcolm.livejournal.com/

×