云服務(wù)器啟動tomcat巨慢,很慢

自己再阿里云申請了一臺1G1核的機器,每次重啟自己的服務(wù)tomcat都需要卡住很長時間擂红,每次都是日志停在
Root WebApplicationContext: initialization completed in 744 ms這個地方,然后也不知道發(fā)生了什么围小,在等待
什么昵骤,網(wǎng)上看到了一篇博文树碱,mark下

問題現(xiàn)象

美女同事找我解決一個問題,說Tomcat啟動很慢变秦。開始我以為是程序?qū)懙膯栴}成榜,所以把webapps下所有程序都刪除掉。(只保留Tomcat自帶)靈異的事情發(fā)生了蹦玫,Tomcat停止在——

我查看了一下進程伦连,Tomcat所在的JVM進程已經(jīng)被啟動了所以可以排除是JVM退出引起的問題。那么問題真的就是JVM因為某種原因被阻塞了钳垮。
分析

問題比較棘手,我排除了CPU额港、內(nèi)存不足引起的問題饺窿;排除了硬盤空間不足引起的問題;我甚至去觀察了網(wǎng)絡(luò)I/O移斩、硬盤I/O情況肚医,都非常正常。程序被阻塞一般來說一定是要等待某個資源向瓷,而現(xiàn)在的情況是所有資源都充足肠套,所以我?guī)缀跸氩坏绞鞘裁磫栴}引起的。我開始懷疑是KVM Hypervisor虛擬化的問題(用的是虛擬機)我改變了策略在VMWare開了兩臺虛擬機上直接下載Tomcat啟動猖任。其中一臺很快啟動你稚,另一臺居然也被阻塞,問題被重現(xiàn)了朱躺。眼看要在美女面前丟臉刁赖,我光輝偉岸的形象要蕩然無存。這種情況下我不能去“擼”代碼吧长搀?況且Tomcat那么多人用宇弛,真有這么明顯的Bug早就炸開鍋了。(Tomcat還是很靠譜的不像xxxxStack那么狗屎)仔細想想我需要找到Tomcat停止在了哪里源请?代碼里發(fā)生了什么事情枪芒,但是我又不可能去擼代碼。無可奈何的情況下我決定試一下 strace谁尸,這是一個跟蹤系統(tǒng)調(diào)用(System Call)的工具舅踪,無論是Java還是Pyhton很多資源申請都會變成都會變成System Call。(比如打開文件良蛮、新建線程硫朦、讀寫數(shù)據(jù)、等待I/O)通過這個工具我至少可以知道Tomcat是停止在哪個System Call上的背镇,這樣可以方便我推斷出問題的原因咬展。
strace -f -o strace.out ./catalina.sh run

strace有很多參數(shù)泽裳,我用了二個參數(shù)
-f 跟蹤fork的子進程,通俗的說會跟蹤所有線程的系統(tǒng)調(diào)用

-o把內(nèi)容輸出到文件

其他參數(shù)請自行搜索下面分析strace.out文件破婆,分析的方法是從下往上(被阻塞的地方肯定是在最后咯)涮总。首先我們需要去掉Tomcat停止引起的System Call,它們不是我們需要的祷舀。從后往前搜索找到SIGINT

紅色部分以上就是引起阻塞的系統(tǒng)調(diào)用了瀑梗,上面有一大堆一大堆的futex
的調(diào)用,它是Linux中的一種輕量級的同步方法裳扯,所以我們可以判斷出最上面肯定是有某個System Call就是阻塞的真正元兇抛丽。跳過所有的futex
這個read
就是引起后面一串futex
的真正原因,strace非常聰明它不僅僅給出了System Call還給出了傳遞的參數(shù)和返回值饰豺,read讀取的是51號文件句柄亿鲜,沒有返回成功(unfinished)。順著這條路冤吨,我們看一下51號文件句柄是什么
/dev/random是Linux下的隨機函數(shù)生成器蒿柳,讀取它相當于生成隨機數(shù)字。搜索它漩蟆,第一個是wiki
至此似乎一切真相大白了垒探,/dev/random會根據(jù)噪音產(chǎn)生隨機數(shù),如果噪音不夠它就會阻塞怠李。Linux是通過I/O圾叼,鍵盤終端、內(nèi)存使用量捺癞、CPU利用率等方式來收集噪音的褐奥,如果噪音不夠生成隨機數(shù)的時候就會被阻塞
深入分析

如果用Tomcat /dev/random作為關(guān)鍵字基本上就能夠回答我們的疑惑了翘簇。Tocmat的Session ID是通過SHA1算法計算得到的撬码,計算Session ID的時候必須有一個密鑰。為了提高安全性Tomcat在啟動的時候回通過隨機生成一個密鑰版保。在 http://wiki.apache.org/tomcat/HowTo/FasterStartUp (Entropy Source部分)有一段解釋呜笑。stackoverflow上面也有一大批這方面的說明,所以這里就不再多做介紹彻犁。明白了問題的原因解決起來就非常簡單了——替換/dev/random為/dev/unrandom叫胁,用偽隨機函數(shù)生成器(/dev/urandom)來替代隨機函數(shù)生成器(/dev/random)。
通過修改Tomcat啟動文件-Djava.security.egd=file:/dev/urandom

通過修改JRE中的java.security文件securerandom.source=file:/dev/urandom

當然JVM的開發(fā)者不是傻瓜汞幢,Tomcat的開發(fā)者也不是二百五驼鹅。他們之所以沒有選擇/dev/urandom是為了提高系統(tǒng)的安全性,/dev/urandom并不是真正的隨機行為。(其實一般情況下/dev/urandom也是足夠安全的不太容易被“重復”)
徹底解決問題

