Foros del Web » Programando para Internet » PHP »

Rendimiento con APC

Estas en el tema de Rendimiento con APC en el foro de PHP en Foros del Web. Buenas a todos, estoy haciendo un sistema en php y he instalado la extensión APC, sobre todo por probar si mejora en algo el rendimiento. ...
  #1 (permalink)  
Antiguo 28/01/2010, 03:03
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Rendimiento con APC

Buenas a todos,
estoy haciendo un sistema en php y he instalado la extensión APC, sobre todo por probar si mejora en algo el rendimiento. Y en mi caso parece ser que incluso lo ralentiza (probado con el ab.exe de apache).
De memoria era algo así como 4,76 request/segundo con el APC y 5,98 sin el APC. El caso es que en el sistema, tengo una clase Autoload que utiliza la librería spl propia de php 5.3 (implementada por la cantidad de includes que tendría que hacer de otra forma) y he leído en algún sitio, que el APC, se lleva "mal", con este tipo de funcionalidad (Autoload, include_once, require_once, etc...).
Conocéis el tema? En el caso de que sea eso (todavía no he tenido tiempo de probar, sin la clase Autoload...), que me podéis recomendar?
Aparte de la duda, cualquier aporte sobre esta extensión será bienvenida.
Muchas gracias y un saludo!
  #2 (permalink)  
Antiguo 28/01/2010, 10:41
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Rendimiento con APC

una sola pregunta.. lo estas probando todo en local o en un servidor dedicado??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 28/01/2010, 11:47
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Respuesta: Rendimiento con APC

Sí, de momento todo en local. Todavía estoy desarrollando el sistema
  #4 (permalink)  
Antiguo 28/01/2010, 11:52
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Rendimiento con APC

bueno, entonces es obvio que en local no te va a dar el rendimiento real... vamos, ¿seguramente utilizas Windows??

al menos en sistemas *nix el rendimiento es mejor, aún en pruebas... solo te pido que reflexiones en ello, mientras estés en local no vas a ver el rendimiento real de APC... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 28/01/2010, 15:08
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Respuesta: Rendimiento con APC

Ey, gracias por tu respuesta pateketrueke!

sí, utilizo windows, pero de todas formas, las pruebas estaban hechas sobre el mismo sistema activando la extensión APC y desactivándola..., con lo que entiendo que pese a no explotar su potencial real desde un servidor local, la relación de rendimiento entre las dos pruebas, sí es a tener en cuenta no? (por favor corrígeme si me equivoco).

De hecho, he seguido leyendo y buscando y sí que he encontrado algún artículo que decía que las funciones __autoload y sobre todo la librería spl, no premitían sacar todo el jugo al APC o cualquier otro cacheador opcode.

La razón al parecer es que la aplicación no sabe de primeras que ficheros "compilar" ya que con estas funciones la carga de ficheros se hace según se van necesitando y de forma dinámica, con lo que solo se traduce una mínima parte del código.

Y realmente tiene sentido, viendo en el apc.php los resultados me daba un 3% de hits sobre un 97% de misses.

Vale, todavía me gustaría hacer una prueba incluyendo todos las clases a mano y ver si mejora la cosa, y en el caso de confirmarlo, me vería ante la duda de si utilzar el autoload o no, por mejorar el rendimiento... ya veremos.

Alguna idea?

saludos
  #6 (permalink)  
Antiguo 28/01/2010, 16:13
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Respuesta: Rendimiento con APC

Hola otra vez,
bueno, acabo de hacer las pruebas (en servidor local ) con el sistema que estoy haciendo sobre dos versiones, una con require_once, metiendo los archivos a pelo, y otra con una clase Autoload y por otro lado, con cada una de ellas con la extensión APC activada y desactivada.
Las pruebas las he hecho con el ab de apache, haciendo 50 request a la aplicación

Los resultados que me han dado:

Versión con includes:
sin APC:
-Tiempo:8.842 segundos
-Requests/seg:5.66

con APC:
-Tiempo:3.140 segundos
-Requests/seg:15.92

