圖片來源: 

iThome

因為軟體的問題而造成當機或是企業損失的原因百百種,不過大體來說可以歸納到3個方面,一是軟體過度同質化,以致發生問題時全部都受影響;其二是應用程式的設計邏輯出錯,造成企業的損失或當機;其三則是資料庫處理上出了問題。

軟體過於同質,發生問題導致全面停擺

軟體過於同質化,導致面對軟體出錯時不堪一擊,讓系統大受影響甚至造成大當機的事件一旦發生,大體來說企業能夠做的選擇其實非常有限。這種事例最近就有一起,4月底,知名資安廠商McAfee更新了一個錯誤的病毒碼檔案,誤把Windows XP SP3作業系統的合法元件SVCHOST.EXE檔,視為惡意程式W32/Wecorl.a病毒,進而刪除。而後使用者的電腦就會不停的重新開機,或是當機且無法正確開啟。

這項錯誤的舉動,使得很多企業和組織的運作都受到影響。由於多數企業在防毒軟體的使用上,都會採用單一品牌,這也使得這個被稱為「致命更新」的事件,讓很多企業和組織的電腦運作都因此而停擺。舉例來說,Intel總部就承認,在美國境內所有使用McAfee的電腦都受到影響;美國密西根大學醫學院25,000臺電腦中,有8,000臺當機;美國羅德島各醫院的急診室也因此影響作業,當天暫時拒收非創傷病患,並且延後數個外科手術。

甚至連政府單位都受到影響,美國愛荷華州一個區域性的急難求助中心的電腦系統也當機,進而影響附近各郡與城市,以及當地的911中心。華府特區副資訊長Sonny Hashmi稱此事件是一次「大崩潰」,並說McAfee已被列入他的永久黑名單之中。華盛頓的Snohomish County,更是有4成左右的電腦受到影響,回復正常需要耗時費力,到事件發生後1周,都還沒有完全回復。澳洲一間知名連鎖超商Coles,也有10%的終端收銀機系統受到這個事件影響,該公司在西澳和南澳的幾間門市甚至被迫暫停營業。根據國外媒體的報導,這間連鎖超商共有1,100臺終端收銀機受到影響而停機。

從上述這些事件可以看出,遇到這種完全無法防禦的事件,軟體的過度同質化會帶來的影響有多深。最後,McAfee所提供的補償方案則是針對受到影響的一般消費者提供兩年免費產品授權及支出補償;針對企業客戶,則是提供一年份的自動化安全健檢服務。

所謂自動化安全健檢方案,是一個包含了4小時的遠端諮詢服務,以協助企業執行安全檢查、檢討企業的安全政策、伺服器配置及環境等,分析相關的結果,並根據McAfee的最佳範例提供建議。事實上對於當時營業受到影響的企業和組織來說,其實根本是完全不成比例的補償。雖然最後McAfee聲稱只有不到0.5%的企業和組織的客戶受到這次錯誤更新影響,不過對於這些受到影響的企業來說,卻是一個無法挽救的傷害。

事實上,這種事件也不算少見,只是影響有沒有大到一定範圍而被媒體披露而已。舉例來說,虛擬化廠商VMware在2008年釋出ESX 3.5 Updata 2軟體更新時,也發生過問題,使用者安裝更新後,就會造成虛擬機器關機後無法再啟動。這個問題主要是因為授權碼辨識的錯誤,造成使用者會被判定為授權不足,而無法開啟虛擬機器,甚至也無法啟動在不同伺服器搬移虛擬機器的VMotion功能。其他諸如過去Windows更新的問題與漏洞等,也曾經發生過。

雖然說遇到這樣的狀況,企業和組織可做的選擇性不多,不過企業可以針對這樣的狀況做出一些預防措施,其實軟體的備援也是同樣的道理,避免軟體的全面同質化,有的時候可能是避免這種像是發生車禍一樣的突發問題,逃過大當機魔掌的一種方法。例如自行開發系統時,開發不同作業系統上可以使用的應用程式,平常使用的可能是Windows平臺上可以使用的中介軟體、應用程式;另外再備有一套可以使用Linux作業系統的中介軟體、應用程式。不過這樣的缺點就是可能需要更多的開發經費與人力,但是準備一套沒有完全同質化的系統應變,其實也是降低這種風險的手法之一。

不過要注意的是,這並不代表在單一系統上採用各個不同廠商的軟體,就會比較好,事實上單一系統的限制下,某種程度的同質性還是沒有辦法避免的,最好是以系統為單位來看,準備一套能夠緊急應變的系統,降低因為同質性,而把雞蛋都放到同一個籃子上的風險,才是良策。

5年都正常運作的系統並不代表沒有bug

另外一個造成大當機的原因,很多時候是企業自行開發應用程式本身的問題。當然這個問題可能性百百種,也有很多不同的專文與書籍在探討程式開發、測試的流程,避免這些問題,在此就不贅述。

在這邊要談的,是比較多人會忽略的一點,而卻曾經發生過,雖然沒有造成大當機,但卻企業慘痛損失的事例。2007年,在日本曾經發生過一個很有名的事件,一間券商因為軟體邏輯設計的失誤,以及人為操作的錯誤,導致損失400億日元。

這個事件主要是因為券商交易軟體的設計上,沒有設計一個完善的取消機制。某個營業員敲單的時候,要將原本1張61萬元的股票賣出,卻打錯欄位,打成61萬張1元的股票。而後雖然系統有警示,但營業員操作過快,按下了賣出確定的按鈕。這個時候發現錯誤的營業員,為了挽救過失,很快的再度重新操作,想要取消賣出的作業,挽救剩下還沒有賣出的股票。不過他卻發現無法取消買賣,而造成這一點的原因,是一個5年以來都沒有發現的系統錯誤。

原來系統背後有5道警告與自動審核的程序,其中一道就是針對這種太誇張的大量低價賣出做警示,但是當營業員忽略警示之後,要再度取消賣出的時候,系統預設的設定竟然是判斷「這些股票已經全部賣出」,所以不准許使用者取消。事實上,在股票市場上這些股票可能還沒有真正全部撮合完畢,但是系統設計的錯誤,卻導致營業員無論怎麼想要補救,都無法透過系統完成,這算是系統設計上的錯誤,理論上還未成交的股票應該是可以取消才對。最終,證券公司只好買回多賣的股票,價差一來一往就賠了400億日元。

值得注意的是,這間券商交易系統背後的5道檢查機制,如首次交易的股票價位、大量買進股票、大量賣出股票、價格差距過大等,全部都運作正常,也都沒有任何設計上的錯誤,但是卻在最後例外的狀況時,發生無可挽回的系統Bug,而且長達5年間,都沒有被任何 人發現。

這樣的事件雖然不是造成業務停擺的當機,但是也對公司帶來了嚴重的損失。可以看出,軟體的設計上,尤其要針對例外狀況的規則,做嚴謹的測試,減少流程的不合理。很多無論是造成當機,或是造成嚴重損失的失誤,很多都是因為軟體開發者可能沒有考量到一些例外的狀況,導致長期以來有問題卻都沒有發現,真正發現的時候,損失已經造成了。

資料庫的重整與效能,也常是當機發生的原因

另外一個因為軟體而造成的常見當機原因,則是資料庫相關的動作。例如資料庫負載不足、資料搬移、資料庫分割出錯、資料庫讀取的狀態無法解除等。

2007年5月臺大醫院發生系統停擺的例子,就是資料庫分割失誤所造成的問題。一般企業或組織會採取資料庫分割(Partition)來提升資料庫的運作效率,對於大多數的資料庫管理員來說,資料庫分割也是一個正常普通的工作,然而2007年臺大醫院在做資料庫分割的時候,卻擾亂了原本的資料庫索引(Index)路徑,結果造成門診、住院、行政等系統,讀取資料的運作非常緩慢,原本只要2秒鐘就能撈取的病人相關資料,變成需要將近1分鐘才能完成。

