Hay varias razones por las que es deseable que la representación de nuestros mapas en la web sea lo más rápido posible, la razón más importante es una mejor experiencia del usuario.
En esta entrada nos centraremos en las opciones y trucos para mejorar el rendimiento de GeoServer y de los servicios WMS.
Si no tienes claro qué es GeoServer, para qué sirve o qué es un un WMS, te recomendamos que comiences por esta entrada: GeoServer para novatos: Crear un WMS (o WFS) a partir de un shapefile.
En primer lugar tenemos que tener claro que hay dos factores importantes que afectan al rendimiento de GeoServer a la hora de mostrar nuestros mapas: el hardware y el software.
Vamos a comenzar por las mejoras que podemos hacer en el hardware para hacer mapas más rápidos.
1. Mejorar el hardware y el sistema operativo
Muchos aspectos que se comentan en nuestro artículo requisitos mínimos de un equipo para trabajar con GIS, se puede aplicar aquí, aunque en esta ocasión vamos a centrarnos más en la parte de los requisitos del servidor.
Es probable que nuestros servicios de WMS accedan a grandes cantidades de datos para generar las imágenes. Por lo tanto más memoria significa menos tiempo dedicado a recargar datos desde el disco.
La memoria RAM es una de las actualizaciones de hardware más baratas que podemos hacer. De igual forma disponer de un procesador con varios núcleos significará más capacidad para gestionar solicitudes en paralelo.
Las unidades de estado sólido (SSD) proporcionan tiempos de búsqueda más rápidos y consistentes.
La capacidad de la conexión entre el cliente y el servidor es también un factor importante en la experiencia del cliente. La podemos mejorar ampliando la capacidad de ancho de banda del servidor, así como utilizar formatos de imagen adecuados, compresión y proxies.
Linux tiene un rendimiento mucho mejor que Windows. Un servicio WMS es un 30 % más rápido en un servidor Linux que en Windows Server.
2. Seleccionar el servidor de aplicaciones correcto
GeoServer es una «Aplicación Web» de Java Enterprise Edition. Un servidor de aplicaciones (como Tomcat o Jetty) se ejecuta como una aplicación Java.
- El servidor de aplicaciones Jetty (utilizado en OpenGeo Suite por ejemplo) es más simple y pequeño.
- El servidor de aplicaciones Tomcat tiene un enfoque mucho más fuerte en cuanto a la velocidad y más adecuado para implementar en grandes arquitecturas GIS WEB.
3. Seleccionar el entorno de ejecución adecuado
La velocidad de GeoServer depende mucho del Entorno de ejecución Java (Java Runtime Environment – JRE) elegido. Las últimas versiones de GeoServer se han probado con Oracle JRE y OpenJDK. Las implementaciones que no se hayan testeado pueden funcionar correctamente, pero se recomiendan.
- Java 8 – GeoServer 2.9.x y superior.
- Java 7 – GeoServer 2.6.x a GeoServer 2.8.x.
- Java 6 – GeoServer 2.3.x a GeoServer 2.5.x.
- Java 5 – GeoServer 2.2.x y anerior.
Para un mejor rendimiento recomendamos el uso de Oracle JRE 8 (también conocido como JRE 1.8).
4. Optimizar la Máquina Virtual Java (JVM)
Las aplicaciones Java como GeoServer se ejecutan por una Máquina Virtual Java (JVM).
Un aspecto importante a considerar es optimizar la Máquina Virtual Java (JVM). En Windows los ajustes de la JVM se encuentran en la configuración del archivo start.ini que se ubica en C:\ Program Files (x86)\ Boundless\ OpenGeo\ jetty\ start.ini
En la documentación de GeoServer hay varios parámetros que podemos tocar para mejorar el rendimiento.
5. Cambiar la forma en la que se generan los logs
Cuando GeoServer se instala por defecto genera archivos de registro (logs) muy largos. En esta operación se emplea mucho tiempo.
Un truco rápido es modificar este tipo de registros. . Para modificarlo vamos a la interfaz de administración web de GeoServer, y en la sección izquierda: Settings > Global > Cambiamos el perfil de registro de DEFAULT_LOGGING a PRODUCTION_LOGGING.
6. Cambiar la estrategia de los servicios
GeoServer dispone de varias estrategias para devolver la salida al cliente.
Las posibles estrategias son:
- SPEED: Es la estrategia más rápida, pero los errores (si los hubiera) generalmente se omiten. Esta estrategia devuelve los resultados inmediatamente.
- BUFFER: Almacena todo el resultado en la memoria y lo sirve después de que la salida esté completa. Esto garantiza un adecuado informe de errores de OGC, pero la respuesta se demora bastante y puede agotar la memoria si la respuesta es grande.
- FILE: Similar a la anterior, pero almacena el resultado completo en un archivo en lugar de en memoria. Más lento que BUFFER, pero asegura que no habrá problemas de memoria.
- PARTIAL-BUFFER: Es la estrategia por defecto. Un equilibrio entre BUFFER y SPEED, esta estrategia trata de almacenar en la memoria algunos KB de respuesta, luego sirve la salida completa.
Para configurar la estrategia de los servicios como «SPEED» debemos hacer lo siguiente:
- Editar (como administrador) el archivo web.xml de GeoServer ubicado en \ jetty\ webapps\ geoserver\ WEB-INF.
- Buscamos la línea «ServiceStrategy»: <param-name>serviceStrategy</param-name>
- Cambiar la estrategia de servicio a «SPEED»: <param-value>SPEED</param-value>
- Guardamos el archivo y salimos.
- Reiniciamos Jetty o Tomcat.
7. Configurar límites en los servicios WFS y WMS
Para evitar el uso excesivo del servidor podemos evitar que los clientes soliciten demasiados datos a nuestro servidor.
Podemos establecer una cantidad máxima de objetos geográficos (features) devueltos por cada solicitud GetFeature de WFS.
Para ello establecer este límite vamos a la interfaz Web de GeoServer: Servicios > WFS > Features > Máximo número de features:
Establecer los límites de solicitud WMS para que ninguna petición pueda consumir demasiada memoria o tiempo.
Para establecer estos límites debemos ir a la interfaz Web de GeoServer: Servicios > WMS > Límites de consumo de recursos:
8. Uso de filtros en los estilos
El uso de reglas o filtros (delimitar por escala o por condición) reduce la cantidad de geometrías mostradas cuando modificamos el nivel de zoom, lo que repercute en la velocidad de representación de nuestros mapas.
<sld:MinScaleDenominator>200000</sld:MinScaleDenominator> <sld:MaxScaleDenominator>900000</sld:MaxScaleDenominator>
Un buen truco es crear un grupo de capas que contenga la misma capa dos veces, una para cada nivel de zoom. De este modo cubrimos todos los niveles de zoom pero solo se representa una capa en el mapa. Cada capa debe tener asociada una tabla diferente.
9. Evitar los estilos pesados
Algunos estilos son más pesados en términos de rendimiento que otros.
- Transparencia: Trabajar con cualquier transparencia básicamente duplicará su tiempo de renderizado.
- Las etiquetas son realmente pesadas: GeoServer tiene que recoger todas las etiquetas posibles y luego mezclarlas en su posición (dependiendo de las prioridades que establezcamos).
- Halo: Renderizar estas etiquetas es aún más caro si agregamos un Halo.
Aplicar un estilo sencillo a nuestros servicios WMS es un buen truco para mejorar el rendimiento de GeoServer.
10. Utilizar una base de datos para obtener los datos
En general una base de datos espacial como PostGIS es la herramienta más adecuada para el trabajo con información espacial en GeoServer.
Gracias al uso de los índices espaciales podremos realizar rápidamente algunas de las operaciones espaciales más avanzadas.
Aunque se recomienda PostGIS, GeoServer también soporta Oracle, DB2, y ArcSDE.
11. No reproyectar los datos
Una de las cosas más pesadas en términos de rendimiento que se le puede pedir a un WMS es que reproyecte los datos primero.
Aunque los servidores de mapas web son capaces de dibujar mapas en distintas proyecciones, esta capacidad tiene un coste y es un trabajo extra para servidor.
Para mejorar el rendimiento del servidor no obligues al servidor a reproyectar las capas, es mejor crear varias capas, una para cada proyección que utilicemos,
12. Simplificación de geometrías
Imaginemos que tenemos una capa con cientos de registros cuyo tipo de geometría es la polilínea. Si simplificamos cada geometría, cada línea tendrá menos puntos y por lo tanto se dibujarán menos cosas.
Aunque el número de objetos geográficos (features) será el mismo, cada geometría será más fácil de transferir entre PostGIS y GeoServer.
En GeoServer esto es fácil de implementar realizando lo siguiente:
En la sección Datos > Almacenes de datos > Seleccionamos nuestro almacén de PostGIS y en la pantalla «Editar un origen de datos vectoriales» marcamos la casilla Support on the fly geometry simplification.
13. Uso del plugin Pregeneralized Plugin
Este plugin se puede instalar como complemento de GeoServer.
Una vez instalado dispondremos de un nuevo almacén de datos en GeoServer, proporcionándonos la posibilidad de usar features pregeneralizados para reducir el uso de CPU y la memoria.
14. Seleccionar el formato adecuado para nuestros datos raster
GeoTIFF es un formato que funciona muy bien. Además conviene preparar el GeoTIFF dotandole de capacidades de inner tiling y overviews.
- El inner tilling configura el diseño de la imagen de modo que esté organizado en teselas en lugar de filas. Esto permite un acceso mucho más rápido a una determinada área del geotiff, y los lectores de Geoserver aprovecharán esto accediendo sólo a las teselas necesarias para representar el área de visualización actual.
- Un overview es una versión reducida de la misma imagen, es decir, una versión de zoom out, que suele ser mucho más pequeña.
También se recomiendan los formatos avanzados como ECW y JPEG2000.
JPEG es un formato demasiado pesado de decodificar, ya que toda la imagen necesita ser traída a la memoria. ArcGRID es un buen formato para el intercambio de información, pero no admite operaciones rápidas de lectura.
15. Crear mosaicos y pirámides de imágenes
Estos dos formatos de imagen permiten que GeoServer trabaje con un archivo que previamente se ha dividido en muchas teselas individuales.
- Image Mosaic utiliza un shapefile como un índice espacial para localizar dónde van los archivos individuales.
- Image Pyramid amplía esta idea para soportar diferentes niveles de zoom.
Estas técnicas se pueden utilizar para servir grandes cantidades de datos raster mientras que el rendimiento no se verá perjudicado.
16. Elegir el formato de salida adecuado
Después de dibujar una imagen, el resultado debe codificarse en un formato de imagen y devolverlo al cliente.
En una petición GetMap el parámetro format establece el formato para la salida de mapa: png, jpg, tiff, svg, kml, PDF, etc. Aquí el listado de los formatos de salida soportados por GeoServer.
Ejemplo de petición GetMap a un servidor GeoServer con el formato por defecto:
http://www.mirame.chduero.es:8080/geoserver/mirame/wms? SERVICE=WMS&VERSION=1.3.0& REQUEST=GetMap& LAYERS=mirame:Limites_Demarcacion& SRS=EPSG:4326& BBOX=-7.7,40.1,-1.7,43.2& FORMAT=image/png& WIDTH=600& HEIGHT=255
image/png es el formato por defecto, sin embargo el formato image/png8 calcula una paleta óptima de 256 colores (8 bits), por lo que el tamaño de la imagen suele ser más pequeño.
image/jpeg: Aunque las imágenes JPEG tardan mucho tiempo en codificarse, las imágenes resultantes son muy pequeñas y tardan menos tiempo en transmitirse.
17. Utilizar la extensión libjpeg-turbo
Este plugin proporciona la capacidad de codificar imágenes JPEG como salida WMS utilizando la librería libjpeg-turbo.
libjpeg-turbo es generalmente de dos a cuatro veces más rápido que la versión no modificada de libjpeg.
El módulo, una vez instalado, reemplaza el codificador JPEG estándar de GeoServer y nos permite usar la biblioteca libjpeg-turbo para codificar la respuesta JPEG para las solicitudes GetMap.
En la documentación de GeoServer hay más información de este complemento.
18. Desactivar Antialiasing
El antialising produce más graduaciones de color para «difuminar» las líneas en un aspecto más suave y produce resultados muy bonitos pero esto tiene un coste en términos de rendimiento.
Para mejorar el rendimiento de GeoServer es mejor no optar por esta opción.
Para deshabilitar antialiasing, podemos agregar una «opción de formato» a su solicitud GetMap (format_options=antialias:off).
http://www.mirame.chduero.es/geoserver/mirame/wms?SERVICE=WMS& VERSION=1.3.0& REQUEST=GetMap& LAYERS=mirame:Limites_Demarcacion& SRS=EPSG:4326& BBOX=-7.7,40.1,-1.7,43.2& FORMAT=image/png& WIDTH=600&HEIGHT=255& format_options=antialiasing:off
19. Utilizar GeoWebCache
Los servidores de teselas rompen la relación directa entre GeoServer y los clientes, intercambian almacenamiento en disco por velocidad.
GeoWebCache es una aplicación web que aumenta el rendimiento de un servicio WMS mediante un pre-dibujo y almacenamiento de las teselas de mapa para dar una respuesta más rápida a las solicitudes de los clientes.
Aunque es un producto independiente, lo habitual es utilizarlo de forma conjunta con GeoServer.
Si quieres saber más sobre GeoWebCache écha un vistazo a esta entrada, en la que te explicamos qué es GeoWebCache, cuándo usarlo y cómo funciona.
20. Desactivar la interfaz de administración web de GeoServer
En algunas circunstancias, es posible que deseemos desactivar completamente la interfaz de administración web. Hay dos maneras de hacer esto:
1. Establecer la propiedad GEOSERVER_CONSOLE_DISABLED del sistema Java a true agregando la siguiente sentencia a las opciones de la JVM (archivo start.ini):
DGEOSERVER_CONSOLE_DISABLED = true
2. Eliminar todos los archivos gs-web* -.jar del directorio WEB-INF/lib
¿Conoces algún truco más? ¡Deja un comentario con el tuyo!
Fuentes:
- Running in a production environment
- Boundless – GeoServer Performance
Imagen de cabecera: Designed by Freepik & Logo oficial de GeoServer
Licenciado en Geografía. Máster en Sistemas de Información Geográfica. Consultor GIS desde el año 2004. En MappingGIS desde el año 2012 para ayudarte a impulsar tu perfil GIS y diferenciarte de la competencia. Echa un vistazo a todos nuestros cursos de SIG online.