上面介紹的兩種方式都是用/dev/urandom替換/dev/random输钩,其實還有第三種方式——增大/dev/random的熵池豺型。問題的原因是由于熵池不夠大,所以增大它是最徹底的方法买乃。通過cat /proc/sys/kernel/random/entropy_avail
我們可以查看現(xiàn)在的熵池大幸霭薄;我們需要找到一種方式來提高這個值就行了剪验。如果你的CPU帶有DRNG特性肴焊,可以充分利用硬件來提高熵池產(chǎn)生的速度 。通過cat /proc/cpuinfo | grep rdrand
可以查看自己的CPU是否支持功戚,一般來說Intel的Ivy_Bridge架構(gòu)的CPU都支持(i3娶眷、i5需要注意是否采用該種架構(gòu),i7和xeon基本上都支持)啸臀;AMD的CPU在2015年以后生成的都支持届宠。(如果你是虛擬機需要開啟額外的參數(shù))。如果你的硬件不支持壳咕,也沒有關(guān)系,我們可以讓/dev/unrandom來做“熵源”顽馋。以Centos7為例谓厘,
yum install rngd-tools
或者yum install rng-tools
安裝rngd服務(wù)(熵服務(wù))

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

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

編輯/etc/systemd/system/rngd.service
service小結(jié)竟稳,ExecStart=/sbin/rngd -f -r /dev/urandom

systemctl daemon-reload
重新載入服務(wù)

systemctl restart rngd
重啟服務(wù)

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

新打開一個shell他爸,用dd命令測試隨機數(shù)。dd if=/dev/random of=random.dat count=40960

[root@localhost bin]# dd if=/dev/random of=random.dat count=40960記錄了0+40960 的讀入記錄了6004+1 的寫出3074362字節(jié)(3.1 MB)已復制果善,5.01017 秒诊笤,614 kB/秒

5秒產(chǎn)生了40960個隨機數(shù),/proc/sys/kernel/random/entropy_avail會有劇烈的變化巾陕,所有隨機數(shù)產(chǎn)生之后它又會保持在3000左右讨跟。
選擇哪種解決方法

個人建議選擇第三種方式,熵池不僅僅Tomcat用鄙煤,Linux下的所有應(yīng)用程序產(chǎn)生隨機數(shù)都會用到這個晾匠,所以不僅僅是Tomcat可能被阻塞。如果你搜索會發(fā)現(xiàn)Apache梯刚、Nginx凉馆、OpenSSL都被這個問題坑過。如果我們通過修改Java的配置來解決這個問題其實只是解決Java應(yīng)用程序的問題,只能是治標不治本澜共。根治的方法應(yīng)該是通過rngd
提高隨機數(shù)生成的速度向叉。
總結(jié)

經(jīng)驗不是經(jīng)歷。用別人的經(jīng)驗解決一個問題不難咳胃,難的是自己從頭走一遍這條路植康,更加難的是推翻前人的經(jīng)驗對一個問題能夠有自己的看法和領(lǐng)悟。這個案例加深了我對strace
的理解展懈,對于空中加油
這種類型的系統(tǒng)調(diào)試有了自己的經(jīng)驗销睁;通過對原因的深入分析我找到了更好的辦法。這就是康德精神——思考存崖、批判冻记、理性。
如何重現(xiàn)故障

可以很容易的重現(xiàn)文章中描述的故障
systemctl stop rngd
停止rngd服務(wù)(如果你有啟動rngd)

查看當前熵池的大小cat /proc/sys/kernel/random/entropy_avail

head -c1024 /dev/random
来惧,強制消費1024個隨機數(shù)冗栗,系統(tǒng)會長時間沒有反應(yīng)。直接ctrl+c

再次查看熵池的大小cat /proc/sys/kernel/random/entropy_avail
供搀,保證它的大小在盡可能的小

啟動tomcat隅居,會發(fā)現(xiàn)長時間很長時間的等待

還有一個解決方案

在sun的bug database中也已經(jīng)有人給出,即在java程序啟動參數(shù)中添加:-Djava.security.egd=file:/dev/urandom葛虐,使用/dev/urandom生成隨機數(shù)胎源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屿脐,隨后出現(xiàn)的幾起案子涕蚤,更是在濱河造成了極大的恐慌,老刑警劉巖的诵,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件万栅,死亡現(xiàn)場離奇詭異,居然都是意外死亡西疤,警方通過查閱死者的電腦和手機烦粒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來代赁,“玉大人撒遣,你說我怎么就攤上這事」芏澹” “怎么了义黎?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豁跑。 經(jīng)常有香客問我廉涕,道長泻云,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任狐蜕,我火速辦了婚禮宠纯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘层释。我一直安慰自己婆瓜,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布贡羔。 她就那樣靜靜地躺著廉白,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乖寒。 梳的紋絲不亂的頭發(fā)上猴蹂,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音楣嘁,去河邊找鬼磅轻。 笑死,一個胖子當著我的面吹牛逐虚,可吹牛的內(nèi)容都是我干的聋溜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼叭爱,長吁一口氣:“原來是場噩夢啊……” “哼撮躁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涤伐,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤馒胆,失蹤者是張志新(化名)和其女友劉穎缨称,沒想到半個月后凝果,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡睦尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年器净,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片当凡。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡山害,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沿量,到底是詐尸還是另有隱情浪慌,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布朴则,位于F島的核電站权纤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汹想,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一外邓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧古掏,春花似錦损话、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夏漱,卻和暖如春豪诲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挂绰。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工屎篱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葵蒂。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓交播,卻偏偏與公主長得像,于是被迫代替她去往敵國和親践付。 傳聞我的和親對象是個殘疾皇子秦士,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容