J'ai un serveur d'applications JBoss qui utilise LDAP pour l'authentification. Dernièrement, nous avons remarqué qu'il y a beaucoup de demandes lentes (> 15 secondes).Les requêtes LDAP suspendues pendant 15 secondes
J'ai fait quelques threaddumps du serveur et a remarqué que de nombreux threads où attente sur un verrou: [email protected]
java.lang.Object.wait(Native Method)
com.sun.jndi.ldap.Connection.readReply(Connection.java:418)
com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:340)
com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:192)
com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2637)
com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:283)
com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:134)
com.sun.jndi.url.ldap.ldapURLContextFactory.getObjectInstance(ldapURLContextFactory.java:35)
javax.naming.spi.NamingManager.getURLObject(NamingManager.java:584)
Toutes les demandes que j'ai vu qui ont été attendre dans cet état ont utilisé plus de 15 secondes pour terminer. Nous surveillons le serveur LDAP et toutes les requêtes de l'outil de surveillance se terminent en moins de 200 ms. Cela me fait penser que c'est un problème avec le code com.sun.jndi.ldap. Décompiler la classe com.sun.jndi.ldap.Connection (de jdk1.5.0_12) Je vois ceci:
BerDecoder readReply(LdapRequest ldaprequest) throws IOException, NamingException
{
_L2:
BerDecoder berdecoder;
if((berdecoder = ldaprequest.getReplyBer()) != null)
break; /* Loop/switch isn't completed */
try
{
label0:
{
synchronized(this)
{
if(sock == null)
throw new ServiceUnavailableException((new StringBuilder()).append(host).append(":").append(port).append("; socket closed").toString());
}
synchronized(ldaprequest)
{
berdecoder = ldaprequest.getReplyBer();
if(berdecoder == null)
{
ldaprequest.wait(15000L);
break label0;
}
}
break; /* Loop/switch isn't completed */
}
}
...
Il y a apparemment un délai d'attente de 15000 millisecondes hardcoded.
Quelqu'un a-t-il des idées pour un correctif/une solution de contournement?
Pourquoi berdecoder serait-il nul? Une pensée associée: le délai d'attente par défaut sur de nombreux clients de résolution de noms lorsqu'un serveur DNS est indisponible est de 15 secondes. – mas
Problème de réseau? Vous seriez surpris de voir à quelle fréquence un commutateur laisse tomber des paquets même sur un simple LAN – nos