Rendimiento

Optimice la velocidad de respuesta del sitio.

¿Puede Elgg funcionar con X millones de usuarios?

La gente suele preguntar si Elgg es capaz de funcionar con una gran cantidad de usuarios.

En primer lugar, podríamos preguntar «¿de dónde esperar sacar a todos esos usuarios?». Pero, bromas aparte, se trata de un problema muy interesante. Hacer que Elgg permita un gran número de usuarios es un problema de ingeniería técnica. Es un problema interesante, pero más o menos resuelto. La ciencia de la computación no funciona de manera diferente para Elgg de lo que lo hace para Google, por ejemplo. ¿Conseguir millones de usuarios? Eso es como el Santo Grial de toda la industria tecnológica.

En segundo lugar, como para casi todo en esta vida, la respuesta es «depende»:

  • ¿Cómo de activos son los usuarios?
  • ¿Qué hardware está utilizando en el servidor de Elgg?
  • ¿Están comportándose correctamente los complementos?

Mejorar la eficiencia del motor de Elgg es un proyecto en progreso, pero existen límites en lo que puede hacer un script.

Si de verdad le preocupa el problema de la escalabilidad, le interesará echarle una ojeada a una serie de cosas por su cuenta.

Mida antes de nada

No sirve de nada emplear recursos para resolver un problema si desconoce:

  • Cuál es el problema.
  • Qué recursos necesita para solucionarlo.
  • Dónde necesita situar dichos recursos.

Invierta en algún tipo de análisis que le ayude a descubrir dónde se encuentra su cuello de botella, especialmente si está pensando en invertir una cantidad de dinero importante en solucionar un problema.

Ajuste la configuración de MySQL

Elgg hace un gran uso de la base de datos, realizando varias consultas por cada vez que se carga una página. Esto es perfectamente normal, y un servidor de bases de datos correctamente configurado debería poder lidiar con millares de solicitudes por segundo.

A continuación le ofrecemos algunos consejos que podrían servirle:

  • Asegúrese de que MySQL está configurado para usar el fichero de configuración (my.cnf) apropiado para las dimensiones de su sitio.
  • Aumente la cantidad de memoria disponible para PHP y MySQL. En cualquiera de los casos necesitará aumentar la cantidad de memoria disponible para el proceso de PHP.

Active un sistema de caché

Por regla general, si un programa es lento, es porque está realizando alguna operación de computación costosa de manera repetitiva. Un sistema de caché permite al sistema evitar realizar ese trabajo una y otra vez, pues el resultado de la operación se almacena en memoria de forma que no sea necesario realizar el procesamiento de nuevo en las llamadas siguientes. A continuación se plantean algunas soluciones de caché disponibles que puede utilizar para Elgg.

Caché simple

De manera predeterminada, las vistas se guardan en una caché en la carpeta de datos de Elgg durante un cierto período de tiempo. Esto elimina la necesidad de regenerar una vista cada vez que se carga una página.

Puede desactivar esta caché con $CONFIG->simplecache_enabled = false;. Para mejorar la eficiencia del sitio, asegúrese de que el valor de esta variable es true.

La caché puede resultar problemática durante el proceso de desarrollo, concretamente durante la edición de temas en su complemento, pues usar la versión de la caché tendrá preferencia sobre usar la que ofrece su complemento.

La caché simple puede desactivarse desde el menú de administración. Se recomienda que la desactive durante el desarrollo de la plataforma si está programando complementos para Elgg.

Esta caché se elimina de manera automática al activar, desactivar o cambiar la posición de un complemento. También cuando se ejecuta upgrade.php.

