intel spectre microcode引起的啓動變慢及解決方案

有段時間沒有光顧博客了,年後工作內容飽滿,各種各樣的事情,忙得不亦樂乎。

今天有點時間,就寫一下其中一個bug的解決吧,也算記錄一下一個程序員日常工作的點滴。另外也讓人們看看intel的漏洞給我們程序員帶來多大的麻煩。

這篇文章我想盡量寫的非技術化,我想讓圍牆外的人們也瞭解一下程序員的工作。也許兒子長大了做的是和計算機無關的工作,他看到這篇文章也許會說:‘哦,爸爸每天就是做這些啊,真沒勁’。

都知道intel的補丁會拖累系統的性能,離奇的是最近報的一個bug中顯示OVM3.4打上microcode補丁後啓動時間延長了兩分半,這是客戶不能接受的!

而且這個問題只在公司的幾臺大的服務器上可以重現,本人的兩臺小dell pc就一邊去吧,而這也給解決問題增加了難度。

這個bug早在年前就被客戶提出來了,由於調試環境的缺乏一直懸在那裏。最近借來一臺機器趕緊開整。

對於啓動問題,kdump派不上用場,唯一可以依賴的就是啓動時打印的那段log,可以看到有一段間隔有大概200s的時間。

(XEN) [2018-03-16 04:33:19] Dom0 has maximum 20 VCPUs
(XEN) [2018-03-16 04:33:19] ELF: phdr 0 at 0xffffffff81000000 -> 0xffffffff81ac8                                           000
(XEN) [2018-03-16 04:33:19] ELF: phdr 1 at 0xffffffff81ac8000 -> 0xffffffff81c53                                           000
(XEN) [2018-03-16 04:33:19] ELF: phdr 2 at 0xffffffff81c53000 -> 0xffffffff81c6c                                           318
(XEN) [2018-03-16 04:33:19] ELF: phdr 3 at 0xffffffff81c6d000 -> 0xffffffff81e4e                                           000
(XEN) [2018-03-16 04:36:42] [VT-D]iommu.c:1555: d0:unknown(0): 0000:7f:0e.2


通過測試發現這段間隔在用舊的XEN跑也得花費50s左右的時間。分析比對代碼發現是construct_dom0這個龐然大物。因爲dom0有11GB之多,構造這麼大的guest花50s也不算多,所以這不是construct_dom0本身的問題。

那是什麼原因呢,繼續看代碼,調試,看代碼。。。。此處略去十萬字。

陽光總在風雨後,工作這麼多年來我發現一個現象,在一個bug調試很久都沒有結果的時候總是會有一個轉機出現。 這次這個轉機來的還算快,就是加上參數“bti=ibrs=0”以後啓動速度正常了。但是這把ibrs的功能都禁掉了,客戶的系統還會暴露在Spectre2的攻擊威脅之下。

還得繼續看代碼,但是只需要看Spectre相關的代碼了,主要是x86彙編中中斷,異常和nmi部分的入口和出口代碼。還真讓我發現了一個代碼的bug,我們用的一個比較指令永遠會跳轉,IBRS不會關掉,而這在若干人若干次的review中居然沒有發現包括我,然後居然被提交了,而且在海量測試中竟沒有觸發panic。

我彷彿看到了一絲曙光,期待着就此修復這個問題,修改後的測試結果給我潑了一盆冷水,問題照舊!

進一步的分析發現啓動階段還是得關掉IBRS,讓啓動代碼跑在全速的環境下。過程不表,加上新的修改後客戶表示happy了。

到此故事還沒有完,

patch發到社區,維護者提了若干意見,還在繼續溝通中。

那邊緊急來電,2.6.18內核Spectre補丁有點問題,請速去救援。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章