Versión Autoload:
sin APC:
-Tiempo:8.623 segundos
-Requests/seg:5.80

con APC:
-tiempo:12.122 segundos
-Request/seg:4.12

Por lo que concluyo, que lo más provechoso sí es incluir a mano los archivos pensando en el rendimiento, pero aún así es una putada, por todos los beneficios que te aporta, a nivel de mantenimiento la función __autload.

No sé, de momento la aplicación es relativamente pequeña, pero poco a poco va a ir creciendo con lo que ya veré.

De todas forma, cualquier aporte será bienvenido.

Un saludote!
  #7 (permalink)  
Antiguo 28/01/2010, 17:19
Avatar de unreal4u  
Fecha de Ingreso: octubre-2008
Mensajes: 72
Antigüedad: 15 años, 5 meses
Puntos: 10
Respuesta: Rendimiento con APC

hace tiempo atrás, leí como 20 razones para NO ocupar autoload, las principales eran justamente rendimiento y orden del código, y aquí puedo hablar demás, pero me parece mucho que en PHP6 lo iban a sacar. (Aunque puedo estar hablando demás, lo leí hace mucho tiempo atrás).
Por lo mismo no me pidan algún link pq a estas alturas ya ni siquiera me acuerdo dónde lo leí xD

Eso sí, desde que dejé de ocupar el autoload, encuentro que mis programas están más "ordenados" por decirlo de alguna forma xD

include_once y require_once son efectivamente el doble o triple de lentas que ocupando sólo include o require, más que nada pq debe hacer una montonera de validaciones antes de incluir el archivo, mientras más grande más se demora.

Por lo tanto, lo que aconsejo es hacer los includes manualmente :) Es mucho más rápido, fácil y ordenado una vez que le agarras el ritmo.

Saludos !!
  #8 (permalink)  
Antiguo 29/01/2010, 03:45
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 0
Respuesta: Rendimiento con APC

hola unreal4u, gracias por el aporte!
De todas formas no estoy de acuerdo en que sin la opción de autoload, los programas queden más ordenados. Precisamente, yo personalmente es una de las ventajas que le veo: el que la inserción de los ficheros necesarios sea completamente transparente, dándote una gran flexibilidad, además de la mejora incríble que supone para el mantenimiento del código.
Siguiendo la convención del paradigma de orientación a objetos fielmente de un fichero una clase, al final el problema es que te haces con un montón increíble de includes que abren una vía muy grande a los errores.

Es más, en mi aplicación como en la mayoría, yo no tengo ni idea en un principio de las acciones a las que se va a llamar, estas se instancian dinámicamente según lo que pida el usuario.

El autoload, te permite la posibilidad de cargar sólo aquellos ficheros que se necesitan en el momento, mientras que sin él, tendría que cargar todos los ficheros se vayan o no a utilizar (siempre buscando el mayor rendimiento posible con el APC). Incluso siguiendo el principio de sólo cargar aquellos ficheros que una clase pueda necesitar, seguramente vaya a necesitar cargar dos veces el mismo fichero (esto es, tener que escribir en más de un sitio el mismo código).
Que pasa si cambio de nombre a uno de los ficheros en un punto en el que la aplicación ya ha crecido bastante?
Que pasa además cuando quiera meter un nuevo módulo. Tendré que modificar el motor de la aplicación para que importe los nuevos ficheros

Esto se solucionará creo yo, cuando se implemente el concepto de paquetes, lo cual espero no tarde en llegar, donde solo necesitarías importar un paquete (puediendo contener este un montón de clases)y entonces sí, el APC será algo aprovechable, pero de momento prefiero la flexibilidad que te da el autoload de ficheros creo...

Además, a nivel de rendimiento y optimización se pueden hacer muchas más cosas... caché de salida, compresión gzip, optimización de las llamadas a bases de datos etc... y sobre todo, hace poco leía un artículo en el que decían que el mayor cuello de botella se genera en el cliente en un proporción del 80%, con lo que la optimización del lado del cliente es quizás lo más importante.

