導(dǎo)致系統(tǒng)性能失敗的十個(gè)原因
很多軟件系統(tǒng)由于性能問題導(dǎo)致了失敗,在開發(fā)生命周期和性能測試生命周期的每個(gè)階段都存在導(dǎo)致性能失敗的原因。有時(shí)候,性能問題是無法控制的,它不在項(xiàng)目經(jīng)理、技術(shù)架構(gòu)師或性能工程師的控制范圍之內(nèi)。從業(yè)務(wù)和個(gè)人層面來看,大多數(shù)的系統(tǒng)性能失敗僅僅是因?yàn)樾阅芄こ處?、開發(fā)人員、 DBA、業(yè)務(wù)團(tuán)隊(duì)和利益相關(guān)者之間從一開始就缺乏溝通,這導(dǎo)致了許多其他問題,這些問題將直接影響應(yīng)用程序的性能和 ROI。對任何應(yīng)用/產(chǎn)品進(jìn)行有效性能測試的唯一目標(biāo)是實(shí)現(xiàn)令人滿意的投資回報(bào)。性能測試和軟件工程是有風(fēng)險(xiǎn)的,并且總是需要從開發(fā)的早期階段開始,進(jìn)行大量的反復(fù)試驗(yàn)。
系統(tǒng)性能的失敗必須與其他業(yè)務(wù)問題進(jìn)行類似的處理。了解問題出在哪里,為什么會(huì)出問題,以及如何預(yù)防。在大多數(shù)場景中,需要每個(gè)人都了解/理解端到端全生命周期實(shí)現(xiàn)中的性能挑戰(zhàn)。他山之石,根據(jù)老碼農(nóng)的經(jīng)驗(yàn),總結(jié)了一個(gè)導(dǎo)致系統(tǒng)性能失敗的原因列表。
1. 對最終用戶反饋的置若罔聞
作為最終用戶,才會(huì)意識到的現(xiàn)有潛在性能問題。為了理解生產(chǎn)系統(tǒng)中現(xiàn)有的性能問題,需要從最終用戶那里獲得關(guān)于應(yīng)用程序在不同的預(yù)期負(fù)載條件下如何運(yùn)行的持續(xù)反饋。總是有很多用戶在生產(chǎn)環(huán)境中使用某個(gè)功能,即使這一功能不能滿足他們期望的性能,他們也不會(huì)質(zhì)疑它,而且會(huì)假設(shè)它是正確的,當(dāng)用戶可以同時(shí)從多個(gè)位置訪問時(shí),這可能是一個(gè)大問題。因此,如果想提高應(yīng)用程序的性能,就必須讓最終用戶參與進(jìn)來,以獲得關(guān)于應(yīng)用程序或系統(tǒng)在生產(chǎn)環(huán)境中性能的持續(xù)反饋。當(dāng)然,與最終用戶的交互需要時(shí)間和精力,盡管如此,為了使產(chǎn)品/應(yīng)用提供最佳性能,這絕對是值得的。
2. 不關(guān)注性能目標(biāo)
設(shè)定目標(biāo)是確定系統(tǒng)性能的最重要方面之一。許多團(tuán)隊(duì)經(jīng)常無法實(shí)現(xiàn)他們的性能目標(biāo)以求改進(jìn),于是花費(fèi)了大量時(shí)間修復(fù)系統(tǒng)中現(xiàn)有的和隱藏的性能問題。性能測試的完美目標(biāo)應(yīng)該在最現(xiàn)實(shí)的條件下定義、設(shè)計(jì)和執(zhí)行,比如真實(shí)的瀏覽器、設(shè)備和多個(gè)地理位置。確定正確的指標(biāo)來監(jiān)控,定義每個(gè)指標(biāo)的最小閾值,執(zhí)行性能測試來得到基線結(jié)果,所有這些數(shù)字對于確定什么樣的變化可以創(chuàng)造性能改進(jìn)是必要的。在軟件開發(fā)生命周期中盡早開始性能測試是一種很好的做法,可以首先消除瓶頸,并確保在用戶負(fù)載很重的情況下不斷檢查應(yīng)用程序的性能。
3. 不清晰及不完整的非功能性需求
收集完整的非功能性需求比功能性需求更復(fù)雜,因?yàn)樗鼈儽灰暈榈诙惿踔恋谌愋枨?。因此,它們?jīng)常被誤解和忽視,只有少數(shù)組織將非功能性需求作為一等公民。這會(huì)在系統(tǒng)架構(gòu)/設(shè)計(jì)中導(dǎo)致嚴(yán)重的問題,經(jīng)常導(dǎo)致項(xiàng)目崩潰和網(wǎng)站崩潰,使系統(tǒng)無法使用。在大多數(shù)情況下,非功能性需求文檔不完整、不一致,或者在大多數(shù)不成功的項(xiàng)目中不存在。性能測試第一步是對應(yīng)用程序/系統(tǒng)進(jìn)行可行性分析,并創(chuàng)建一組明確的非功能性需求。一個(gè)可靠的非功能性需求文檔將確定產(chǎn)品/應(yīng)用具有最佳性能的所有標(biāo)準(zhǔn)。此外,還需要:
- 為產(chǎn)品/應(yīng)用和系統(tǒng)建立明確的性能目標(biāo)和期望
- 必須讓所有人(開發(fā)團(tuán)隊(duì)、QA、管理團(tuán)隊(duì)、 DBA、涉眾和業(yè)務(wù)團(tuán)隊(duì))達(dá)成一致。
- 在技術(shù)團(tuán)隊(duì)、項(xiàng)目團(tuán)隊(duì)和業(yè)務(wù)團(tuán)隊(duì)之間建立溝通,以了解生產(chǎn)環(huán)境中最終用戶的實(shí)際性能問題
- 使用分析工具,獲取生產(chǎn)流量統(tǒng)計(jì)數(shù)據(jù),以創(chuàng)建合適的工作負(fù)載模型
- 在收集非功能性需求時(shí),了解應(yīng)用程序/產(chǎn)品的體系結(jié)構(gòu)、設(shè)計(jì)、問題和現(xiàn)有的性能問題
- 非功能性需求應(yīng)該從軟件開發(fā)過程的開始并在整個(gè)生命周期中進(jìn)行討論; 如果應(yīng)用程序是全新的,基線和基準(zhǔn)測試對于性能測試是必要的。
- 獲取所有涉及的內(nèi)部和外部組件的完整信息,并了解它們?nèi)绾瓮ㄐ?CDN、防火墻、 DNS、負(fù)載均衡器、服務(wù)器、網(wǎng)絡(luò)和系統(tǒng)、緩存等)
- 了解應(yīng)用程序內(nèi)存占用和第三方體系結(jié)構(gòu)限制
- 與涉眾和業(yè)務(wù)團(tuán)隊(duì)交談,以了解目標(biāo)并確定什么是基本的、現(xiàn)有的遺留系統(tǒng)性能問題、平臺(tái)約束和競爭對手。
- 有必要記錄所有內(nèi)容,并讓業(yè)務(wù)和其他涉眾一起參加會(huì)議,以確定現(xiàn)有的非功能性需求是否合適,并就定義的 SLA 達(dá)成一致。
4. 糟糕的架構(gòu)設(shè)計(jì)
最初,糟糕的架構(gòu)設(shè)計(jì)只會(huì)導(dǎo)致一些小問題,這些問題在開始時(shí)會(huì)比較少,但是會(huì)逐漸累積起來。簡單維護(hù)是一個(gè)挑戰(zhàn),在一個(gè)區(qū)域中的任何更改都會(huì)破壞應(yīng)用程序的其他部分。如果在架構(gòu)設(shè)計(jì)階段作出了不恰當(dāng)?shù)臎Q定,應(yīng)用/系統(tǒng)可能會(huì)出現(xiàn)嚴(yán)重的性能下降,導(dǎo)致過多的網(wǎng)絡(luò)延遲和其他問題。由于不了解明確定義的系統(tǒng)架構(gòu),在負(fù)載測試執(zhí)行階段會(huì)存在太多不確定性和復(fù)雜性的高風(fēng)險(xiǎn),這可能會(huì)給性能測試和工程團(tuán)隊(duì)帶來意想不到的性能問題。在軟件開發(fā)生命周期的應(yīng)用程序設(shè)計(jì)和開發(fā)階段,由于性能方面的挑戰(zhàn),軟件發(fā)布可能會(huì)推遲。
5. 對技術(shù)依賴缺乏預(yù)見
依賴關(guān)系是允許更多應(yīng)用和功能組件之間的連接。特定的操作系統(tǒng)版本、應(yīng)用服務(wù)器、數(shù)據(jù)庫服務(wù)器或 Java 虛擬機(jī)、通用語言運(yùn)行庫和框架都是依賴關(guān)系的例子。然而,有些依賴關(guān)系更為復(fù)雜,比如由 Linux、 Java 中的各種包組成的依賴關(guān)系,以及 Python 和 Ruby 等腳本語言組成的依賴關(guān)系。理解每個(gè)技術(shù)在設(shè)計(jì)和基礎(chǔ)設(shè)施方面對每個(gè)組件的依賴性,使用哪些技術(shù),以及使用哪些框架和工具來開發(fā)應(yīng)用程序,對于系統(tǒng)性能來說,以期望的結(jié)果完成性能測試是至關(guān)重要的。
6.新功能的過度擴(kuò)展
過度的新功能擴(kuò)展是軟件開發(fā)人員經(jīng)常遇到的一個(gè)主要障礙。處理這種情況的有效方法是定期舉行面向用戶體驗(yàn)的會(huì)議和討論,每個(gè)團(tuán)隊(duì)成員都參與其中,以驗(yàn)證每個(gè)功能,并確保它有意義地解決了設(shè)定的問題。性能測試團(tuán)隊(duì)必須從規(guī)劃發(fā)布的時(shí)間表開始,并且應(yīng)該主動(dòng)地公布需要的時(shí)間,以防在發(fā)布前的最后一分鐘添加任何新功能。如果項(xiàng)目有一個(gè)固定的最后期限,就需要提前計(jì)劃環(huán)境需求,以確保意外的環(huán)境延遲不會(huì)影響性能測試的進(jìn)度。如果在最后一刻繼續(xù)添加了新功能,交付的質(zhì)量大概率會(huì)受到影響。最終,客戶可能會(huì)拒絕最終的可交付成果,從而產(chǎn)生返工和額外資源短缺的情況。
7. 推崇好大喜功
在性能測試執(zhí)行的最初版本中,直接關(guān)注目標(biāo) SLA 以達(dá)到可接受的限制可能是不現(xiàn)實(shí)的。性能測試是一個(gè)迭代過程,需要大量持續(xù)的性能測試來識別和消除所有的性能瓶頸。需要花費(fèi)額外的時(shí)間優(yōu)化每一行代碼和組件,以提高系統(tǒng)/應(yīng)用程序的性能。在性能測試中,每個(gè) SLA 和 KPI 都是必要的,并且只有通過持續(xù)的性能測試、代碼分析、內(nèi)存分析、性能工程、監(jiān)控以及客戶端和服務(wù)器端的調(diào)優(yōu)才能獲得所需的響應(yīng)時(shí)間、吞吐量、網(wǎng)絡(luò)延遲和資源利用率,這有時(shí)需要花費(fèi)很長的時(shí)間。分析所有的性能結(jié)果和降低,并從用戶級、操作系統(tǒng)級、系統(tǒng)級、網(wǎng)絡(luò)級和服務(wù)器級使用適當(dāng)?shù)闹笜?biāo)收集數(shù)據(jù),對所有導(dǎo)致性能問題根本原因的分析是至關(guān)重要的。
8. 容量規(guī)劃的匱乏
許多基礎(chǔ)設(shè)施未能實(shí)施有效的規(guī)劃,簡單地說,容量規(guī)劃過程并不簡單直接。我們可以創(chuàng)建一個(gè)場景、添加流量、評估結(jié)果、解決性能問題,然后重復(fù),直到滿意為止,但是實(shí)際的問題往往伴隨著糟糕的容量規(guī)劃。糟糕的容量計(jì)劃增加了性能缺失的可能性,風(fēng)險(xiǎn)會(huì)完全暴露,最終導(dǎo)致失敗。所有這些都可以通過仔細(xì)的容量規(guī)劃來適當(dāng)解決。來自基礎(chǔ)設(shè)施領(lǐng)域的系統(tǒng)工程師、來自數(shù)據(jù)庫領(lǐng)域的DBA和來自應(yīng)用程序開發(fā)領(lǐng)域的程序員是最需要參與有效容量規(guī)劃過程的三類人。許多人有時(shí)會(huì)將容量管理與容量計(jì)劃混淆,不能準(zhǔn)確地預(yù)測和錯(cuò)誤預(yù)測未來的工作負(fù)載。需要確保識別準(zhǔn)確的資源需求(CPU、內(nèi)存、磁盤空間和網(wǎng)絡(luò)帶寬) ,以支持當(dāng)前和未來增加的工作負(fù)載,以滿足業(yè)務(wù)需求并避免容量規(guī)劃失敗。使用正確的度量標(biāo)準(zhǔn)進(jìn)行持續(xù)監(jiān)控將幫助我們進(jìn)行有效的容量規(guī)劃,并且還有助于處理流量增加后未預(yù)料到的工作負(fù)載。
9. 性能問題沒有完全解決
當(dāng)應(yīng)用的用戶量增加時(shí),往往會(huì)看到更多的性能問題。隨著時(shí)間的推移,系統(tǒng)中隱藏的性能問題和已知的性能問題是導(dǎo)致性能持續(xù)下降的主要原因。必須與項(xiàng)目中的每個(gè)團(tuán)隊(duì)成員討論確定的每個(gè)瓶頸,以成功地確??蛻?SLA 的性能。當(dāng)涉及到性能問題時(shí),每一秒都很重要,如果忽略現(xiàn)有的性能問題,系統(tǒng)將會(huì)變慢,甚至更糟。例如,某些服務(wù)可能會(huì)停止在嚴(yán)重超載的服務(wù)器上運(yùn)行,從而使應(yīng)用程序無法訪問。找出監(jiān)控?cái)?shù)據(jù),檢查服務(wù)的健康狀態(tài),一般就能找出性能問題的常見原因。
10. 方法論的缺失
缺乏合適的方法來建立性能測試策略及其覆蓋范圍的話,會(huì)很難獲得有效的性能測試結(jié)果。理解性能測試方法和過程將幫助團(tuán)隊(duì)中的每個(gè)工程師,特別是當(dāng)性能問題出現(xiàn)時(shí),為每個(gè)發(fā)生問題的瓶頸提供正確的修復(fù)。性能測試過程應(yīng)該有良好的計(jì)劃和定義,并且文檔化。好的文檔可以在開發(fā)人員、 DBA和QA之間建立有效的溝通。隨著軟件變得更加復(fù)雜和多元化,并且有越來越多的平臺(tái)和位置需要測試,需要有一個(gè)強(qiáng)有力的性能測試方法,以確保正在開發(fā)的軟件系統(tǒng)經(jīng)過充分的性能測試,以確保它們滿足特定的業(yè)務(wù)要求,并且能夠在所有預(yù)期的負(fù)載條件和環(huán)境中高性能地運(yùn)行。