Optimización de Servidor Tomcat

Existen varios aspectos clave para mejorar el rendimiento del servidor Tomcat

Impacto de los recursos de hardware en Tomcat

El rendimiento del hardware del sistema afecta directamente la capacidad de concurrencia de Tomcat, siendo el CPU y la MEM los componentes más determinantes. Un aumento en la velocidad de procesamiento del CPU reducirá los tiempos de respuesta de Tomcat, mientras que el tamaño de la memoria determina la cantidad de memoria necesaria para la aplicación y el número de conexiones concurrentes posibles.

Selección de versión JDK

Siempre que los requisitos del proyecto lo permitan, es recomendable utilizar versiones más recientes de JVM. Generalmente, las versiones más recientes ofrecen mejoras en velocidad y eficiencia en comparación con las versiones anteriores.

Optimización de parámetros JDK

Descripción de parámetros JAVA_OPTS

-server Habilita la versión server del JDK;
-Xms   Memoria mínima inicial del JVM;
-Xmx  Memoria máxima utilizable por el JVM;
-XX:PermSize    Región de memoria permanentemente reservada
-XX:MaxPermSize   Tamaño máximo de la región de memoria permanente
-Xms=-Xmx=70% de memoria del servidor, por ejemplo, si se implementa Tomcat y JBoss en el mismo servidor, Xms=Xmx=80% de la memoria del servidor * 1/4. En servidores con memoria de hasta 4GB, se puede utilizar la siguiente configuración, agregando estos parámetros al archivo catalina.sh:
 JAVA_OPTS='-Xms1024m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=256m-XX:MaxPermSize=256m'
  
#-Xmx6000m                        #Establece la memoria máxima utilizable del JVM en 6000MB
#-Xms6000m                        #Establece la memoria inicial utilizable del JVM en 6000MB
#-Xmn2g                            #Establece el tamaño del joven generador en 2GB
#-Xss128k                           #Establece el tamaño del stack por cada hilo en 128KB
#-XX:NewRatio=4                 #Establece la proporción entre el joven generador y el antiguo generador en 4
#-XX:SurvivorRatio=4            #Establece la proporción entre el área Eden y las áreas Survivor en el joven generador en 4
#-XX:PermSize=512m                   #Establece el tamaño inicial de la región de memoria permanente en 512MB
#-XX:MaxPermSize=512m             #Establece el tamaño máximo de la región de memoria permanente en 512MB
#-XX:MaxTenuringThreshold=0     #Establece la edad máxima de los objetos antes de la recolección de basura
#-XX:+UseParallelGC                     #Selecciona el recolector de basura paralelo
#-XX:ParallelGCThreads=8             #Configura el número de hilos para el recolector paralelo
#-XX:+UseParallelOldGC                #Configura el método de recolección de basura para el antiguo generador como paralelo
#-XX:+UseAdaptiveSizePolicy     #El recolector paralelo seleccionará automáticamente el tamaño del joven generador y las proporciones de las áreas Survivor para alcanzar los tiempos de respuesta mínimos o frecuencias de recolección deseados. Se recomienda mantener esta opción habilitada cuando se usan recolectores paralelos.

Optimización de concurrencia en Tomcat

<Connector port="9027"
  protocol="HTTP/1.1"  
  maxHttpHeaderSize="8192"        #Longitud máxima de las cabeceras HTTP, las peticiones más largas serán ignoradas. Normalmente 8KB
  maxThreads="1000"                  #Número máximo de hilos que Tomcat puede crear. Valor predeterminado 200 
  minSpareThreads="100"            #Número de hilos creados al iniciar Tomcat. Valor predeterminado 4
  maxSpareThreads="1000"           
  minProcessors="100"                #Número mínimo de hilos inactivos en el conector
  maxProcessors="1000"
  enableLookups="false"             #Si se realiza la resolución inversa de dominios, valor predeterminado true. Para mejorar el rendimiento, debe establecerse en false
  URIEncoding="utf-8"                #Formato de codificación URL del contenedor Tomcat.
  acceptCount="1000"                 #Número de peticiones que pueden ponerse en la cola cuando todos los hilos están en uso. Las peticiones que excedan este número serán rechazadas. Valor predeterminado 10
  disableUploadTimeout="true"/>     #Si se utiliza el mecanismo de timeout durante las subidas 

Compresión