Parece que me estoy contestando a mí mismo, pero me ha parecido un tema interesante y aquí hay gente con muchíiisima más experiencia que yo, que seguro puede darme más puntos a tener en cuenta o echar por tierra lo que digo!

saludos!!
  #9 (permalink)  
Antiguo 29/01/2010, 11:26
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Rendimiento con APC

Solo es como meditar un poco, si ves Frameworks muy grandes como Zend Framework, usan require en todos sus archivos, no dependen al 100% del autoload más que para cuando implementas.

Así que tu conclusión es buena, mientras sepas que archivos vas a usar (por ejemplo en un extends) es mejor hacer el require_once al inicio de tu código.

Saludos.
  #10 (permalink)  
Antiguo 30/01/2010, 21:13
Avatar de unreal4u  
Fecha de Ingreso: octubre-2008
Mensajes: 72
Antigüedad: 15 años, 5 meses
Puntos: 10
Respuesta: Rendimiento con APC

Cita:
Iniciado por basa Ver Mensaje
hola unreal4u, gracias por el aporte!
de nada :P

Cita:
Iniciado por basa Ver Mensaje
De todas formas no estoy de acuerdo en que sin la opción de autoload, los programas queden más ordenados. Precisamente, yo personalmente es una de las ventajas que le veo: el que la inserción de los ficheros necesarios sea completamente transparente, dándote una gran flexibilidad, además de la mejora incríble que supone para el mantenimiento del código.
Totalmente de acuerdo: como idea es muy buena. No tener que preocuparte de qué archivo vaya o no a incluir me parece una idea fantástica :D

Cita:
Iniciado por basa Ver Mensaje
Siguiendo la convención del paradigma de orientación a objetos fielmente de un fichero una clase, al final el problema es que te haces con un montón increíble de includes que abren una vía muy grande a los errores.

Es más, en mi aplicación como en la mayoría, yo no tengo ni idea en un principio de las acciones a las que se va a llamar, estas se instancian dinámicamente según lo que pida el usuario.
Y es ahí donde entramos en la problemática. Yo he programado un montón de CMS tanto desde cero como ocupando algunos pre-hechos (mostrario de productos, ventas online, noticias, galería de imágenes, etc) y aunque en un principio me llamó la atención el autoload, finalmente lo deseché.
Por qué? Prefiero hacer un sistema mucho más modular y de esa manera cargaré sólo los módulos que me interesan, pero eso require bastante experiencia. Sólo por dar con un ejemplo, el otro día me tocó incorporarle características nuevas a un sw que había hecho en PHP hace 3 años y en muchos lugares me dije: "Yo hice ESO? Oh dios mío, qué aberración". Después de unos lijeros cambios por aquí y por allá, la aplicación que antes generaba la página en 1.7 segundos ocupando 15MB de RAM ahora lo hace en 0.6 ocupando 6.3MB (con APC y algunos ajustes en MySQL finalmente quedó en 0.3 ocupando 3.3MB), y los cambios fueron bastante simples: en vez de cargar todo; separé, hice un nuevo archivo que verificara qué página se estaba mirando; y de acuerdo a eso iba cargando los distintos módulos. De 1.7 segundos a 0.3 segundos la diferencia sí se nota.

En un principio puede parecer difícil, pero una vez que definas bien la estructura de tu sistema no será necesario depender de autoload, que por lo demás es un poco más lento que un include_once.
Ahora ocupo la filosofía de que si voi a necesitar algo, recién ahí lo cargo. Ejemplo: si un usuario quiere subir una imagen, recién cuando verifico que el mismo ha subido la imagen, que es una imagen válida y que se necesita crear un thumbnail, cargo mi class que genera el thumbnail y recién ahí la genero. Antes no. De esa forma, si la creación del thumbnail no se aplica, simplemente se omite ese paso.
La única excepción a esta regla es la class que se conecta a la DB y que me permite realizar consultas: en el 99% de las páginas se ocupa, por lo tanto, prefiero cargarlo siempre y tenerlo listo para las demás. Si alguna página no necesita de acceso a la base de datos, bueno, mala suerte, hay 99 otras páginas que sí lo necesitan.
Al final, lo que se hace, es; mediante un solo include al principio de index.php; generar un ambiente de trabajo, que verifica permisos, verifica módulos a cargar, establece variables, deja a disposición ciertas funciones que podrían o no llegar a ocuparse, y un largo etc.
Después tengo en un archivo aparte lo que es el HTML en sí: el header y el footer están separados, y especialmente el header puede recibir un montón de parámetros que se establecen antes: el título de la página, si cargar o no cargar ciertos CSS, .js, si hay algo que hacer en el onload del body, etc. Si existe algún menú lateral, éste se cargará (una sola vez) en el header.

Cita:
Iniciado por basa Ver Mensaje
El autoload, te permite la posibilidad de cargar sólo aquellos ficheros que se necesitan en el momento, mientras que sin él, tendría que cargar todos los ficheros se vayan o no a utilizar (siempre buscando el mayor rendimiento posible con el APC). Incluso siguiendo el principio de sólo cargar aquellos ficheros que una clase pueda necesitar, seguramente vaya a necesitar cargar dos veces el mismo fichero (esto es, tener que escribir en más de un sitio el mismo código).
Idealmente, nunca será necesario cargar un mismo archivo dos veces. Todo depende del orden que se tenga.

Cita:
Iniciado por basa Ver Mensaje
Que pasa si cambio de nombre a uno de los ficheros en un punto en el que la aplicación ya ha crecido bastante?
Sólo una vez me ha pasado eso xD Fue cuando me pidieron si podía llevar el sitio de MySQL a PostGreSQL. El único problema es que la class que se llamaba db.class.php había que renombrarla a mysql.class.php para mayor claridad. Afortunadamente, sólo se incluía una sola vez en un solo archivo, así que no fue tan grave.

Cita:
Iniciado por basa Ver Mensaje
Que pasa además cuando quiera meter un nuevo módulo. Tendré que modificar el motor de la aplicación para que importe los nuevos ficheros
Siempre hay que dejar las puertas abiertas a nuevos desarrollos, y se pueden dar dos situaciones diferentes:
1.- Dejo una plantilla: por ejemplo, en cierta aplicación, cuando se desarrolla un nuevo módulo, tengo una plantilla con todo lo necesario para empezar:
Código PHP:
Ver original
  1. <?php
  2. include('includes/sesiones.php');
  3. $titulo = 'No funcionando todavía';
  4. include('includes/header.php'); ?>
  5. <h1 class="titulo-pagina">T&iacute;tulo descriptivo de la p&aacute;gina</h1>
  6. <p class="descripcion-pagina">Peque&ntilde;o texto que muestra informaci&oacute;n m&aacute;s extendida de qu&eacute; hace la p&aacute;gina. (Opcional, no tiene que ser más de dos líneas!)</p>
  7. <?php mensajes(1,'M&oacute;dulo en desarrollo!'); ?>
  8. <!-- Inicio HTML -->
  9. Contenido de la p&aacute;gina
  10. <!-- Fin HTML -->
  11. <?php
  12. DibujaVacio(25);
  13. include('includes/footer.php');
  14. ?>

2.- Creo toda una base para la incorporación de nuevos módulos, es bastante más complicado pero permite una carga 100% modular siempre y cuando se sigan las reglas establecidas por el software.

Cita:
Iniciado por basa Ver Mensaje
Esto se solucionará creo yo, cuando se implemente el concepto de paquetes, lo cual espero no tarde en llegar, donde solo necesitarías importar un paquete (puediendo contener este un montón de clases)y entonces sí, el APC será algo aprovechable, pero de momento prefiero la flexibilidad que te da el autoload de ficheros creo...

