Resolver los problemas de «Error de demasiados archivos abiertos» y «memoria externa nativa debido a errores en la creación de subprocesos» en WebSphere Application Server que se ejecuta en Linux

Body

image

Recibimos bastantes registros de problemas (PMRs) / solicitudes de servicio (SRs) para problemas de memoria externa nativos en el servidor de aplicaciones WebSphere y uno de los problemas de OOM nativo más famosos ocurre particularmente en el sistema operativo Linux debido a un valor ulimit-u(NPROC) insuficiente.
También recibimos un buen número de PMR para errores de «Demasiados archivos Abiertos» para el Servidor de aplicaciones WebSphere que se ejecuta en Linux.
Con la solución de problemas sencilla y el ajuste de comandos ulimit, puede evitar fácilmente abrir un PMR con el soporte de IBM para estos problemas.

1) ¿Qué es ulimit en Linux?
El comando ulimit le permite controlar los límites de recursos de usuario en el sistema, como el tamaño de los datos del proceso, la memoria virtual del proceso y el tamaño del archivo del proceso, el número de procesos, etc.

2) ¿Qué sucede cuando la configuración de este comando no está configurada correctamente?
Ocurren varios problemas como memoria externa nativa, Errores de demasiados archivos abiertos, archivos de volcado no se generan completamente, etc.

3) ¿Cómo puede comprobar la configuración actual de ulimit?
Hay varias formas de comprobar la configuración actual:

a) Desde el símbolo del sistema, issue
ul ulimit-a
Podemos ver la salida similar como a continuación.
tamaño del archivo principal (bloques, -c) 0
tamaño del seg de datos (kbytes, -d) ilimitado
prioridad de programación (-e) 0
tamaño del archivo (bloques, -f) ilimitado
señales pendientes (-i) 32767
memoria máxima bloqueada (kbytes, -l) 32
tamaño máximo de memoria (kbytes, -m) ilimitado
– n) 1024
tamaño de tubería (512 bytes, -p) 8
colas de mensajes POSIX (bytes, -q) 819200
prioridad en tiempo real (- r) 0
tamaño de pila (kbytes,- s) 10240
tiempo de cpu (segundos,- t) ilimitado
procesos de usuario máximos (- u) 50
memoria virtual (kbytes,- v) ilimitado
bloqueos de archivos (- x) ilimitado
Se mostrará se mostrarán todas las configuraciones actuales establecidas para la sesión de inicio de sesión actual y los límites flexibles predeterminados. Los límites pueden ser Suaves y Duros.
Los límites duros son el límite máximo que se puede configurar. Solo el usuario root puede aumentar los límites duros, aunque otros usuarios pueden disminuirlos. Los límites suaves pueden ser establecidos y cambiados por otros usuarios, pero no pueden exceder los límites duros.
Si desea encontrar valores límite específicos, problema
ulimit-Sa
para el valor límite blando actual.
ulimit-Ha
para el valor límite duro actual.

b) Si conoce el ID de proceso (PID) del Servidor de aplicaciones WebSphere que se va a investigar, también puede inspeccionar el siguiente archivo.
Ubicación: / proc / < PID>
Archivo: límites
El contenido de este archivo es similar a la salida del comando «ulimit-a».
Este archivo tendrá una lista de parámetros ulimit y sus valores asociados para el PID especificado.
c) Si conoce el ID de proceso del servidor que desea verificar la configuración actual de ulimit, puede tomar un Javacore emitiendo
kill -3 <PID>
Puede abrir este Javacore en cualquier editor de texto (como NotePad++, Ultra Edit, etc.).)
y busque ulimit y le llevará a la sección ulimit.
Ejemplo de configuración de ulimit como se ve desde un Javacore.
los Límites de Usuario (en bytes excepto para NOFILE y NPROC)
————————————————————–
tipo de soft limit límite duro
RLIMIT_AS 11788779520 ilimitado
RLIMIT_CORE 1024 ilimitado
RLIMIT_CPU ilimitado ilimitado
RLIMIT_DATA ilimitado ilimitado
RLIMIT_FSIZE ilimitado ilimitado
RLIMIT_LOCKS ilimitado ilimitado
RLIMIT_MEMLOCK ilimitado ilimitado
RLIMIT_NOFILE 18192 18192
RLIMIT_NPROC 79563 79563
RLIMIT_RSS 8874856448 ilimitado
RLIMIT_STACK 33554432 ilimitado
Si desea encontrar la configuración global, inspeccione el siguiente archivo en linux.
/ etc / seguridad / límites.conf.
Cualquier cambio en estos archivos de límites de configuración global debe ser realizado por el administrador del sistema.
Para obtener más detalles sobre cada configuración en el comando ulimit y también para encontrar información sobre el comando ulimit en varios sistemas operativos, consulte esta nota técnica: Pautas para configurar ulimits (Servidor de aplicaciones WebSphere)

4) ¿Qué tipo de OOM nativo se espera debido a una configuración de ulimit insuficiente?
Va a ocurrir un evento de volcado de memoria sin memoria con un «Fallo al crear un hilo».
Ejemplo: El siguiente mensaje aparecerá en Javacore.
«systhrow» (00040000) Detalle «java/lang/OutOfMemoryError»
«Error al crear un hilo: retVal -1073741830, errno 12» recibido
errno 12 es un OOM nativo real en un hilo de inicio.
A veces, el error al crear un subproceso también se ve en los registros del servidor, como SystemOut.log, SystemErr.registro, etc., y también en los registros FFDC y este error indica que un OutOfMemory nativo ocurrió durante la creación de un nuevo hilo.

5) ¿Cuál es la razón de este error?
La razón es que el valor actual de ulimit-u (NPROC)es demasiado bajo.
El límite nproc generalmente solo cuenta los procesos en un servidor para determinar este número. Los sistemas Linux que ejecutan WebSphere Application Server son un caso particular. El límite de nproc en Linux cuenta el número de subprocesos dentro de todos los procesos que pueden existir para un usuario dado. Para la mayoría de los casos de versiones anteriores de Linux, este valor será predeterminado alrededor de 2048. Para Red Hat Enterprise Linux (RHEL) 6 listo para usar, el valor predeterminado de nproc será 1024.
Esta configuración predeterminada baja para sistemas más grandes no permitirá suficientes subprocesos en todos los procesos.

6) ¿Cómo solucionar este problema?
WebSphere Application Server Support recomienda configurar ulimit-u o nproc en un valor de 131072 cuando se ejecuta en Linux para tener en cuenta de forma segura todos los subprocesos bifurcados dentro de los procesos que se podrían crear.
Se puede aumentar temporalmente para la sesión actual configurando
ulimit-u 131072
que establece el valor de límite suave.
Para establecer límites blandos y duros, emita
ulimit-Su 131072 para límite blando.
ulimit-Hu 131072 para límite rígido.
para configurarlo globalmente, el administrador del sistema Linux tiene que editar
/etc/security / limits.conf
Tenemos esta nota técnica que explica esto: El valor ulimit-u (NPROC) insuficiente Contribuye a OutOfMemory nativo

7) ¿Qué pasa con el error «Demasiados archivos abiertos»?
Este error indica que se han utilizado todos los manejadores de archivos disponibles para el proceso (esto también incluye sockets).
Ejemplo: Se verán errores similares a los siguientes Registros del servidor.
java. io.IOException: Demasiados archivos abiertos
prefs W no se pudieron bloquear las prefs del usuario. Código de error de UNIX 24.

8) ¿Por qué ocurre este error?
Puede suceder si el límite actual de Archivos abiertos es demasiado bajo o si esto es el resultado de que los controladores de archivos se filtran por alguna parte de la aplicación.

