Linux係統小技巧(1):/dev/random設備可能導致java程序啟動慢或者操作耗時不正常
致因
Linux係統上的設備/dev/random和/dev/urandom是不同的。這點可以使用下麵的命令測試出來(執行會耗費幾分鍾時間,請有心理準備)
for dev in /dev/random /dev/urandom;do
echo "test ${dev}: "
time dd if=${dev} bs=512 count=1 > /dev/null 2>&1
time dd if=${dev} bs=512 count=1 > /dev/null 2>&1
done
比如,如下是上麵命令的一個輸出結果
造成這種差異的原因在於,/dev/random設備提供的不是偽隨機數據,而是基於環境中的真實隨機因素(即背景噪聲作為熵源)的隨機數據。所以,/dev/random不像設備/dev/urandom。後者是一個偽隨機數據生成器,能按照請求快速生成所需數量的數據。/dev/random能生成多少內容由環境中的噪聲決定。數據不足時,/dev/random隻能等待。
所以,在內容不足時,/dev/random會將讀操作阻塞,直至收集到足夠的隨機數據。這就是測試結果差異產生的原因,/dev/random阻塞第二次的讀操作將近1分鍾時間。
所以,對於使用了/dev/random設備的而言,都有被阻塞的可能。被阻塞時,上層應用可能表現為啟動慢或者執行耗時不正常。因為/dev/random行為與環境背景有關,行為隨機。所以也導致上層應用因之引發的問題表現隨機,不易排查。
比如,在Java社區,/dev/random設備引致的問題早在jdk-1.4版本時就已經有bug報告。但是還是有客戶不知道類似問題的致因和解決方案。
解決方案簡單說,就是除非有明確的理由,必須要使用/dev/random設備。否則,使用/dev/urandom設備即可。
對於jdk而言,需要的是把配置文件中$JAVA_HOME/jre/lib/security/java.security中的
securerandom.source=file:/dev/random
改為
securerandom.source=file:/dev/urandom
排查建議
對於Java程序啟動慢,或者進程耗時不正常,請優先排查是不是/dev/random的問題。步驟如下
- 確認是不是使用的是設備/dev/random。這隻要檢查$JAVA_HOME/jre/lib/security/java.security對應的配置就好。
- 如果是,則變更配置。
- 重啟Java程序確認是否問題解決。
最後更新:2017-07-17 16:41:56