1. 程式人生 > >阿里雲伺服器tomcat啟動太慢或訪問應用堵塞 解決

阿里雲伺服器tomcat啟動太慢或訪問應用堵塞 解決

解決方法1,轉載於http://www.cnblogs.com/dingxiaochao/p/9544005.html

下面說解決方式:

tomcat bin/ catalina.sh 中加入

 

JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

解決方法二

轉載於https://blog.csdn.net/u013361107/article/details/80826092

 

之前在阿里雲上部了應用,今天訪問的時候登陸不進去,像是阻塞了,瀏覽器一直在轉。通過http工具進伺服器看了程序也沒down,日誌也沒報錯,瀏覽器請求返回304。一開始我以為是因為這臺阿里雲伺服器記憶體太小導致,然後我kill掉了所有tomcat程序,打算重啟一遍應用。這個時候讓人鬱悶的事情發生了,所有的應用tomcat啟動日誌都停在了Root WebApplicationContext: initialization completed in XXX ms這裡。容器都初始化成功了也沒報錯,為什麼就停著了呢。

        然而相同的專案,我部署到公司自己的伺服器的時候,就不會這樣,在排除了其他所有的可能情況之後,我發現應該是阿里雲伺服器本身的問題,在網上找了相關資料之後,在https://www.jianshu.com/p/576d356dc163這裡找到了答案。

        簡而言之,就是阿里雲伺服器的熵池太小,可用命令cat /proc/sys/kernel/random/entropy_avail檢視伺服器熵池。Tocmat的Session ID是通過SHA1演算法計算得到的,計算Session ID的時候必須有一個金鑰。為了提高安全性Tomcat在啟動的時候會通過隨機生成一個金鑰。在

http://wiki.apache.org/tomcat/HowTo/FasterStartUp (Entropy Source部分)有一段解釋。我也不是很懂,總之在Tomcat的啟動檔案裡有一項隨機函式生成器的配置,即-Djava.security.egd=file:/dev/random,將它改成-Djava.security.egd=file:/dev/urandom。或通過修改JRE中的java.security檔案securerandom.source=file:/dev/urandom。

    然而這樣的修改會降低系統的安全性。在我們知道了這是由於熵池不夠的情況下,我們可以做更本質的解決,讓熵池變大。

    如果你的CPU帶有DRNG特性,可以充分利用硬體來提高熵池產生的速度 。通過cat /proc/cpuinfo | grep rdrand可以檢視自己的CPU是否支援。

    以下內容轉自https://www.jianshu.com/p/576d356dc163

 

我們可以讓/dev/unrandom來做“熵源”。以Centos7為例,
yum install rngd-tools
或者yum install rng-tools
安裝rngd服務(熵服務)

systemctl start rngd
啟動服務
如果你的CPU不支援DRNG特性或者像我一樣使用虛擬機器,可以使用/dev/unrandom來模擬。

cp /usr/lib/systemd/system/rngd.service /etc/systemd/system

編輯/etc/systemd/system/rngd.service
service小結,ExecStart=/sbin/rngd -f -r /dev/urandom

systemctl daemon-reload
重新載入服務

systemctl restart rngd
重啟服務

經過上面的修改,我們再觀察/proc/sys/kernel/random/entropy_avail
基本上在3000左右。我們可以測試一下隨機數的生成速度
watch -n 1 cat /proc/sys/kernel/random/entropy_avail
觀察這個值

新開啟一個shell,用dd命令測試隨機數。dd if=/dev/random of=random.dat count=40960

[[email protected] bin]# dd if=/dev/random of=random.dat count=40960記錄了0+40960 的讀入記錄了6004+1 的寫出3074362位元組(3.1 MB)已複製,5.01017 秒,614 kB/秒

5秒產生了40960個隨機數,/proc/sys/kernel/random/entropy_avail會有劇烈的變化,所有隨機數產生之後它又會保持在3000左右。
選擇哪種解決方法

個人建議選擇第三種方式,熵池不僅僅Tomcat用,Linux下的所有應用程式產生隨機數都會用到這個,所以不僅僅是Tomcat可能被阻塞。如果你搜索會發現Apache、Nginx、OpenSSL都被這個問題坑過。如果我們通過修改Java的配置來解決這個問題其實只是解決Java應用程式的問題,只能是治標不治本。根治的方法應該是通過rngd
提高隨機數生成的速度。

    總結:當你發現一個沒遇到過的問題,哪怕這個問題很簡單,鑽研下去你會發現很多精彩的東西,這些就是你的經驗,就是你找一份好工作的優勢資本。