Top Banner
nAcademy Le 31 octobre 2013 La mémoire et PHP Christophe Villeneuve
35

La mémoire et PHP

Jul 03, 2015

Download

Documents

Artha Ivascu

Présentation à la nAcademy (Octobre 2013) : La mémoire et PHP par Christophe Villeneuve
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: La mémoire et PHP

nAcademy Le 31 octobre 2013

La mémoire et PHP

Christophe Villeneuve

Page 2: La mémoire et PHP

nAcademy Le 31 octobre 2013

Mémoire, qu'est ce ?• Octets, Bytes, Word, Heap...

• Surveiller / Mesurer la consommation de mémoire• Carte d'analyse d'image

• Comprendre la consommation de mémoire PHP• Zend memory Manager

• Mesurer la consommation de processus mémoire

Sommaire

Page 3: La mémoire et PHP

Indispensable

Page 4: La mémoire et PHP

nAcademy Le 31 octobre 2013

Hardware Software

La mémoire indispensable

Page 5: La mémoire et PHP

nAcademy Le 31 octobre 2013

Les étapes pour PHP

Start

Out

Start

Zend_compile_file()

Zend_execute()

✔ Start (allocations)

✔ Compilation✔ Analyse✔ Compilation (OP Code Génération)

✔ Execute✔ Interprétation✔ Execution Memoire virtuelle

✔ Libérations

Page 6: La mémoire et PHP

nAcademy Le 31 octobre 2013

<?php$time_start = microtime(true);

