Archive for April 12th, 2008

¿Podemos tener PHP5 corriendo en un apache2 worker?

Saturday, April 12th, 2008

La respuesta básica a esta pregunta es sí; la razón de por qué no es tan simple, pero trataré de explicarlo en el siguiente artículo.

Apache 2 con mod_php puede ser ejecutado en dos modos; mpm_prefork y mpm_worker; mpm_prefork es una especie de compatibilidad con apache 1.x y es bueno para aplicaciones que poseen módulos que no son thread-safe; mpm_worker es un sistema multi-proceso multi-threaded (multi-hilado) y requiere que las aplicaciones en él ejecutadas posean hilos seguros de ejecución (thread-safe); mpm_worker es muchisimo más estable y puede ofrecer más conexiones con menos consumo de recursos; además de ser el ideal para equipos multi-core o multi-procesador.

mpm_worker tiene un rendimiento notablemente superior a mpm_prefork en la gran mayoría de las condiciones generales de un servidor web: ver aquí.

Entonces; ¿Por qué se usa mpm_prefork para PHP5? …

Muchas extensiones php5 (y php4) no son thread-safe; esto hace que php5 sea imposible de usar en modo mpm_worker sin “castrarlo” retirando aquellas extensiones que no lo son; sin embargo, esto no es problema alguno, puesto que la gran mayoría de las extensiones no “thread-safe” son básicamente no usadas por la mayoría; un ejemplo es la extensión mm; que permite crear una caché compartida para gestionar las sesiones (y que puede seguramente ser reemplazada por memcached) casi nunca es usada; gd versión 1 debe ser evitada y usar gd2.

Otro mito extendido por esto es que php5 no puede ser ejecutado en modo worker; esto es porque en Debian solo están los binarios compilados en modo prefork y de hecho, instalar php5 desinstala apache2 mpm_worker e instala mpm_prefork; por lo que he decidido compilar mi propio php5 para Debian Lenny (apache 2.2.4 y php 5.2.5) con soporte mpm_worker.

Compilando php5

Primero, debemos instalar algunas librerías que son requeridas (devel) para compilar php5:

>aptitude install libmhash-dev libmhash2 libtidy-dev libgd2-xpm-dev libgd2-xpm libmcrypt-dev libmcrypt4 mcrypt t1lib-bin libt1-dev libxml2-dev libcurl3-dev libaspell-dev libpspell-dev libxslt-dev libbz2-dev libsqlite-dev libdb4.4 db4.4-util libdb4.4++-dev libsqlite3-dev libsnmp-dev

Y luego de descomprimir php-5.2.5.tar.bz2 (descargado de la página de php.net) ejecutamos el siguiente ./configure en la raíz del código fuente:

CFLAGS=”-O3″ CXXFLAGS=”-O3 -fPIC -mtune=nocona -march=nocona \
-fPIC -pipe -fomit-frame-pointer -msse -fexceptions -ffast-math -mfpmath=sse,387″ \
./configure \
–prefix=/usr/php –sysconfdir=/etc/php5/apache2 –mandir=/usr/share/man \
–with-apxs2=/usr/sbin/apxs –libexecdir=/usr/lib/php5 –bindir=/usr/bin –libdir=/usr/lib/php5 \
–with-config-file-path=/etc/php5 –with-config-file-scan-dir=/etc/php5/conf.d \
–with-exec-dir=/usr/lib/php5/libexec –enable-inline-optimization \
–disable-debug –with-curl –with-curlwrappers –with-db4 \
–with-zlib=/usr –enable-bcmath –enable-calendar –enable-mbstring –enable-dba \
–with-libxml-dir=/usr –with-xmlrpc=shared –with-pear=/usr/share/php –with-regex \
–with-pcre-regex=/usr –enable-exif –with-t1lib –with-xsl \
–with-mhash –with-mcrypt –enable-zend-multibyte –with-pspell –enable-zip –enable-bcmath \
–with-jpeg-dir=/usr –enable-soap –enable-sockets –with-xpm-dir=/usr –with-freetype-dir=/usr/lib \
–enable-ftp –with-gd –with-png-dir=/usr –with-ttf \
–enable-json –with-mime-magic –with-tidy=/usr –with-ldap –with-xmlrpc \
–enable-gd-native-ttf –enable-gd-jis-conv –with-gettext –with-xmlrpc –with-xsl \
–with-mysql –with-mysqli \
–enable-sysvmsg –enable-sysvsem –enable-sysvshm –enable-sigchild \
–with-ldap –enable-mbstring –with-bz2 –with-iconv –with-gettext –enable-shmop \
–enable-sockets –enable-wddx –with-zlib \
–with-kerberos=/usr –with-openssl=/usr –enable-soap –with-snmp=/usr \
–with-pgsql –with-sqlite=/usr \
–enable-pdo –without-pdo-dblib –with-pdo-mysql \
–with-pdo-pgsql –with-pdo-sqlite=/usr

