閱讀408 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

比如,如下是上麵命令的一個輸出結果

_2017_07_17_12_04

造成這種差異的原因在於,/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的問題。步驟如下

  1. 確認是不是使用的是設備/dev/random。這隻要檢查$JAVA_HOME/jre/lib/security/java.security對應的配置就好。
  2. 如果是,則變更配置。
  3. 重啟Java程序確認是否問題解決。

最後更新:2017-07-17 16:41:56

  上一篇:go  數據中心清潔能源使用調查 中國企業僅阿裏及格
  下一篇:go  中間人攻擊:你的信用卡數據是這樣暴露的……