簡體   English   中英

為什么在Citrix上第一次調用java.io.File.createTempFile(String,String,File)需要5秒鍾?

[英]Why does first call to java.io.File.createTempFile(String,String,File) take 5 seconds on Citrix?

在Citrix服務器上調試Eclipse RCP應用程序的緩慢啟動時,我發現java.io.createTempFile(String,String,File)需要5秒鍾。 它僅在第一次執行時才執行此操作,並且僅對某些用戶帳戶執行此操作。 具體來說,我注意到它是Citrix匿名用戶帳戶。 我沒有嘗試過許多其他類型的帳戶,但是管理員帳戶沒有出現這種現象。

同樣,用戶是否有權寫入給定目錄也沒有關系。 如果用戶沒有訪問權限,則呼叫將花費5秒鍾才能失敗。 如果他們確實可以訪問,則呼叫需要5秒鍾才能成功。

這是在Windows 2003 Server上。 我嘗試了Sun的1.6.0_16和1.6.0_19 JRE,並看到了相同的行為。

我在Google上搜索了一下,期望這是某種已知問題,但沒有發現任何東西。 似乎以前其他人可能不得不遇到過這種情況。

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

可能是安全隨機數生成器的初始化導致了問題。 特別是,如果無法從操作系統獲得安全的隨機種子,則回退機制將嘗試獲取熵。 IIRC的功能之一就是列出臨時文件,因此,如果其中包含大量文件,將對啟動性能沒有幫助。

看來速度緩慢是由於SecureRandom的播種所致,並且僅當用戶是Guests組的成員時才如此。

SecureRandom種子初始化使用Windows Crypto API,當用戶為訪客時,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

我不是Citrix專家,但我知道是誰,並且誰猜想:

可以設置帳戶,以便將應用程序讀/寫重定向到非本地資源。 您遇到的延遲可能與該分辨率的初始化或性能有關。

另一種可能性是應用程序隔離可能有效,這意味着文件的讀/寫發生在資源的虛擬版本上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM