生產環境下高并發程序崩潰?麻州大學讓多線程軟件故障分析自動化
軟件調試是非常枯燥而又技術難度很高的工作,其中軟件故障的自動化分析是幾代程序員共同的夢想。進入多核時代后,多個線程的并行處理極大地提高了程序性能,但同時任務的交織又使得程序運行結果更難以重現,這讓調試工作變得更加艱巨。
近日,麻薩諸塞大學阿默斯特分校(University of Massachusetts Amherst,簡稱「麻州大學」)的電子與計算機工程系劉通平教授領導的研究團隊最近開發一個名為 Watcher(哨兵)的自動化多線程軟件故障分析工具,可以在幾秒鐘或者幾分鐘內自動精準定位軟件錯誤原因,有望徹底解決生產環境下并行程序調試困難的問題,能顯著提高自動駕駛等關鍵系統的可靠性。
從智能手表到大型服務器,零售終端到金融交易平臺,軟件服務存在于日常生活的方方面面,極大的便利了人們的日常生活。但是,軟件中總會包含一些潛在的缺陷或者 bug。盡管嚴格的軟件測試有助于盡早發現這些缺陷,但是開發人員往往迫于壓力,在沒有進行全面測試的情況下就匆匆將軟件發布。而且有些軟件缺陷只在特定輸入條件下才會觸發,或者只在特定的任務交互下才會顯現,即使是嚴格的測試也并不能完全消除大型軟件中的所有缺陷,尤其是并發軟件中的缺陷。這些程序的缺陷常常成為軟件測試的漏網之魚,進而導致運行過程中系統崩潰、程序掛起、或引發安全漏洞。
盡管目前存在一些可用的軟件調試系統,但大都需要人工干預。這樣的系統在實際應用生產環境中是無法直接部署的。人們經常使用微軟公司的辦公軟件,但是你不能指望普通用戶能夠調試這些軟件問題。普通用戶既沒有能力,也沒有義務去幫忙調試。因此,軟件公司只能收集用戶的錯誤報告,然后進行離線診斷。但離線診斷又有各種弊端:
第一,因為數據上傳時并不能區分出故障相關信息,離線診斷必須收集錯誤現場的所有數據,其中也會包含一些用戶的隱私數據。比如,用戶剛剛用 IE 瀏覽器登陸網上銀行賬號然后崩潰,其錯誤報告就會包含用戶的賬號和密碼等隱私信息;
第二,因為離線診斷通常依賴于統計方法,或者通過錯誤狀態反向推理程序運行的狀態,這些方法的診斷能力都十分有限。因此,迫切需要更有效的軟件診斷系統來取代傳統的離線診斷方法。
「無論技術如何進步,軟件故障始終是一個令人擔憂的問題」劉通平教授表示:「我們研究的軟件故障診斷系統 Watcher 可以在原始的運行環境中現場快速地診斷程序故障的根本原因。
跟以往的工具相比,Watcher 避免了其他分析軟件的隱私問題。用戶不再需要上傳整個內存鏡像,Watcher 也只會提供報告軟件相關故障的報告。而且,Watcher 可以輕松部署,不依賴于定制的硬件或操作系統(不過目前 Watcher 只提供了對 Linux 系統的支持),也不需要修改程序代碼或者重新編譯程序。研究團隊利用 Watcher 成功檢測了幾十種軟件(包括一些大型應用)中發生的故障。評估結果顯示,Watcher 可以在短短幾秒鐘內準確識別出軟件故障的根本原因」。
「冰凍三尺,非一日之寒,騏驥千里,非一日之功」。這項軟件故障診斷的突破也是來自于劉教授和其研究團隊的長期耕耘和努力:早在 10 年前,劉通平教授還是博士生的時候,他就開始研究并行軟件的確定性問題,其成果發在計算機軟件系統的最頂級會議 - 操作系統原理大會(SOSP'11)。在博士階段后期,他開始研究 Watcher 軟件系統的基礎工作,一種確定性的記錄重放系統(record-and-replay),相關的成果發表在軟件工程頂會(ICSE‘16)和編程語言的頂會(PLDI‘18)。2015 年劉教授還在德州大學圣安東尼奧分校工作時,他的學生劉宏宇繼續這一方面的研究工作,經過 8 年的辛勤工作,軟件故障診斷才有了今天的重大突破。
劉教授介紹說:「Watcher 的成功離不開它的基石 --iReplayer,它也是我們組 PLDI‘2018 的工作。iReplayer 能夠準確無誤的復現程序錯誤運行情況的系統,保證程序運行的一致性:在重新執行過程中,相同指令將對與原始運行時完全一致的存儲單元 / 寄存器執行相同的讀寫操作。這一特性這為軟件故障診斷打下了堅實的基礎」。正是基于 iReplayer,Watcher 才能夠實現現場診斷軟件錯誤,其基本原理如下圖所示:
Watcher 作為一個運行庫存在,可以和待檢測的程序相鏈接。在程序正常運行時,Watcher 對程序的運行情況進行一些記錄,但其性能開銷低于 3%。當程序發生錯誤時,Watcher 的診斷模塊將被自動開啟,并在重放過程中進行自動診斷。Watcher 將二進制靜態分析、動態分析與硬件調試技術結合在一起實現了自動化軟件故障診斷。目前該研究已發表在程序語言與軟件工程類頂級學術會議OOPSLA‘2020,相關合作單位還包括普渡大學、德州大學圣安東尼奧分校、和伊利諾伊大學香檳分校。
Watcher 的程序錯誤診斷基于一個關鍵發現:程序錯誤通常是由于程序將錯誤或無效的值寫入某個內存中,并在隨后的運行中引發異常所導致。基于這個發現,Watcher 采用混合分析法來確定導致程序錯誤發生的內存單元、相關的指令和錯誤值傳播路徑。在二進制分析中如果出現不能確定的情況時,Watcher 利用重放運行過程再次收集和確認程序錯誤相關的信息,做到準確無誤的報告程序錯誤的根本原因。此外,Watcher 還利用硬件寄存器非入侵式地采集對特定內存的訪問,并動態地分析程序錯誤相關片段。分析結束后,Watcher 會生成一個對于錯誤值的完整報告,程序員根據其報告能夠快速定位和修復這個程序錯誤。
Watcher 的優點之一是可以在軟件開發、部署、生產的所有階段中使用。可以預見,Watcher 將對各種急需現場錯誤診斷的系統非常有用,尤其是人身安全相關的領域,比如航空系統或者自動駕駛。自動駕駛領域的一大痛點問題是如何快速的進行錯誤診斷,讓程序員能夠修復缺陷以提高系統的魯棒性。然而,由于無線通信等傳輸瓶頸無法傳輸整個內存鏡像,或者即使有內存鏡像也無法準確定位問題,自動駕駛企業很難快速地優化系統,從而帶來潛在的安全隱患。因為 Watcher 可以確定失敗的根本原因,還能避免離線分析或靜態分析的多個問題,這些痛點問題將通過 Watcher 得到解決。
根據 2017 年的數據,軟件故障每年帶來超過 1.7 萬億美金的財政損失,而且每個程序員每年平均超過 1500 小時用于程序調試。無侵入性部署,精準自動化復現多線程故障,秒級自動錯誤原因分析,Watcher 為生產環境下的軟件故障分析帶來了曙光,也將可能會有幾十億美元級別的市場?
論文鏈接:https://people.umass.edu/tongping/pubs/Watcher_OOPSLA20.pdf