Además, a nivel de rendimiento y optimización se pueden hacer muchas más cosas... caché de salida, compresión gzip, optimización de las llamadas a bases de datos etc... y sobre todo, hace poco leía un artículo en el que decían que el mayor cuello de botella se genera en el cliente en un proporción del 80%, con lo que la optimización del lado del cliente es quizás lo más importante.
Frente al primer párrafo: sí, será super interesante.
Segundo párrafo: sí, a nivel de optimización se pueden hacer muchísimas cosas... pero depende de uno implementarlas xDD
El contenido gzippeado de la página no se va a realizar JAMÁS a menos que uno mismo lo habilite, ya sea por Apache [personalmente mi método preferido] o bien por ob_start('ob_gzhandler'), después el ob_length (para establecer la cabecera Content-Length si no se quiere que el cliente reciba los datos de forma "chunked" [no sé cuál es la traducción de ese término, debería ser "por pedazos" o algo así]) y finalmente el ob_end_flush().
De todas formas, tal como dije más arriba, el cliente sí se va a dar cuenta que la página carga lento si se demora más de 2 segundos en generarse (AKA lo que PHP se demora en procesarla), y eso es responsabilidad única y exclusivamente nuestra.

Ah bueno, como último punto: con el esquema de arriba se aprovecha plenamente APC, ya que va a tener en su caché todo el opcode de los includes :D

Saludos !!

Última edición por unreal4u; 30/01/2010 a las 21:17 Razón: acostumbrado al tag [PHP] xD
  #11 (permalink)  
Antiguo 30/01/2010, 22:32
Avatar de unreal4u  
Fecha de Ingreso: octubre-2008
Mensajes: 72
Antigüedad: 15 años, 5 meses
Puntos: 10
Respuesta: Rendimiento con APC

PD: Hice unas búsquedas en Google y me encontré con esto:

Código code:
Ver original
  1. <arnaud_> does autoload have a performance impact when using apc ?
  2. <Rasmus_> it is slow both with and without apc
  3. <Rasmus_> but yes, moreso with apc because anything that is autoloaded is pushed down into the executor
  4. <Rasmus_> so nothing can be cached
  5. <Rasmus_> the script itself is cached of course, but no functions or classes
  6. <Rasmus_> Well, there is no way around that
  7. <Rasmus_> autoload is runtime dependent
  8. <Rasmus_> we have no idea if any autoloaded class should be loaded until the script is executed
  9. <Rasmus_> top-level clean deps would speed things up a lot
  10. <Rasmus_> it's not just autoload
  11. <Rasmus_> it is any sort of class or function declaration that depends on some runtime context
  12. <Rasmus_> if(cond) function foo...
  13. <Rasmus_> if(cond) include file
  14. <Rasmus_> where file has functions and classes
  15. <Rasmus_> or heaven forbid: function foo() { class bar { } }

Básicamente, Rasmus dice que siempre autoload va a ser lento, con o sin APC, pero que con APC la class que se carga automáticamente no se incorpora a la caché interna.
Solución para esto no hay, debido a que autoload está en tiempo de ejecución y que es variable, lo mismo corre para las condicionales: es más rápido para APC cargar todos los archivos una vez que ir cargándolas a medida que las vaya necesitando.

Interesante descubrimiento :) Por otro lado, incorporar todas las class es lento, innecesario y poco práctico, y al respecto tb encontré esto:

Código code:
Ver original
  1. To clarify, of course conditionally included files get compiled and
  2. cached.  The issue is not the included files but the resulting
  3. conditionally defined classes and functions needing to be redefined on
  4. every request.  Whether that is significant or not comes down to the
  5. specifics of the situation, but there is no doubt that it is slower.  It
  6. comes down to a NOP vs. a FETCH_CLASS, for example and the NOP is
  7. obviously way faster.
  8.  
  9. -Rasmus

Según de lo que entiendo, esto contradice lo anterior xDDD

Fuentes:
http://bugs.php.net/bug.php?id=42683
http://pooteeweet.org/blog/538
http://marc.info/?l=pecl-dev&m=116512075914909&w=2

Saludos !!

Etiquetas: rendimiento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:57.