Razones para un alto uso de la CPU en SocketInputStream.socketRead0 ()

Al perfilar una aplicación web propia me encontré con una observación muy extraña (al menos para mí).

Casi todo el tiempo se gasta ensocketRead0() método de unSocketInputStream clase. No es sorprendente porque mi aplicación hace una red con un servicio remoto en cada solicitud. Lo extraño es que no soloreloj de pared tiempo El uso es alto para este método,Tiempo de CPU tambien muy alto. No entiendo por qué el tiempo de CPU es alto, porque si mi aplicación espera a que responda el servicio remoto (lo cual no es tan rápido), no hay nada que hacer para la aplicación en sí. Así que el tiempo de CPU debería ser aparentemente bajo.

Algunas observaciones más:

VisualVM en modo de muestreo muestra ese método.SocketInputStream.socketRead0() está comiendo hasta el 95% del tiempo (tanto en el reloj de paredy Tiempo de CPU);mpstat (usamos Linux como sistema operativo) muestra alrededor de 90% de tiempo de usuario y ~ 1-3% de tiempo del sistema (el resto es tiempo de inactividad);aplicación desplegada en el servidor dedicado;El servicio remoto es también la aplicación web HTTP. El tiempo promedio de respuesta es de unos 100 ms. El tamaño promedio de respuesta es de aproximadamente 2Kb.mi aplicación uso primaveraRestTemplate para interactuar con el servicio remoto, no elSocketInputStream directamente.

Por ahora solo tengo una idea: tal vez esto sea una sobrecarga de llamar a métodos nativos en JVM (SocketInputStream.socketRead0() es nativo)?

¿Qué piensas? ¿Hay alguna otra razón para esto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta