Почему первый вызов java.io.File.createTempFile (String, String, File) занимает в Citrix 5 секунд? - PullRequest
2 голосов
/ 09 апреля 2010

При отладке медленного запуска приложения Eclipse RCP на сервере Citrix я обнаружил, что java.io.createTempFile (String, String, File) занимает 5 секунд. Это делается только при первом выполнении и только для определенных учетных записей пользователей. В частности, я замечаю это в учетных записях анонимных пользователей Citrix. Я не пробовал много других типов учетных записей, но это поведение не проявляется с учетной записью администратора.

Кроме того, не имеет значения, имеет ли пользователь доступ для записи в данный каталог или нет. Если у пользователя нет доступа, вызов будет прерываться на 5 секунд. Если у них есть доступ, для успешного вызова требуется 5 секунд.

Это на сервере Windows 2003. Я пробовал JRE Sun 1.6.0_16 и 1.6.0_19 и вижу то же самое поведение.

Я немного погуглил, ожидая, что это какая-то известная проблема, но ничего не нашел. Кажется, кто-то еще должен был столкнуться с этим раньше.

Платформа Eclipse использует File.createTempFile () для тестирования различных каталогов, чтобы определить, доступны ли они для записи во время инициализации, и эта проблема добавляет 5 секунд ко времени запуска нашего приложения.

Я предполагаю, что кто-то сталкивался с этим раньше и может иметь некоторое понимание. Вот пример кода, который я выполнил, чтобы увидеть, что именно этот вызов потребляет время. Я также попробовал сделать это с помощью второго вызова createTempFile и заметил, что последующие вызовы возвращаются практически мгновенно.

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();
            }
        }
    }

Пример вывода этой программы следующий:

C:\>java.exe -jar filetest.jar C:/Temp
C:\Temp\prefix8098550723198856667suffix
5093

Ответы [ 3 ]

3 голосов
/ 09 апреля 2010

Это может быть инициализация безопасного генератора случайных чисел, который вызывает проблему. В частности, если безопасное случайное начальное число не доступно из операционной системы, то резервный механизм пытается получить энтропию. IIRC, одна из вещей, которую он делает, - перечисляет временные файлы, поэтому, если у вас есть большое количество файлов, которые не помогут при запуске.

1 голос
/ 21 апреля 2010

Похоже, что медлительность связана с заполнением SecureRandom и только тогда, когда пользователь является членом группы «Гости».

Начальная инициализация SecureRandom использует Windows Crypto API, который завершается ошибкой, когда пользователь является гостем, как описано здесь [1]. Установив системное свойство "java.security.debug" равным "all", я могу видеть следующее, когда программа запускается в качестве гостя:

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

При запуске в качестве не гостевого пользователя вывод будет таким:

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

Похоже, что по умолчанию многопоточный генератор семян работает медленно. Вот [2] очень старая ошибка, записанная в Sun по этому поводу.

[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

0 голосов
/ 10 апреля 2010

Я не эксперт Citrix, но я знаю кого-то, кто и кто высказывает предположения:

Учетные записи могут быть настроены так, чтобы чтение / запись приложения перенаправлялось на нелокальные ресурсы.Задержка, с которой вы сталкиваетесь, может быть связана с инициализацией или производительностью этого разрешения.

Другая возможность заключается в том, что может действовать изоляция приложения, что означает чтение / запись файлов в виртуализированных версиях ресурсов.

...