ejecutar:

make all

y luego:

make test

permitirá compilar y luego probar nuestro php5 en modo mpm_worker; al final un:

make install

permitirá instalar php5.2.5

Explicando brevemente las sentencias de pre-procesador:

Como verán, antes del .configure hemos ejecutado unas sentencias que mejoran el rendimiento del ejecutable php; entre ellas compilarla para el procesador que actualmente tenemos; en mi caso -mtune=nocona -march=nocona; nocona indica un procesador de doble nucleo (Core2-Duo), existen distintos modos dependiendo del ejecutable; pentium4, pentium-m, athlon-xp, prescott; siempre es bueno leer sobre -mtune y -march en el wiki de gentoo y en la guía de Compilación optimizada de Gentoo.

Apache Benchmark en un php5 con mpm_worker:

Para la ejecución de una aplicación PHP ab reporta:

ab -c 500 -n 500 http://localhost/tomates/

Requests per second: 32.66 [#/sec] (mean)

Conclusiones:

Espero que la utilización correcta de las extensiones de php; la utilización de un php thread-safe en un apache2 mpm_worker permitan a los desarrolladores crear aplicaciones más óptimas y a los servidores proveer una versión más rápida de php5 ejecutado sobre apache.

Notas finales:

La sentencia de compilación está configurada para el enviroment de debian o fedora (/etc/php5 como ruta del archivo php.ini); recuerden revisar bien el –prefix, –libdir, –bindir y otras rutas dependiendo de la distro donde deseen compilar el php5 en modo worker.

Servicio público

Saturday, April 12th, 2008

Hay dos cosas que siempre me caen mal y nunca entenderé de las gentes estresadas y sin sentido real de la vida de las ciudades; el no detenerse a contemplar las cosas hermosas de la vida (tomarse un café, admirar una mujer hermosa, disfrutar de un atardecer) y el perder toda fuerza de hacer ciudadanía y ayudar al prójimo sin esperar alguna “recompensa” a cambio; este factor hace que la gente viva eternamente estresada; desorientada y en enemistad con el resto de los habitantes de la ciudad; ver como una ciudad se convierte en una metropoli de almas de piedra es horrible, frio y terriblemente patético.

Me encontraba en San Cristóbal y en una transitada vía que va hacia Pueblo Nuevo, nos encontramos una gran cola de vehículos, dicha cola era en hora pico, de tal manera que era insoportable; cuando llegamos al final de la cola nos encontramos con una gran rama de arbol obstruyendo 2 canales (el de servicio y el del medio) y por ende, la gente pasaba despacio por un lado; le exclamé a Walter ¡Dios, que falta de conciencia ciudadana!; ¿Acaso nadie se puede bajar a ayudar a mover esa rama que les está afectando el tránsito y los está haciendo llegar tarde al almuerzo?; por lo visto no, habian pasado varias horas y la gente solo esperaba a algún operativo del gobierno para que se llevara la rama.

Nunca me ha gustado ser un inútil dependiente del gobierno y mucho menos, ser un “habitante” en vez de un “ciudadano” de donde me encuentre;  y le dije a Walter que orillaramos el vehículo y nos dedicaramos a mover esa gran rama para al menos, liberar un canal de tráfico y que hubiera más paso para todos (dije, “tal vez nuestra acción estimula a alguien y nos ayuda”); durante el proceso de liberar el canal de la rama que obstruía el paso cruzaron:
Un autobús de la UNET lleno de estudiantes
Una camioneta llena de chamos que decian “recien graduados de Ing. Industrial”
Un tipo que nos insultó por estar atravesados (como si fueramos culpables de tumbar el árbol) y nos lanzó su camioneta encima
Miles de carros más que miraban “consternados” como alguien puede ensuciarse las manos para mover un arbol sin que le estén pagando …

dsc00499.jpg
Primera foto; estamos viendo como mover la rama

dsc00498.jpg
Procediendo a mover el árbol

He de comentar que por accidente me corté la mano y empecé a sangrar, pero eso no evitó que removieramos la rama y lograramos destrancar el tráfico; aunque ni un “gracias” o “hurra” se escuchó de los vehículos (incluso uno pasó arrecho como a 90km/h como a 5 centímetros de walter, que si no se quita del canal recien destrancado, lo atropellan).

¿Qué le pasa a la gente que ya ni en las cosas que les afectan ayuda a los demás, o incluso a sí mismo?; ¿Cuanta desidia más se acumulará dentro de la población?… ¿Y así esperan que un país surja adelante? …

Por cosas como esta es que el venezolano vota por fórmulas mesiánicas; ya que le da pereza construir el país que desea con sus propias manos y espera a que los demás resuelvan los problemas …