由於新的服務器不再支持CentOS5.4系統了,我們在新裝機器上安裝CentOS6.6。隨着CentOS6.6機器的增多,我們逐漸注意到一個詭異問題:運行在這些機器上的某些進程,容易莫名其妙地掛起(舉個例子,mysql可以連上,但命令收不到響應),也沒有輸出任何的錯誤日志,dmesg也看不到異常消息。比較容易卡住的服務有rabbitmq、mysql還有我們自己的幾個Java服務程序。
一開始我們是通過重啟服務來解決。然后我發現一個現象:就是如果使用gdb、strace、jstack -F命令來查看這些進程的運行情況,在查看之后服務會恢復正常。這樣做比重啟服務代價小,但隨着機器增多,越來越不堪其擾。開始各種搜索,終於找到一個比較可能的問題原因:這是一個內核的Bug引起的。
參考鏈接:
《Linux內核漏洞將影響Haswell架構服務器》 。摘要一下:在infoq網站上,Gil Tene最近報告一個十分重要,但並不為人知Linux內核補丁,特別對采用Haswell架構的Linux系統用戶和管理員應該特別關注。報告提醒Red Hat發行版的用戶(包括CentOS 6.6及Scientific Linux 6.6),即便是運行在虛擬機中的Linux,虛擬機在流行的Azure、Amazon雲平台上,也可能運行在Haswell服務器上,立即更新這個補丁。這個內核漏洞的影響非常簡單:在看似不可能情況下,用戶進程會死鎖並被掛起。即使被正確地喚醒,futex調用等待都有可能被阻止執行。如同Java里的Thread.park可能會一直阻塞等,若幸運可能會在dmesg日志中發現soft lockup消息;如果沒那么幸運,將不得不花幾個月的人工成本去排查問題,可能一無所獲。
可以翻牆的同學可以看下:https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64 。
這個問題的處理方法是升級內核:yum install kernel -y
后記:升級完內核后,此現象不再出現,說明升級內核是有效果的。升級完的內核版本用uname -a查看是:Linux XXX 2.6.32-642.1.1.el6.x86_64 #1 SMP Tue May 31 21:57:07 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 。 升級之前是:Linux XXX 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux