Tenemos un servidor Java que se ejecuta en Linux en un puerto específico que acepta conexiones persistentes para miles y miles de usuarios. Recientemente, nuestros clientes no pueden conectarse con un error de tiempo de espera. Sospechamos que el tráfico es demasiado alto, pero nuestro registro de Java realmente muestra que no hay muchos conectados por segundo.
Sospechamos que podría ser que muchos lo intentan al mismo tiempo y básicamente se caen al nivel del sistema operativo y, por lo tanto, el programa java nunca tiene la oportunidad de aceptar la conexión. ¿Hay algún tipo de inicio de sesión en Linux que pueda mostrar a alguien tratando de golpear un zócalo?
iptables -I INPUT -p tcp --dport some_port -m state --state NEW
. Tenga en cuenta que, a menos que esté interesado en los detalles de cada intento de conexión, la omisión-j LOG
evita enviar spam al archivo de registro del sistema con muchos datos innecesarios.Cuando tengo problemas de red realmente desagradables, tiendo a encender Wirehark . Para mí, no hay mejor herramienta de diagnóstico de red cuando tengo que llegar a los detalles esenciales. Y no se preocupe si no puede instalarlo en el cuadro de origen o de destino; puede ejecutar
tcpdump -w
para escribir paquetes de datos en un archivo en el inicio y / o punto final, y alimentar el archivo a wireshark en otro cuadro a su conveniencia.fuente
tcpdump -nS dst port <some port>
Sería bueno ver con precisión lo que sus hilos Java obtienen a nivel de socket. Al mismo tiempo, desearía correlacionar eso con la información de red del sistema operativo. Echa un vistazo a AppFirst. Pueden hacer este tipo de cosas.
fuente
muestra las conexiones establecidas actualmente.
Compare esto con su
ulimit
configuración activa y, por supuesto, con la cantidad máxima de conexiones que su aplicación Java puede manejar.fuente