systemadmin.es > LAMP y web > Rendimiento PHP sobre NFS: realpath_cache_size y realpath_cache_ttl

Rendimiento PHP sobre NFS: realpath_cache_size y realpath_cache_ttl

En entornos dónde el acceso a disco no es especialmente rápido, por ejemplo si tenemos los ficheros PHP en un NFS, las variables realpath_cache_size y realpath_cache_ttl cobran una especial relevancia

Por defecto los valores de realpath_cache_size y realpath_cache_ttl son los siguientes:

# cat /etc/php.ini | grep real
; So only set this entry, if you really want to implement such a
; Determines the size of the realpath cache to be used by PHP. This value should
; http://www.php.net/manual/en/ini.core.php#ini.realpath-cache-size
;realpath_cache_size = 16k
; Duration of time, in seconds for which to cache realpath information for a given
; http://www.php.net/manual/en/ini.core.php#ini.realpath-cache-ttl
;realpath_cache_ttl = 120

Dichas variables controlan el tamaño de la cache de paths y el tiempo de vida en dicha cache respectivamente. Esta cache sirve para identificar el path real de un fichero cuando lo estamos referenciando sin él, por ejemplo:

(...)
require_once("ejemplo.php");
(...)

Para acceder a dicho fichero se busca tanto en el directorio actual como en el include_path, conservando dicho path real en la caché.

Evidentemente, para ficheros que la consulta lstat es local se va a notar mucho menos el efecto que para ficheros que implican también tráfico de red (cómo NFS)

Tomando como base las siguientes métricas de una aplicación real con tráfico real:

# strace -c $(pgrep httpd | sed 's/^/-p /') & sleep 60; pkill strace
(...)
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 42.56    2.174016           6    383248     91282 stat
 21.61    1.104076          45     24499         4 open
 12.47    0.636819           8     83791           select
  4.82    0.246470           5     47152           sendto
  4.03    0.205633           4     54892       837 lstat
  2.71    0.138254           3     47373       255 recvfrom
  1.98    0.100989           2     50084      1624 read
  1.94    0.099314           3     35259     21325 access
  1.77    0.090637           2     51893           fstat
  1.23    0.063051           2     27350           close
  1.22    0.062489           5     12092           poll
  0.45    0.022973           2      9292           munmap
  0.42    0.021307           2      9292           mmap
  0.37    0.018812           1     14382           lseek
  0.32    0.016524           4      3963           write
  0.25    0.012915           1     10269           setitimer
  0.22    0.011390           8      1429      1365 connect
  0.15    0.007796           5      1714           writev
  0.15    0.007544           1      5322           getrusage
  0.14    0.007167          18       404           brk
  0.14    0.007055           3      2659           chdir
  0.14    0.006976           3      2734           socket
  0.13    0.006435           2      3867           recvmsg
  0.11    0.005559           1      5602           fcntl
  0.10    0.004999          94        53           sendfile
  0.08    0.003875          16       242           semop
  0.07    0.003377           1      3344           getcwd
  0.04    0.002248           3       766           flock
  0.04    0.002180           1      1597           times
  0.04    0.001966           1      1604           rt_sigaction
  0.04    0.001873           1      1289           bind
  0.04    0.001804           4       413       123 futex
  0.03    0.001787           1      1420           rt_sigprocmask
  0.03    0.001679          28        60           wait4
  0.03    0.001591           2       767           pwrite
  0.03    0.001367           1      1403           getsockname
  0.02    0.001000        1000         1           clone
  0.02    0.001000           9       114           epoll_wait
  0.02    0.000891           3       320           setsockopt
  0.01    0.000656         219         3           chmod
  0.01    0.000603           5       114           accept
  0.01    0.000455          57         8         4 unlink
  0.01    0.000316           2       162         1 shutdown
  0.00    0.000190           0      1366           getsockopt
  0.00    0.000122           1       184           alarm
  0.00    0.000076           3        26           ioctl
  0.00    0.000000           0        73           nanosleep
  0.00    0.000000           0         3           restart_syscall
------ ----------- ----------- --------- --------- ----------------
100.00    5.108256                903894    116820 total

Y repitiendo los el comando para ver que sea más o menos estable:

(...)
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 44.95    5.052551           6    787146    188495 stat
 18.92    2.126182          46     46260         5 open
 11.36    1.277162           8    168881           select
  5.25    0.590178           6     95111           sendto
  3.42    0.384732           4     91444      1809 lstat
(...)

Podemos proceder a augmentar el tamaño de dicha caché y el TTL:

realpath_cache_size = 1m
realpath_cache_ttl = 360

Podremos ver que los números bajaran bastante:

# strace -c $(pgrep httpd | sed 's/^/-p /') & sleep 60; pkill strace
(...)
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 44.22    5.061234           9    563228    132133 stat
 17.67    2.022165          54     37367         4 open
  9.60    1.098979          17     65157           sendto
  8.07    0.924056           8    111167           select
  3.86    0.441461           7     64134      2780 read
  2.65    0.303352          14     22360           poll
  1.98    0.227154           3     66445       667 recvfrom
  1.83    0.208999          70      2990           writev
  1.81    0.206657           3     62471      2192 lstat
  1.17    0.133475           3     42631           close
  1.06    0.120743          19      6243           getcwd
  0.97    0.110868           1     79734           fstat
  0.73    0.083063           2     39784     24072 access
  0.57    0.065520          13      5213           socket
  0.52    0.059724          10      6118           write
(...)

Igualmente, dicha caché es local para cada proceso de apache (o cada PHP si esta con PHP-fpm) por lo que deberemos dejar un tiempo prudencial para que se “caliente la caché” y los resultados sean estables:

(...)
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 41.83    3.171773           5    633638    139733 stat
 23.02    1.745552          42     41706           open
 11.79    0.894276           7    128504        66 select
  4.37    0.331188           4     74315           sendto
  2.12    0.160783           3     55735      1248 lstat
  2.11    0.159806           2     74716       520 recvfrom
  1.99    0.151160           6     23277           poll
  1.74    0.131846        1388        95           clone
  1.69    0.127918           2     80345      3003 read
  1.50    0.113386           1     88665           fstat
  1.36    0.103333           2     43321     26203 access
  1.10    0.083691           2     47356           close
(...)

En este caso los números no son escandalosos porque la aplicación estaba bien optimizada (include_path corto y paths absolutos en la mayoría de los require()), pero he visto un caso en el que cambiar dichas variables era la diferéncia entre tener caídas constantes a estar funcionando normalmente.

One comment to “Rendimiento PHP sobre NFS: realpath_cache_size y realpath_cache_ttl”

  1. Hola gente, cuidado que estas dos variables quedan sin efecto cuando open_basedir o safe_mode están en uso.
    En tal caso debemos compilar la extensión de Php realpath_turbo, para habilitar el uso de las mismas y modificar su valor.
    Actualmente me encuentro realizando pruebas sobre MooseFS para verificar las mejoras.

    Saludos desde Argentina.

    Pablo

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>