今天記錄一下之前遇到的問題:項目部署在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這個檔案,找到下面的内容: