なぜjava.io.file.file.createTempfile(文字列、文字列、ファイル)に最初に呼び出して、Citrixで5秒かかるのですか?

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

質問

CitrixサーバーでEclipse RCPアプリのスロースタートアップをデバッグしながら、java.io.createTempfile(文字列、文字列、ファイル)が5秒かかっていることを知りました。これは、最初の実行でのみこれを行い、特定のユーザーアカウントでのみ行います。具体的には、Citrix Anonymousユーザーアカウントに気づいています。私は他の多くの種類のアカウントを試したことはありませんが、この動作は管理者アカウントでは示されていません。

また、ユーザーが指定されたディレクトリに書き込みにアクセスできるかどうかは関係ありません。ユーザーがアクセスしていない場合、失敗するには5秒かかります。彼らがアクセスできる場合、成功するのに5秒かかる電話がかかります。

これはWindows 2003サーバー上にあります。 Sunの1.6.0_16と1.6.0_19 JRESを試してみて、同じ動作を確認しました。

私はこれが何らかの既知の問題であると少し期待していましたが、何も見つかりませんでした。他の誰かが以前にこれに遭遇しなければならなかったようです。

Eclipseプラットフォームは、file.createTempfile()を使用してさまざまなディレクトリをテストして、初期化中に書き込みできるかどうかを確認します。この問題は、アプリケーションの起動時刻に5秒を追加します。

誰かが以前にこれに出くわし、洞察を持っているかもしれないと思います。これが私が実行したサンプルコードです。実際、この呼び出しが時間を消費していることを確認しました。また、CreateTempfileに2回目の電話で試してみましたが、その後の呼び出しがほぼ瞬時に戻ることに気付きました。

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
役に立ちましたか?

解決

問題を引き起こしているのは、安全な乱数ジェネレーターの整数である可能性があります。特に、安全なランダムシードがオペレーティングシステムから取得できない場合、フォールバックメカニズムはエントロピーを獲得しようとします。 IIRCは、一時的なファイルをリストすることです。そのため、スタートアップのパフォーマンスに役立たない多数のファイルがある場合です。

他のヒント

遅さは、ユーザーがゲストグループのメンバーである場合にのみ、Securerandomのシードによるもののようです。

Securerandom Seedの初期化は、ここで説明されているようにユーザーがゲストであるときに失敗するWindows Crypto APIを使用します[1]。システムプロパティ「Java.security.debug」を「すべて」に等しいように設定することにより、プログラムがゲストとして実行されているときに次のことを見ることができます。

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]は、これについて太陽に記録された非常に古いバグです。

[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

私はCitrixの専門家ではありませんが、私は誰かを知っています、そして推測する:

アカウントは、アプリケーションの読み取り/書き込みが非ローカルリソースにリダイレクトされるように設定される場合があります。あなたが経験しているレイテンシーは、その解像度の初期化またはパフォーマンスに関連している可能性があります。

別の可能性は、アプリケーションの分離が有効である可能性があることです。つまり、ファイルの読み取り/書き込みは、仮想化バージョンのリソースで発生します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top