for ($i=0 ; $i<1000000; $i++){//le test}

$time_end = microtime(true);$time = $time_end - $time_start;

echo 'Durée : '.$time.' secondes<br/>';?>

Temps de chargement d'une page

Résultat sans APC ou Memcache

Duree : 0.2619161605835 secondes

Page 7: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Chaque lancement d'un logiciel ou d'une application= Mémoire Virtuelle (VM)

✔ La mémoire virtuelle VS mémoire physique (PM)= RAM

✔ Identification✔ VM : Adresse position Kernel✔ PM : Adresse utilisée dans une table

✔ En résumé, chaque processus a l'illusion d'une adresse mémoire Physique (PM)

La place de la mémoire... dans un processus

Page 8: La mémoire et PHP

Monitoring de la mémoire

Page 9: La mémoire et PHP

nAcademy Le 31 octobre 2013

Surveillance de la mémoire serveur Linux

Page 10: La mémoire et PHP

nAcademy Le 31 octobre 2013

Cat / proc/{PID}/ statut 

Obtenir le détail de la mémoire détaillé

✔ Autres outils : ✔ Vmstats✔ Smem

✔ Valgrind

✔ Autres outils : ✔ Vmstats✔ Smem

✔ Valgrind

mémoire virtuelle utilisée

mémoire physique utilisée

Taille mémoire data VM

Taille mémoire Text VM

Page 11: La mémoire et PHP

Et...

Page 12: La mémoire et PHP

nAcademy Le 31 octobre 2013

PHP✔ C'est juste un processuscomme les autres

✔ Codé en C

Mémoire et PHP (1/2)

Page 13: La mémoire et PHP

nAcademy Le 31 octobre 2013

➢PHP➢Def. consommation

<?php 

passthru(

             sprintf(

              cat /proc/%d/status,

              getmypid()

                      )

            );

?>

Mémoire et PHP (2/2)

Page 14: La mémoire et PHP

nAcademy Le 31 octobre 2013

Utilisation de la mémoire (version de PHP)

http://php.net/manual/fr/features.gc.performance-considerations.php

Page 15: La mémoire et PHP

nAcademy Le 31 octobre 2013

Comportement des alertes

Fatal error: Allowed memory size of 134217728 bytes

exhausted (tried to allocate 54 bytes)

Fatal error: Out of memory (allocated 786432) (tried to allocate 24576 bytes) in...

Page 16: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Appelé Zend Memory Manager✔ Actif par défaut

Mémoire interne de PHP avec PHPinfo()

Page 17: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Couche personnalisée✔ Utile pour ces extensions✔ Permet

✔ de limiter la taille✔ Son utilisation✔ Mise en cache des blocs✔ Préallocation✔ Evite la fragmentation✔ Etc.

Pourquoi Zend Memory Manager

libc_malloc() mmap() Layer ?

Kernel

Zend Memory Manager

<?phpecho 'hello world' ;?>

Page 18: La mémoire et PHP

nAcademy Le 31 octobre 2013

Mesurer la quantité de mémoire nécessaire

X

memory_limit()

memory_get_usage()

memory_get_usage (true)

Mémoire non utilisée

memory_get_peak_usage (false)Mémoire allouée

Page 19: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Indique combien vos blocs alloués consomment✔ Pagination possible en Mémoire Physique (PM)✔ Cela ne compte pas pile ✔ Cela ne compte pas toute extension qui contourne

✔ Zend Memory Manager est plus de précis✔ Associé Valgrind pour des gros volumes✔ Ne compte pas les bibliothèques liées✔ Mais c'est un très bon indicateur à suivre

Au niveau du code memory_get_usage ()

Page 20: La mémoire et PHP

nAcademy Le 31 octobre 2013

<?phpini_set(memory_limit, -1);

function heap() { return shell_exec(sprintf(grep "VmRSS:" /proc/%s/status, getmypid()));}

echo heap();$a = range(1, 1024*1024);

echo heap();

unset($a); echo heap();?>

Mesure allocation dynamique Zend Memory Manager

Page 21: La mémoire et PHP

nAcademy Le 31 octobre 2013

<?php

echo memory_get_usage();

$a = array( 1024*1024);

echo memory_get_usage();

unset($a);

echo memory_get_usage();

?>

<?php

echo memory_get_usage();

$a = str_repeat("", 1024*1024);

echo memory_get_usage();

unset($a);

echo memory_get_usage();

?>

Tableau Objet

Exemple d'utilisation (en octets)

235088

235256

235088

235088

235552

235088

Page 22: La mémoire et PHP

Les variables en PHP

Page 23: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Taille de mémoire pour chaque type✔ long : 8 bytes ✔ string : sizeof the string + 1 into char * ✔ double : 8 bytes✔ pointer : 8 bytes

✔ Zval ✔ PHP stocke les variables dans les structures C

✔ PHP faiblement typé

Type de variables PHP

Page 24: La mémoire et PHP

nAcademy Le 31 octobre 2013

<?php$a = 'foo' ;

?>

Comportement par l'exemple

is_ref=0 refcount=1

(string) 'foo'

$a

Zval

<?php$a = 'foo' ;$b = $a ;

?> is_ref=0 refcount=2

(string) 'foo'$a

$b

Page 25: La mémoire et PHP

nAcademy Le 31 octobre 2013

<?php$a = 'foo' ;

$b = $a ;

$a = 17 ; ?>

Manipuler la variable

is_ref=0 refcount=1

(string) 'foo'

$a

is_ref=0 refcount=2

(string) 'foo'$a

$b

is_ref=0 refcount=1

(string) 'foo'

is_ref=0 refcount=1

(int) 17$a

$b

Page 26: La mémoire et PHP

nAcademy Le 31 octobre 2013

<?php$a = 'foo' ;$b = $a ;$c = $b ;$b = 17 ; unset ($a) ;

?>

Plus complexe... quoi que

is_ref=0 refcount=1

(string) 'foo'$a

$a

$bis_ref=0 refcount=2

(string) 'foo'

$a

$b is_ref=0 refcount=3

(string) 'foo'

$c

$a

$c is_ref=0 refcount=2

(string) 'foo'

$bis_ref=0 refcount=1

(int) 17

is_ref=0 refcount=1

(string) 'foo'$c

is_ref=0 refcount=1

(int) 17$b

Page 27: La mémoire et PHP

nAcademy Le 31 octobre 2013

Comparaison : echo VS print

© http://www.phpbench.com/ = Fonctions presque identiques

Page 28: La mémoire et PHP

nAcademy Le 31 octobre 2013

Comparaison : isSet() VS empty() VS is_array()

© http://www.phpbench.com/ = isSet() and empty() sont identiques

Page 29: La mémoire et PHP

nAcademy Le 31 octobre 2013

Comparaison : double (") VS single (') quotes

© http://www.phpbench.com/ = c'est satisfaisant

Page 30: La mémoire et PHP

nAcademy Le 31 octobre 2013

Comparaison : For VS While

© http://www.phpbench.com/ = While plus rapide

Page 31: La mémoire et PHP

nAcademy Le 31 octobre 2013

Comparaison : foreach() VS for() VS while(list() = each())

© http://www.phpbench.com/ = Avantage Foreach

100 elements, 24byte key and 10k data per entry

Page 32: La mémoire et PHP

nAcademy Le 31 octobre 2013

Autres indicateurs de consommation de mémoire

• _POST ? 160 B

• _GET ? 368 B

• _COOKIE ? 232 B

• _FILES ? 48 B

• indice ? 112 B

• indicestart ? 112 B

• indicestop ? 112 B

• datas ? 25.21 MB

Page 33: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Regard plus attentif✔ Class✔ Boucle

✔ Eviter si possible✔ RegEXP✔ Trop grandes classes

Ne pas oublié

Page 34: La mémoire et PHP

nAcademy Le 31 octobre 2013

✔ Peu d'outils (pour PHP)✔ memory_get_usage()✔ OS help (/proc , pmap , etc...)✔ Pour éviter les risques de fuite mémoire 

✔ Valgrind, mtrace, ccmalloc...✔ PHP Extensions

✔ Xdebug : xdebug_debug_val✔ memprof https://github.com/arnaud-lb/php-memory-profiler✔ memtrack

Surveiller la consommation de mémoire

Page 35: La mémoire et PHP

nAcademy Le 31 octobre 2013

Merci

Sources : 

Slides : Julien PAULISite web :  www.developpez.com