Java UUID生成的效能影響 – fastthread

banq發表於2022-05-18

Java 開發人員傾向於使用“java.util.UUIDrandomUUID()” API 來生成 UUID(通用唯一識別符號)編號(即“b8bbcbed-ca07-490c-8711-5118ee0af2f9”)。在某些情況下,使用此 API 可能會影響您的應用程式的可用性。讓我們在這篇文章中用一個真實的例子來討論這個 API。

java.util.UUIDrandomUUID() API是如何工作的?
java.util.UUIDrandomUUID() API內部使用作業系統中的 en[url=https://en.wikipedia.org/wiki/Entropy_(computing)]tropy[/url]來生成一個唯一的數字。
‘entropy’是什麼意思?
Linux核心使用某些技術,如使用者的滑鼠動作、硬體風扇噪音的變化、裝置驅動程式噪音的變化......來產生隨機數。
當作業系統中缺乏 ‘entropy’時,隨機數的生成就會變慢。當速度減慢時,呼叫'java.util.UUIDrandomUUID()'API呼叫的應用程式執行緒將被置於BLOCKED狀態,它們將無法進一步發展。

如果你的應用程式在一個關鍵的程式碼路徑中使用'java.util.UUIDrandomUUID()'API,而作業系統中缺乏‘entropy’,那麼多個執行緒就會進入這個BLOCKED狀態,使你的整個應用程式陷入停頓。

在Linux中檢查entropy的狀態
要檢查Linux中entropy的可用性,請執行以下命令。

cat /proc/sys/kernel/random/entropy_avail

如果你看到這個值小於1000,那麼它表明entropy的缺乏。這可能導致應用程式中的執行緒被封鎖。


潛在的解決方案
如果您的應用程式中出現此問題,以下是解決這些問題的潛在解決方案:
1. RHEL 
此問題已在 RHEL 7 及以上版本中得到解決。如果您可以升級到 RHEL 7 或更高版本,請這樣做。 
如果您在舊版本的 RHEL 上執行,則可以按照此處給出的建議來解決此問題


2. 在 Linux 中安裝 Haveged
如果您的應用程式在 Linux 中執行,那麼您可以考慮安裝 'haveged' 庫。“ haveged 專案”旨在提供一個基於HAVEGE 演算法改編的易於使用、不可預測的隨機數生成器。這是“已處理”專案GIT 儲存庫頁面。以下是如何安裝它:
在基於 Debian 的平臺(Debian、Ubuntu)上:

sudo apt-get install rng-tools sudo update-rc.d haveged defaults

在 Redhat 平臺(RHEL、Fedora、CentOS)上:

sudo yum install rng-tools sudo chkconfig haveged on



3. 使用 /dev/urandom 代替 /dev/random
類 Unix 作業系統提供了特殊檔案“/dev/random”,用作偽隨機數生成器。Java 使用這個檔案來生成隨機數。您可以將其配置為使用“/dev/urandom”而不是“/dev/random”。 
'/dev/urandom' 是另一個能夠生成隨機數的特殊檔案。但是,由於隨機性較小,它具有降低安全性的缺點。您可以透過在啟動期間將以下 JVM 引數傳遞給您的應用程式來實現它:

-Djava.security.egd=file:/dev/./urandom


 

相關文章