分析事故根本原因的利器——5Why分析法
筆者最近接觸到5Why分析法,覺(jué)得該方法簡(jiǎn)單實(shí)用,有助于分析問(wèn)題的原因,因此嘗試用來(lái)分析今年的一次生產(chǎn)事故。在開(kāi)始分析前,先對(duì)5Why分析法進(jìn)行介紹。
5Why分析法,是一種分析問(wèn)題根本原因的方法,由豐田集團(tuán)創(chuàng)始人豐田佐吉提出,后來(lái)成為豐田汽車(chē)公司獲得成功的重要方法,并且被融入到各種管理方法中。該方法的字面意思是 5 個(gè)為什么,指的是對(duì)一個(gè)問(wèn)題連續(xù)問(wèn)出 5 個(gè)為什么,以分析其根本原因。豐田汽車(chē)前副社長(zhǎng)大野耐一舉過(guò)這樣一個(gè)例子:
問(wèn)題 1 :為什么機(jī)器停了?
答:因?yàn)闄C(jī)器超載,保險(xiǎn)絲燒斷了。
解決方案:換保險(xiǎn)絲(防堵措施)
問(wèn)題 2 :為什么機(jī)器會(huì)超載?
答:因?yàn)檩S承的潤(rùn)滑不足。
解決方案:加潤(rùn)滑劑(改善措施)
問(wèn)題 3 :為什么軸承會(huì)潤(rùn)滑不足?
答:因?yàn)闈?rùn)滑泵失靈了。
解決方案:修理潤(rùn)滑泵(改善措施)
問(wèn)題 4 :為什么潤(rùn)滑泵會(huì)失靈?
答:因?yàn)樗妮嗇S耗損了。
解決方案:換輪軸(改善措施)
問(wèn)題 5 :為什么潤(rùn)滑泵的輪軸會(huì)耗損?
答:因?yàn)殡s質(zhì)跑到里面去了。
解決方案:給潤(rùn)滑泵安裝過(guò)濾器(根本措施)
從上述 5 個(gè)問(wèn)題,可看出,通過(guò)問(wèn)題 1 只能看到問(wèn)題的表象,而問(wèn)題 2 到問(wèn)題 4,仍只能對(duì)問(wèn)題進(jìn)行改善,而直到問(wèn)題 5,才暴露出了根本原因,得以從根上解決問(wèn)題。隨著追問(wèn)為什么,我們更容易去接近造成問(wèn)題的根本原因。
5Why分析法的注意事項(xiàng)有:
問(wèn)題數(shù)量不是關(guān)鍵,關(guān)鍵是找出根本問(wèn)題。雖然叫5Why分析法,但不是必須要問(wèn) 5 個(gè)為什么,一般 3 ~ 7 個(gè)都行,少于 3 個(gè)可能找不到根本原因,超過(guò) 7 個(gè)還沒(méi)找到,那需審視問(wèn)題本身是不是有問(wèn)題,關(guān)注的焦點(diǎn)是不是偏移了。 追問(wèn)的時(shí)候不要偏離主題。要朝著解決問(wèn)題的方向進(jìn)行分析,不要只從外界不可控因素尋找問(wèn)題,而應(yīng)尋找可控的因素。
下面用5Why分析法分析一個(gè)筆者遇到的實(shí)際生產(chǎn)事故。
事故即將發(fā)生時(shí),數(shù)據(jù)庫(kù)中正在執(zhí)行的線程數(shù)超過(guò)預(yù)先設(shè)置的閾值 32 個(gè),于是系統(tǒng)監(jiān)控發(fā)出報(bào)警,隨后數(shù)據(jù)庫(kù)的CPU使用率開(kāi)始飆高,緊接著系統(tǒng)的所有模塊訪問(wèn)數(shù)據(jù)庫(kù)失敗,然后整個(gè)系統(tǒng)呈不可用狀態(tài)。
當(dāng)時(shí)的應(yīng)急解決辦法是查看數(shù)據(jù)庫(kù)正在執(zhí)行的SQL,然后定位SQL所涉及功能,將該功能所在模塊進(jìn)行重啟,重啟后CPU使用率開(kāi)始下降,系統(tǒng)慢慢開(kāi)始恢復(fù),但隨著問(wèn)題模塊重啟完成后,CPU又逐漸呈現(xiàn)上升趨勢(shì),但這時(shí)已經(jīng)給定位問(wèn)題爭(zhēng)取了一定的分析時(shí)間,定位到是一批特殊數(shù)據(jù)造成的,于是對(duì)這批數(shù)據(jù)進(jìn)行了應(yīng)急處理,最后事故解決,系統(tǒng)順利恢復(fù)了。
下面筆者嘗試從三個(gè)角度進(jìn)行分析
角度一 “制造”,為什么會(huì)發(fā)生?
問(wèn)題 1:為什么數(shù)據(jù)庫(kù)的線程數(shù)會(huì)增加?
答:正在執(zhí)行的SQL執(zhí)行時(shí)間長(zhǎng)。
問(wèn)題 2:為什么正在執(zhí)行的SQL執(zhí)行時(shí)間長(zhǎng)?
答:因?yàn)檎趫?zhí)行的SQL發(fā)生了死鎖。
問(wèn)題 3:為什么SQL會(huì)發(fā)生死鎖?
答:同時(shí)刪除相同的一批數(shù)據(jù),而刪除時(shí)出現(xiàn)亂序。
問(wèn)題 4:為什么刪除相同的一批數(shù)據(jù)?
答:代碼邏輯問(wèn)題,不需要重復(fù)刪除。
解決方案:更改代碼邏輯,避免重復(fù)刪除。
角度二 “檢驗(yàn)”,為什么沒(méi)有發(fā)現(xiàn)?
問(wèn)題 1:為什么代碼上線幾個(gè)月都沒(méi)有發(fā)現(xiàn)?
答:未出現(xiàn)大量的死鎖情況。
問(wèn)題 2:為什么沒(méi)有出現(xiàn)大量的死鎖情況?
答:未出現(xiàn)這種造成大量并發(fā)的數(shù)據(jù),測(cè)試用例也未覆蓋。
問(wèn)題 3:在小量并發(fā)數(shù)據(jù)的情況也可能發(fā)生死鎖,為什么沒(méi)有發(fā)現(xiàn)該邏輯會(huì)產(chǎn)生死鎖?
答:未能及時(shí)從錯(cuò)誤日志中發(fā)現(xiàn)問(wèn)題。
問(wèn)題 4:為什么未能及時(shí)從錯(cuò)誤日志中發(fā)現(xiàn)問(wèn)題?
答:錯(cuò)誤日志中有較多無(wú)用的日志,擾亂了日志分析。
解決方案:清理代碼中無(wú)用的錯(cuò)誤日志打印,及時(shí)檢查錯(cuò)誤日志,并解決問(wèn)題。
角度三 “系統(tǒng)”,為什么沒(méi)有從系統(tǒng)上預(yù)防事故?
問(wèn)題 1:為什么沒(méi)有從系統(tǒng)上預(yù)防事故?
答:已經(jīng)做了數(shù)據(jù)庫(kù)正在執(zhí)行線程數(shù)的預(yù)警,但發(fā)現(xiàn)時(shí),數(shù)據(jù)庫(kù)的CPU上升速度已經(jīng)很快了,提供的反應(yīng)時(shí)間不多。
問(wèn)題 2:為什么單個(gè)模塊的問(wèn)題,會(huì)影響系統(tǒng)全部模塊?
答:因?yàn)楦髂K都有使用到base數(shù)據(jù)庫(kù),base數(shù)據(jù)庫(kù)一旦不可用,便影響了全部模塊。
問(wèn)題 3:為什么各模塊都需要使用base數(shù)據(jù)庫(kù)?
答:系統(tǒng)設(shè)計(jì)時(shí),未將各模塊所使用的數(shù)據(jù)庫(kù)進(jìn)行隔離。
解決方案:將各模塊使用的數(shù)據(jù)庫(kù)進(jìn)行隔離,即使單模塊出現(xiàn)問(wèn)題,也不會(huì)通過(guò)數(shù)據(jù)庫(kù)影響到其他模塊(但是該方案的成本較高,相當(dāng)于進(jìn)行整體的重構(gòu)了)
以上筆者通過(guò)三個(gè)角度來(lái)對(duì)此次事故進(jìn)行分析,隨著追問(wèn),對(duì)問(wèn)題的認(rèn)識(shí)也會(huì)更加清晰。希望這個(gè)5Why分析法的案例能對(duì)你有啟發(fā),可將其作為一種思維方式,應(yīng)用于實(shí)際的問(wèn)題分析中。