當時的臺大醫院副院長賴飛羆表示,當天早上9點左右,臺大醫院的看診作業就陸續受到影響,IT人員雖然很快就掌握到問題的原因,但資料庫的運作卻直到下午2點左右才恢復正常運作,主要關鍵就是恢復資料欄位的設定之後,卻一直沒有啟動最佳化索引路徑,所以資料搜尋反應遲緩的問題在這段時間內依然沒有得到解決。當時臺大醫院為了縮小影響範圍,決定暫時停止門診系統的運作,住院系統與行政系統則照常運作,然而,即便這樣因應,資料庫分割所造成的問題已經讓當天的門診系統停擺,當天至少有6,000~8,000人受到波及。

賴飛羆在當時接受採訪時表示,這次事件並不是臺大醫院第一次進行資料庫分割的作業,但的確是調整幅度比較大的一次。當時為了考量到資料庫的運作效率,負責管理資料庫的人員,在做資料庫分割的同時,也進行了有效資料範圍調整的作業。而之所以後來會造成系統的停擺,最大的關鍵則是在於資料庫分割之後,相關人員少了測試與最佳化路徑分析,所以才會沒有事先發覺資料庫索引已經偏離原本的路徑。整起事件所以嚴格說起來並不算是系統當機,也和導入服務導向架構(SOA)等作為,沒有任何關係。

2009年底,臺大醫院也發生了一次大當機5小時的事件,雖然原因沒有被證實,不過據了解,這次似乎是因為系統擴充的時候,資料庫負載超出預期,導致門診系統停擺,使得醫生無法調閱相關病歷資料、醫院健保卡系統無法作用,導致病患無法領到特定藥物等狀況。當天影響的病患人數估計約有4,000人以上。如果這個原因屬實,臺大醫院這次也是因為資料庫的問題而導致停機。

事實上,日本某間員工超過20萬人的企業,也曾發生過在搬移舊資料庫內的資料,轉換至新資料庫時,因為遺漏了輸入資料,而導致整個公司的人事和薪資資料全部錯亂的問題。這間公司因為要搬移資料,在3個月前就先把資料複製一份到新的資料庫上,然後採用新、舊資料庫並行處理的方式,同步更新資料,準備轉換日期到了之後,直接轉由新資料庫接手。然而卻意外的漏掉了員工薪資和福利獎金變動的資料變更,以至於新資料庫上線時,相關業務還是3個月前的資料,導致整間公司20萬名員工的保險、出差費用、新進人員資料、薪資、福利獎金等資料,都發生錯亂,使得財務部門無法正常扣款發放。這個事件主要是因為該公司採用並行處理的方式,而又沒有在轉移前重新確認與同步新、舊資料庫,最後才會造成這樣的結果。

從這兩次事件來看,資料庫在搬移或處理資料的時候,或是需要超出平常的負荷時,要特別注意規畫與處理的過程。當然如果能夠做到資料庫同步的備援,是可以減少這樣的風險,不過這對於實際應用的環境來說非常困難。

除此之外,軟體出現的問題當然也包括了作業系統和中介軟體,一般來說這些問題都可以透過備援的方式做到一定的防護。還有則是時序的問題也廣為大家所知,如民國100年、千禧蟲等原本系統設計上缺失。最近也發生了Sony PS3遊戲主機,因為舊版機器設定錯誤,誤把2010年當做閨年,於是連線上網時造成使用者資料錯亂,或是網路上的資料消失,甚至無法開機的狀況。這些雖然是老生常談,不過依然是在考量軟體面時,需要注意的問題。

 

系統同質性過高,Bug影響範圍擴大的風險也高

 


相關報導請參考「為什麼會大當機?」

 

熱門新聞

Advertisement