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

La mémoire et PHP

  • Upload
    neuros

  • View
    728

  • 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

La mémoire et PHP

Christophe Villeneuve

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

Indispensable

nAcademy Le 31 octobre 2013

Hardware Software

La mémoire indispensable

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

Monitoring de la mémoire

nAcademy Le 31 octobre 2013

Surveillance de la mémoire serveur Linux

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

Et...

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

Les variables en 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

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

nAcademy Le 31 octobre 2013

Merci

Sources : 

Slides : Julien PAULISite web :  www.developpez.com