LDAP-Anforderungen hängen für 15 Sekunden

Habe ich JBoss application server unter Verwendung von LDAP für die Authentifizierung. In letzter Zeit haben wir bemerkt, dass es eine Menge von langsamen Anfragen (> 15 Sekunden).

Habe ich einige threaddumps der server-und aufgefallen, dass viele threads in denen das warten auf eine Sperre: com.sun.jndi.ldap.LdapRequest@54ceac

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)

Alle Anfragen die ich gesehen habe, darauf gewartet haben, in diesem Zustand haben mehr als 15 Sekunden. Wir sind monitoring der LDAP-server und alle Anfragen aus dem monitoring-tool-finish in weniger als 200 ms. Das macht mich denke, das ist ein problem mit der com.Sonne.jndi.ldap-code. Die Dekompilierung der com.Sonne.jndi.ldap.Verbindung der Klasse (jdk1.5.0_12) sehe ich dies:

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 */
    }
    }
    ...

Es ist offenbar ein hardcoded timeout von 15000 Millisekunden.

Tun, jemand irgendwelche Ideen für einen fix/workaround?

  • Warum würde berdecoder null sein? Ein Zusammenhang gedacht: die Standard-timeout auf viele name resolver clients beim DNS-server nicht verfügbar ist 15s.
  • Netzwerk-Probleme ? Sie werden überrascht sein, wie oft ein Schalter werden Pakete auch auf einem einfachen LAN
InformationsquelleAutor awi | 2009-07-16
Schreibe einen Kommentar