1. 程式人生 > >java web項目部署在linux系統出現第一次登錄高延遲的問題

java web項目部署在linux系統出現第一次登錄高延遲的問題

inux 重要 系統 隨機 需要 .so lib 出現 初始化

今天記錄一下之前遇到的問題:項目部署在window登錄能很快完成,部署到linux後,第一次登錄過程變得很慢。
通過查看系統日誌,發現時間主要消耗在了創建session,並且定位到是SecureRandom的初始化問題,繼續查看,發現session的id創建方式為uuid,到這裏,熟悉linux的人就會明白問題在哪了。
Java的UUID依賴於SecureRandom.nextBytes方法,而SecureRandom又依賴於操作系統提供的隨機數源。在Linux系統下,它的默認依賴是/dev/random,而這個源是阻塞的。最可怕的是,這個nextBytes方法還是一個synchronized方法,也就是說,如果多線程調用UUID,生成速率不升反降。
到這裏,只需要修改java的默認隨機生成規則就可以了。修改方法如下:
去到$JAVA_PATH/jre/lib/security/java.security這個文件,找到下面的內容:

securerandom.source=/dev/random

替換成

securerandom.source=/dev/urandom
好了,問題得到了解決!!
其實這也是分布式系統中,不使用uuid作為id的一個重要原因。

java web項目部署在linux系統出現第一次登錄高延遲的問題