La compresión HTTP puede aumentar significativamente la velocidad de navegación en sitios web. Su principio de funcionamiento es que, después de que el cliente solicita una página web, el servidor la comprime y la descarga al cliente, donde el navegador se encarga de descomprimirla y mostrarla. En comparación con el proceso de navegación normal para HTML, CSS, Javascript, Texto, puede ahorrar aproximadamente un 40% del ancho de banda. Lo más importante es que también puede comprimir páginas generadas dinámicamente, incluyendo CGI, PHP, JSP, ASP, Servlet, SHTML, etc., con una eficiencia de compresión impresionante.

  1. compression="on" Habilita la compresión
  2. compressionMinSize="2048" Tamaño mínimo del contenido para habilitar la cmopresión, valor predeterminado 2KB
  3. noCompressionUserAgents="gozilla, traviata" Para estos navegadores, no se habilita la compresión
  4. compressableMimeType="text/html,text/xml" Tipos de contenido a comprimir

No olvides agregar la misma configuración al puerto 8443, ya que si utilizamos el protocolo HTTPS, se usará la configuración de este puerto

Ejemplo:

<!--Habilitar SSL en Tomcat-->

    <Connector port="8443" protocol="HTTP/1.1"

               URIEncoding="UTF-8"  minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000"

          acceptCount="300"  maxThreads="300" maxProcessors="1000" minProcessors="5"

          useURIValidationHack="false"

                    compression="on" compressionMinSize="2048"

                    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"

                SSLEnabled="true"

           scheme="https" secure="true"

           clientAuth="false" sslProtocol="TLS"

           keystoreFile="d:/tomcat2/conf/shnlap93.jks" keystorePass="aaaaaa"

      />

Ejemplo### Optimización del rendimiento de la base de datos

El rendimiento de Tomcat disminuye mientras espera la ejecución de consultas a la base de datos. La mayoría de las aplicaciones modernas utilizan bases de datos relacionales que pueden contener "consultas con nombre".<br></br>Si ese es el caso, Tomcat carga estas consultas con nombre durante el inicio, lo que puede mejorar el rendimiento. Otro punto importante es asegurar que todas las conexiones a la base de datos se cierren correctamente.<br></br>Es crucial establecer valores correctos para el pool de conexiones de la base de datos. Me refiero a los valores de las propiedades maxIdle (número máximo de conexiones inactivas), maxActive (número máximo de conexiones) y maxWait (tiempo máximo de espera para establecer una conexión) en el elemento Resource.<br></br>Como la configuración depende de los requisitos de la aplicación, no puedo especificar los valores correctos en este artículo. Puede encontrar los valores adecuados realizando pruebas de rendimiento en su base de datos.  

Biblioteca nativa de Tomcat

La biblioteca nativa de Tomcat se basa en el Apache Portable Runtime (APR), que proporciona una excelente extensibilidad y rendimiento a los programadores, ayudando a integrar tecnologías de servidor nativas para mostrar el mejor rendimiento posible en producción.

Desactivar el protocolo AJP

(1) Al desactivar el protocolo AJP, se puede reducir el tiempo de procesamiento de peticiones en entornos de clúster.

Figura 1

(2) Después de iniciar Tomcat, ya sea desde la interfaz de administración o desde la consola (como se muestra en la Figura 1), se puede ver que el protocolo AJP está habilitado.

Lo que necesitamos hacer es deshabilitar este protocolo. El método para deshabilitarlo es comentar la siguiente línea en server.xml:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Después de reiniciar Tomcat, la consola ya no mostrará lo que se indicaba en el recuadro negro de la imagen anterior.

Cambiar el modo de comunicación BIO a NIO

(1) Tomcat soporta protocolos http1.0 y 1.1, y por defecto utiliza el modo de comunicación BIO. Las versiones Tomcat7 y Tomcat8 utilizan el modo BIO por defecto principalmente por compatibilidad con proyectos existentes.
(2) En la consola (como se muestra en la Figura 1) o en la interfaz de administración, se puede ver que el modo de comunicación iniciado por Tomcat es bio.
(3) Caso de uso: en un clúster de Tomcat, si el proyecto es reciente y utiliza bibliotecas de Java 1.5 o posteriores (es decir, la versión de JDK es superior a 1.5), se puede configurar cada instancia de Tomcat en el clúster para que utilice el modo de respuesta de alta concurrencia y alto rendimiento (NIO).
(4) Método de configuración: en server.xml, cambiar <Connector connectionTimeout="20000" port="8066" protocol="HTTP/1.1" redirectPort="8448"/> a:<br></br>

