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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Klingt ähnlich dieser Fehler, haben Sie versucht, die überprüfung des Netzwerkverkehr mit packet sniffer, um zu prüfen, ob diese Bedingung?
Du bist mit einem alten jdk1.5 (jdk1.5.0_12).
Ich habe das gleiche Problem mit jdk1.5_16 der Verwendung von tomcat-5.5. Wir haben einen thread, der darauf wartet, dass eine ldap Antwort und es blockiert alle anderen Threads, weil ich nicht weiß über JBoss-aber in tomcat mindestens alle ldap-Authentifizierung werden nacheinander ausgeführt.
Wenn man sich in der dekompilierte code eingefügt, nach der Wartezeit von 15 Sekunden haben Sie eine Pause label0 das ist tatsächlich eine Schleife. Es wird also Durchlaufen, bis der ldap-Antwort (kein timeout!).
Ich bin mir nicht sicher, in welcher version es gefixt wurde, aber in 1.5.0_22 der code ist jetzt:
So, jetzt, wenn Sie ein timeout-Wert, wird warten, dass die Zeit, und beenden Sie die Schleife. Ein dies sollte entsperren die Authentifizierung der Warteschlange.
sieht für mich so, als wenn es nur wartet, wenn die Antwort null ist - Frage mich, ob es irgendeine Art von version mismatch, wodurch Sie Ihre app nicht in der Lage, analysieren Sie die Antwort von Ihrem server.
Haben Sie versucht, das anbringen Quelle, und zu sehen, können Sie einen Haltepunkt festlegen in eclipse.
-ass
Habe ich etwas gesehen, wie dies vor, wenn die Verwendung von LDAP für die Verbindung zu einem Active-Directory-Feld (in einem Netzwerk, wo es mehr als einen server). Am Ende war es ein DNS-Problem, und wir brauchten einfach nur Spülen, um unsere DNS-cache ("ipconfig /flushdns" auf einem windows-Rechner). Dies kann oder kann nicht Ihr Problem, dachte nur, es wäre einen Versuch Wert.