Upload
neuros
View
731
Download
2
Embed Size (px)
DESCRIPTION
Présentation à la nAcademy (Octobre 2013) : La mémoire et PHP par Christophe Villeneuve
Citation preview
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
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
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
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
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
nAcademy Le 31 octobre 2013
PHP✔ C'est juste un processuscomme les autres
✔ Codé en C
Mémoire et PHP (1/2)
nAcademy Le 31 octobre 2013
➢PHP➢Def. consommation
<?php
passthru(
sprintf(
cat /proc/%d/status,
getmypid()
)
);
?>
Mémoire et PHP (2/2)
nAcademy Le 31 octobre 2013
Utilisation de la mémoire (version de PHP)
http://php.net/manual/fr/features.gc.performance-considerations.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...
nAcademy Le 31 octobre 2013
✔ Appelé Zend Memory Manager✔ Actif par défaut
Mémoire interne de PHP avec PHPinfo()
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' ;?>
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
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 ()
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
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
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
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
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
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
nAcademy Le 31 octobre 2013
Comparaison : echo VS print
© http://www.phpbench.com/ = Fonctions presque identiques
nAcademy Le 31 octobre 2013
Comparaison : isSet() VS empty() VS is_array()
© http://www.phpbench.com/ = isSet() and empty() sont identiques
nAcademy Le 31 octobre 2013
Comparaison : double (") VS single (') quotes
© http://www.phpbench.com/ = c'est satisfaisant
nAcademy Le 31 octobre 2013
Comparaison : For VS While
© http://www.phpbench.com/ = While plus rapide
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
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
nAcademy Le 31 octobre 2013
✔ Regard plus attentif✔ Class✔ Boucle
✔ Eviter si possible✔ RegEXP✔ Trop grandes classes
Ne pas oublié
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