Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

Memory leaks.pptx

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Nächste SlideShare
PHP@Docker - w produkcji
PHP@Docker - w produkcji
Wird geladen in …3
×

Hier ansehen

1 von 23 Anzeige

Weitere Verwandte Inhalte

Ähnlich wie Memory leaks.pptx (17)

Aktuellste (20)

Anzeige

Memory leaks.pptx

  1. 1. SLIDESMANIA.COM Wycieki pamięci w praktyce
  2. 2. AGENDA ● Memory leak ● Zval & Refcount ● Garbage collector ● Tricks & Tips ● Meminfo ● Q&A ?
  3. 3. Czym jest memory leak Brak zwolnienia alokowanej pamięci (heap memory) przez kod programisty. Objawy Definicja Sukcesywny przyrost zużytej pamięci Redukcja wydajności procesu (wolniejsze wykonywanie)
  4. 4. zval i zend value https://github.com/php/php-src Zend/zend_types.h typedef union _zend_value { zend_long lval; double dval; zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zend_ast_ref *ast; zval *zv; void *ptr; zend_class_entry *ce; zend_function *func; struct { uint32_t w1; uint32_t w2; } ww; } zend_value; struct _zval_struct { zend_value value;/* value */ // … }; typedef struct _zval_struct zval;
  5. 5. Refcounting ● Licznik do zliczania ilości użycia danej wartości ● Gdy wynosi 0, wskaźnik do zarezerwowanej wartości (pamięci) może zostać zwolniony
  6. 6. Refcounting Od PHP 7 struktura zval (Zend Value) nie przechowuje bezpośrednio licznika refcount* Pomijamy przypadek referencji przez użycie & Dla jakich typów liczony jest refcount ? Nigdy: null, bool, int, double Zawsze: object, resource, reference To zależy*: string, array *Interned strings, immutable arrays
  7. 7. Przechowywanie refcount typedef struct _zend_refcounted_h { uint32_t refcount; /* reference counter 32-bit */ union { uint32_t type_info; } u; } zend_refcounted_h; Jak podejrzeć refcount ? - xdebug xdebug_debug_zval('a');
  8. 8. Simple leak vs Circular reference Some code …
  9. 9. Garbage collector Aplikacja, która służy do odśmiecania pamięci (dealokacji pamięci)
  10. 10. Garbage collector (DFS) A Ref: 1 B Ref: 1 D Ref:2 E Ref:1 F Ref: 1
  11. 11. Garbage collector (DFS) A Ref: 0 B Ref: 1 D Ref:2 E Ref:1 F Ref: 1
  12. 12. Garbage collector (DFS) A Ref: 0 B Ref: 1 D Ref:1 E Ref:1 F Ref: 1
  13. 13. Garbage collector (DFS) A Ref: 0 B Ref: 1 D Ref:1 E Ref:0 F Ref: 1
  14. 14. Garbage collector (DFS) A Ref: 0 B Ref: 0 D Ref:1 E Ref:0 F Ref: 1
  15. 15. Garbage collector (DFS) A Ref: 0 B Ref: 0 D Ref:1 E Ref:0 F Ref: 0
  16. 16. Garbage collector (DFS) A Ref: 0 B Ref: 0 D Ref:1 E Ref:0 F Ref: 0
  17. 17. Garbage collector (DFS) ● O(|V| + |E|) ● Root Buffer - 10 000 ● Interrupt script
  18. 18. Co robimy, a nie powinniśmy robić ?
  19. 19. Wycieki pamięci - rozwiązania ● Monitorowanie zużycia pamięci ● Generatory ● WeakMap > SplObjectStorage ● Jeśli używasz tablic dla dużej ilości danych: ○ Stosuj natywne funkcje do operowania na tej tablicy ○ Pamiętaj o copy-on-write ○ Sprawdź czy możesz usunąć te dane gdy nie będą Ci już potrzebne ● Nie używanie zbyt dużych/wielu paczek w procesach ciągłych ● ORM ○ Unikanie relacji cyrkularnych rodzic->dziecko->rodzic ○ Czyszczenie UnitOfWork poprzez metodę clear() ● Połączenia z bazą - Unbuffered ● Korzystanie z niemutowalnych obiektów
  20. 20. Analizowanie/wykrywanie wycieków pamięci ● Funkcje wbudowane np memory_get_usage() ● Paczki np: symfony/stopwatch ● Xdebug + kcachegrind/IDE ● Xprof + kcachegrind/IDE ● Meminfo ● Memprof ● Valgrind
  21. 21. Meminfo - PHP extension ● https://github.com/BitOne/php-meminfo ● Licencja MIT ● Instalacja manualna - nie jest częścią repozytorium PECL ● Zazwyczaj duża ilość obiektów danego typu może świadczyć o wycieku pamięci Przykładowe użycie - zrzut pamięci w danym momencie meminfo_dump(fopen('meminfo.json', 'w'));
  22. 22. Links ● https://github.com/php/php-src ● https://www.npopov.com/2015/05/05/Internal-value-representation-in-PHP-7-part-1.html ● https://www.youtube.com/watch?v=yxKi689uN8E&t=1710s ● https://jolicode.com/blog/a-journey-to-find-a-memory-leak ● https://github.com/arnaud-lb/php-memory-profiler ● https://github.com/php/php-src
  23. 23. Workshops lukasz.jaworski@comeon.com marcin.gladkowski@comeon.com

×