<Connector connectionTimeout="20000" port="8066" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8448"/>

Donde el protocolo original "HTTP/1.1" indica que sigue el protocolo http1.1 y también es el protocolo de comunicación original sin optimizar,
el protocolo modificado "org.apache.coyote.http11.Http11NioProtocol" indica que se inicia en modo NIO.

Optimización del conector

1) Establecer el valor de la propiedad tcpNoDelay en "true";
2) Ajustar el número máximo de peticiones permitidas con la función keep-alive mediante la propiedad maxKeepAliveRequest; un valor de 1 indica que está deshabilitado;
3) Ajustar el valor de la propiedad socketBuffer para cambiar el tamaño del buffer del socket;
4) Establecer enableLookups en false para deshabilitar la resolución inversa de DNS;
5) Tomcat es un contenedor Servlet multihilo; el uso de pools de hilos puede tener un gran impacto en el rendimiento del servidor; esto se define principalmente mediante maxThreads, maxSpareThreads y minSpareThreads;

Ejemplo:

<Connector port="8066" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol"
            connectionTimeout="20000"
            enableLookups="false"
            maxPostSize="10485760"
            URIEncoding="UTF-8" 
            acceptCount="100"
            acceptorThreadCount="2"
            disableUploadTimeout="true" 
            maxConnections="10000"
            SSLEnabled="false"
    />

Especificar el uso de un pool de hilos para procesar peticiones HTTP

Comentar la configuración original

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

Agregar la siguiente configuración, si ya existe en el archivo de configuración original,取消注释 y modificar.

<!--Ejecutor compartido, permite definir uno o más pools de hilos-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="600" minSpareThreads="100" maxIdleTime="60000"/>
 <!--Máximo 600 hilos (generalmente suficiente para la mayoría de servidores), mínimo 100 hilos inactivos, tiempo máximo de inactividad de 60 segundos.-->
<!--Conector que usa el pool de hilos-->
<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="60000"
               keepAliveTimeout="15000"
               redirectPort="8443" 
               maxHttpHeaderSize="8192" 
               URIEncoding="UTF-8" 
               enableLookups="false" 
               acceptCount="500"
               disableUploadTimeout="true"/>

Descripción de parámetros:

connectionTimeout - Timeout de conexión de red, en milisegundos. Establecer en 0 significa que nunca expira, lo que tiene riesgos. Normalmente se puede establecer en 30000 milisegundos
keepAliveTimeout - Tiempo máximo de mantenimiento de la conexión persistente (milisegundos). Aquí 15 segundos
maxKeepAliveRequests - Número máximo de conexiones persistentes (1 indica deshabilitado, -1 indica sin límite, valor predeterminado 100. Generalmente se establece entre 100 y 200)
maxHttpHeaderSize - Longitud máxima de las cabeceras HTTP, las peticiones más largas serán ignoradas, normalmente 8KB.
URIEncoding - Formato de codificación URL del contenedor Tomcat.
acceptCount - Número de peticiones que pueden ponerse en la cola cuando todos los hilos están en uso. Las peticiones que excedan este número serán rechazadas, valor predeterminado 10.
disableUploadTimeout - Si se utiliza el mecanismo de timeout durante las subidas.
enableLookups - Si se realiza la resolución inversa de dominios, valores posibles: true o false. Para mejorar el rendimiento, debe establecerse en false.
bufferSize - Define el tamaño del buffer de entrada del conector, valor predeterminado 2048 bytes.
maxSpareThreads - Número máximo de conexiones inactivas, una vez que los hilos creados exceden este valor, Tomcat cerrará los hilos de socket que ya no son necesarios.
maxThreads - Número máximo de conexiones procesadas simultáneamente, Tomcat usa hilos para procesar cada petición recibida. Este valor indica el número máximo de hilos que Tomcat puede crear.
minSpareThreads - Número mínimo de hilos inactivos, número de hilos creados al iniciar Tomcat.

Nota: El número máximo de conexiones permitidas también está limitado por los parámetros del kernel del sistema operativo. Normalmente, Windows permite alrededor de 2000 conexiones, mientras que Linux permite alrededor de 1024.

Etiquetas: optimización de Tomcat configuración de servidor Java parámetros JVM concurrencia en Tomcat compresión HTTP

Publicado el 6-18 16:32