9) ¿Cómo solucionar esto?
El soporte de IBM recomienda el número de archivos abiertos que configuran el valor ulimit-n para WebSphere Application Server que se ejecuta en Linux como 65536 para límites suaves y duros.
ulimit-Sn 65536
ulimit-Hn 65536

10) ¿Qué pasa si hay una fuga de descriptores de archivo en la aplicación?
En Linux, podemos encontrar si algún archivo abierto en particular está creciendo durante un período de tiempo tomando los datos a continuación con el comando lsof contra el ID de proceso problemático de JVM de forma periódica.
lsof-p-r > lsof.out
La salida le proporcionará todos los archivos abiertos para el PID especificado. Podrá determinar qué archivos se abren y qué archivos están creciendo con el tiempo.
Alternativamente, puede listar el contenido de los descriptores de archivo como una lista de enlaces simbólicos en el siguiente directorio, donde reemplaza PID con
el ID del proceso. Esto es especialmente útil si no tiene acceso al comando lsof:
ls-al/proc/PID / fd
Nota técnica relacionada: Demasiados archivos abiertos mensaje de error

11) ¿Hay algo más que afinar?
Tenemos una configuración más que podemos ajustar en Linux usando pid_max, que es rara y solo ocurre en entornos grandes. Si no está utilizando un entorno grande, puede omitir este paso.
La configuración pid_max es para límite interno para el número máximo de identificadores de proceso únicos que admite su sistema.
El valor predeterminado es 32.768 y esto es suficiente para la mayoría de los clientes.
En entornos grandes con un gran número de procesos, existe la posibilidad de que se alcance este límite y
native OutOfMemory ocurrirá con un mensaje similar en
Javacore con error al crear el hilo errno 11.
Ejemplo:
Evento de volcado «systhrow» (00040000) Detalle «java/lang/OutOfMemoryError»
«Error al crear un hilo: retVal -106040066, errno 11» recibido
Para encontrar el valor pid_max actual en Linux.
cat/proc/sys/kernel / pid_max
Para aumentarlo,emita
kernel sysctl-w.pid_max = < Valor>
A veces, se puede alcanzar el valor predeterminado de 32,768 debido a algunas fugas de hilo, causando OOM nativo. En este caso, debe corregir esta fuga de grupo de subprocesos para resolver el OOM nativo.
Notas técnicas relacionadas:
Solución de problemas de memoria nativa
Uso potencial de memoria nativa en grupos de subprocesos de WebSphere Application Server
Resumen:
Asegúrese de tener la siguiente configuración de ulimit en Linux para evitar problemas de «demasiados archivos abiertos» y «falta de memoria nativa» debido a errores al crear un subproceso.
Límites de usuario (en bytes excepto NOFILE y NPROC)
soft_limit hard_limit
RLIMIT_NOFILE 65536 65536
RLIMIT_NPROC 131072 131072

12) ¿Hay algo más que comprobar?
IBM support recomienda los siguientes valores para todas las configuraciones de ulimit para WebSphere Application Server ejecutándose en Linux, que incluye las configuraciones que hemos discutido hasta ahora.
Límites de usuario (en bytes excepto NOFILE y NPROC)
tipo límite suave límite duro
RLIMIT_AS ilimitado ilimitado
RLIMIT_CORE ilimitado ilimitado
RLIMIT_CPU ilimitado ilimitado
RLIMIT_DATA ilimitado ilimitado
RLIMIT_FSIZE ilimitado ilimitado
RLIMIT_LOCKS ilimitado ilimitado
RLIMIT_MEMLOCK 65536 65536
RLIMIT_NOFILE 65536 65536
RLIMIT_NPROC 131072 131072

13) ¿Qué sigue?
Asegúrese de tener la configuración descrita anteriormente en todas las JVM de WebSphere Application Server como DMGr, NodeAgent y AppServers y reinicie las JVM si la configuración se realizó globalmente o cierre la sesión y vuelva a iniciar sesión con el mismo usuario si los cambios se realizaron en la sesión actual (shell).

Deja una respuesta

Tu dirección de correo electrónico no será publicada.