For best performance, you can also create a symlink from /cache/ in your www root dir to the assetroot directory specified in your config (by default it’s located under /path/to/dataroot/caches/views_simplecache/:

cd /path/to/wwwroot/
ln -s /path/to/dataroot/caches/views_simplecache/ cache

If your webserver supports following symlinks, this will serve files straight off disk without booting up PHP each time.

For security reasons, some webservers (e.g. Apache in version 2.4) might follow the symlinks by default only if the owner of the symlink source and target match. If the cache symlink fails to work on your server, you can change the owner of the cache symlink itself (and not the /views_simplecache/ directory) with

cd /path/to/wwwroot/
chown -h wwwrun:www cache

In this example it’s assumed that the /views_simplecache/ directory in the data directory is owned by the wwwrun account that belongs to the www group. If this is not the case on your server, you have to modify the chown command accordingly.

Caché del sistema

El lugar en el que se encuentran las vistas se guarda en caché para que no haga falta descubrirlo cada vez (un análisis determinó que la carga de páginas requería una cantidad de tiempo que aumentaba de manera no lineal a medida que se añadían componentes, debido al sistema de descubrimiento de vistas). Elgg también guarda en caché información como la asociación (mapping) de idiomas o el mapa de clases.

Puede desactivar esta caché con $CONFIG->system_cache_enabled = false;. Para mejorar la eficiencia del sitio, asegúrese de que el valor de esta variable es true.

Actualmente esta información se almacena en la carpeta de datos, aunque versiones futuras de Elgg podrían almacenarla utilizando Memcache. Al igual que con la caché simple, ésta se elimina al activar, desactivar o cambiar la posición de un complemento, así como cuando se ejecuta upgrade.php.

La caché del sistema puede desactivarse desde el menú de administración. Se recomienda que la desactive durante el desarrollo de la plataforma si está programando complementos para Elgg.

Boot cache

Elgg has the ability to cache numerous resources created and fetched during the boot process. To configure how long this cache is valid you must set a TTL in your settings.php file: $CONFIG->boot_cache_ttl = 3600;

Look at the Stash documentation for more info about the TTL.

Caché de consultas

For the lifetime of a given page’s execution, a cache of all SELECT queries is kept. This means that for a given page load a given select query will only ever go out to the database once, even if it is executed multiple times. Any write to the database will flush this cache. This cache will be automatically cleared at the end of a page load.

Puede que sufra problemas de memoria si usa la infraestructura de Elgg como una biblioteca en un script de la línea de órdenes en PHP. Para evitar estos problemas, desactive esta caché mediante $CONFIG->db_disable_query_cache = true;.

Etags y cabeceras de caducidad

Estas tecnologías informan a los navegadores web de los usuarios de cuándo guardar contenido estático (CSS, JavaScript, imágenes) en la caché local. Activar estas tecnologías reduce de manera considerable la carga del servidor y mejora el rendimiento desde el punto de vista del usuario.

Use el complemento de yslow para Firefox o «Chrome DevTools Audits» para confirmar qué tecnologías su sitio está utilizando actualmente.

Si los contenidos estáticos no se están guardando en caché:
  • Asegúrese de que tiene estas extensiones instaladas y activadas en el servidor.
  • Actualice el fichero «.htaccess» si está actualizando Elgg desde una versión anterior.
  • Active la caché simple, que convierte las vistas seleccionadas en contenido que los navegadores web pueden guardar en caché.

Memcached

Libmemcached was created by Brian Aker and was designed from day one to give the best performance available to users of Memcached.

Requisitos para su instalación:

  • php-memcached
  • libmemcached
  • memcached

Configuración:

Uncomment and populate the following sections in settings.php

$CONFIG->memcache = true;

$CONFIG->memcache_servers = array (
    array('server1', 11211),
    array('server2', 11211)
);

Optionaly if you run multiple Elgg installations but use ony one Memcache server, you may want to add a namespace prefix. In order to do this, uncomment the following line

$CONFIG->memcache_namespace_prefix = '';

Squid

Hemos obtenido buenos resultados usando Squid para mantener una caché de las imágenes.

Caché de código

Existen varios sistemas de caché de código PHP intermedio (bytecode) en el mercado. Estos sistemas aumentan el rendimiento de su sitio utilizando cachés para el código intermedio compilado a partir de su script, de forma que el servidor no tiene que compilar el código PHP cada vez que ejecuta éste.

Direct file serving

If your server can be configured to support the X-Sendfile or X-Accel headers, you can configure it to be used in settings.php. This allows your web server to directly stream files to the client instead of using PHP’s readfile().

Composer Autoloader Optimization

The Composer autoloader is responsible for loading classes provided by dependencies of Elgg. The way the autoloader works is it searches for a classname in the installed dependencies. While this is mostly a fast process it can be optimized.

You can optimize the autoloader 2 different ways. The first is in the commandline, the other is in the composer.json of your project.

If you want to optimize the autoloader using the commandline use the -o flag. The disadvantage is you have to add the -o flag every time you run Composer.

# During the installation
composer install -o

# Or during the upgrade process
composer upgrade -o

The second option is to add the optimization to your composer.json file, that way you never forget it.

{
        "config": {
                "optimize-autoloader": true,
                "apcu-autoloader": true
        }
}

Ver también

Check out the Autoloader Optimization page for more information about how to optimize the Composer autoloader.

Nota

As of Elgg 3.0 all the downloads of Elgg from the website have the optimized autoloader.

Servidor

No pretenda ofrecer un sitio capaz de alojar a millones de usuarios si sólo dispone de un servidor compartido de bajo coste. Necesitará un servidor propio y dedicado, con acceso a la configuración, así como un buen ancho de banda y gran cantidad de memoria.

Memoria, procesador y ancho de banda

Debido a cómo funcionan las cachés, los sistemas de caché requerirán memoria. Solucionar los problemas aumentando la memoria o mejorando el procesador suele salir barato.

En hardware avanzado, el cuello de botella será probablemente el ancho de banda del que dispone el propio servidor. Asegúrese de que la conexión que tiene contratada es suficiente para la demanda que espera que tenga el sitio.

Configuración

Finalmente, échele un ojo a su configuración, pues hay algunos aspectos inesperados que pueden darle problemas.

Por ejemplo, de manera predeterminada, Apache puede manejar una carga de trabajo alta. Sin embargo, la mayoría de las distribuciones de GNU/Linux vienen con un MySQL configurado para sitios pequeños. Esto puede llevar a que los procesos de Apache se queden pasados a la espera de comunicarse con alguno de los procesos de un MySQL sobrecargado.

Revise los complementos que no se estén comportando adecuadamente

Los complementos pueden programarse sin tener en cuenta el rendimiento, y un único complemento puede llegar a ralentizar todo el sitio.

Pruebe a desactivar algunos complementos y observar si ello mejora el rendimiento de manera notable. Una vez haya detectado algún complemento que parezca el responsable de los problemas de rendimiento, contacte con el autor original del complemento e infórmelo de sus hallazgos.

Use HTML generado por el cliente

Hemos descubierto que, llegados a cierto punto, una gran parte del tiempo empleado del lado del servidor consiste en generar el HTML de la página con el sistema de vistas de Elgg.

Es muy difícil guardar en caché la salida de los modelos (templates), dado que generalmente pueden rellenarse con una infinidad de datos distintos. En vez de intentar guardar en caché la salida HTML de ciertas páginas o vistas, le sugerimos que se pase a un sistema de modelos de páginas y vistas basada en HTML, de forma de que navegador web del usuario pueda guardar los propios modelos en caché. Entonces, deje que el ordenador del usuario realice el trabajo de generar el documento final aplicando datos en formato JSON a esos modelos.

Este sistema puede resultar muy efectivo, pero tiene la pega de que requiere unos costes de desarrollo adicionales significantes. El equipo de Elgg está considerando la posibilidad de integrar esta estrategia en el propio Elgg de manera directa dada su gran efectividad, especialmente en páginas con contenido repetido u oculto.