Warum dauert der erste Anruf bei Java.io.file.CreateTempile (String, String, Datei) 5 Sekunden auf Citrix?

StackOverflow https://stackoverflow.com/questions/2608763

Frage

Während ich das langsame Start einer Eclipse -RCP -App auf einem Citrix -Server debuggierte, wurde ich festgestellt, dass Java.io.CreateTempile (String, String, Datei) 5 Sekunden dauert. Dies geschieht nur bei der ersten Ausführung und nur für bestimmte Benutzerkonten. Insbesondere bemerke ich, dass es anonyme Benutzerkonten von Citrix. Ich habe nicht viele andere Arten von Konten ausprobiert, aber dieses Verhalten wird nicht mit einem Administratorkonto ausgestellt.

Es spielt auch keine Rolle, ob der Benutzer Zugriff auf das angegebene Verzeichnis hat oder nicht. Wenn der Benutzer keinen Zugriff hat, dauert der Anruf 5 Sekunden. Wenn sie Zugriff haben, dauert der Anruf mit 5 Sekunden, um erfolgreich zu sein.

Dies ist auf einem Windows 2003 -Server. Ich habe Suns 1.6.0_16 und 1.6.0_19 Jres ausprobiert und sehe das gleiche Verhalten.

Ich habe ein bisschen gegoogelt und erwartet, dass dies ein bekanntes Problem ist, aber nichts fand. Es scheint, als hätte jemand anderes schon einmal darauf getroffen.

Die Eclipse -Plattform verwendet Datei.CreateTempile (), um verschiedene Verzeichnisse zu testen, um festzustellen, ob sie während der Initialisierung geschrieben werden können. Dieses Problem fügt der Startzeit unserer Anwendung 5 Sekunden hinzu.

Ich kann mir vorstellen, dass schon jemand darauf getroffen ist und möglicherweise einen Einblick hat. Hier ist der Beispielcode, den ich ausgeführt habe, um zu sehen, dass dieser Anruf tatsächlich die Zeit verbraucht. Ich habe es auch mit einem zweiten Anruf bei CreateTempile ausprobiert und bemerkt, dass nachfolgende Anrufe fast sofort zurückkehren.

public static void main(final String[] args) throws IOException {
        final File directory = new File(args[0]);
        final long startTime = System.currentTimeMillis();
        File file = null;
        try {
            file = File.createTempFile("prefix", "suffix", directory);
            System.out.println(file.getAbsolutePath());
        } finally {
            System.out.println(System.currentTimeMillis() - startTime);
            if (file != null) {
                file.delete();
            }
        }
    }

Die Beispielausgabe dieses Programms ist Folgendes:

C:\>java.exe -jar filetest.jar C:/Temp
C:\Temp\prefix8098550723198856667suffix
5093
War es hilfreich?

Lösung

Es könnte die Intialisierung des sicheren Zufallszahlengenerators sein, der das Problem verursacht. Insbesondere wenn ein sicherer zufälliger Saatgut nicht vom Betriebssystem erhältlich ist, versucht der Rückfallmechanismus, Entropie zu gewinnen. IIRC, eines der Dinge, die es tut, ist die Auflistung temporärer Dateien. Wenn Sie also eine große Anzahl von denen haben, die nicht zur Startleistung helfen.

Andere Tipps

Es sieht so aus, als wäre die Langsamkeit auf die Aussaat von Securerandom und nur dann, wenn der Benutzer Mitglied der Gästegruppe ist.

Die Securerandom -Seed -Initialisierung verwendet eine Windows Crypto -API, die fehlschlägt, wenn der Benutzer ein Gast ist, wie hier beschrieben [1]. Durch Einstellen der Systemeigenschaft "java.security.debug" gleich "All" kann ich das Folgende sehen, wenn das Programm als Gast ausgeführt wird:

ProviderConfig: Loaded provider SUN version 1.6
provider: Failed to use operating system seed generator: java.io.IOException: Required native CryptoAPI features not available on this machine
provider: Using default threaded seed generator

Wenn Sie als Nicht-Guest-Benutzer ausgeführt werden, ist die Ausgabe Folgendes:

ProviderConfig: Loaded provider SUN version 1.6
provider: Using operating system seed generator

Es scheint, dass der Standard -Saatgutgenerator von Threads ziemlich langsam ist. Hier [2] ist ein sehr alter Bug, der darüber die Sonne angemeldet ist.

[1] http://www.derkeiler.com/newsgroups/microsoft.public.platformsdk.security/2003-12/0349.html

[2] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4210047

Ich bin kein Citrix -Experte, aber ich kenne jemanden, der ist und der vermutet:

Die Konten können so eingerichtet werden, dass die Anwendungsliese/Schreibvorgänge in nicht lokale Ressourcen umgeleitet werden. Die Latenz, die Sie erleben, kann mit der Initialisierung oder Leistung dieser Auflösung zusammenhängen.

Eine andere Möglichkeit besteht darin, dass die Anwendungsisolation in Kraft sein kann, was bedeutet, dass die Datei -Lese-/Schreibvorgänge auf virtualisierten Ressourcenversionen auftreten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top