你真的知道如何定義效能要求麼?

2021-09-23 23:06:55 字數 2554 閱讀 3315

【編者按】本文作者是 nikita salnikov tarnovski,是 plumbr 的聯合創始人,作為一名高階開發者,他同時也是一位應用效能調優的專家,擁有多年的效能調優經驗。本文中他通過常見的效能需求誤區經驗,分享應該如何去設定實際的效能需求目標,本文系 oneapm 工程師編譯呈現。

以下為譯文:

「這個應用跑得太慢,你能讓它快起來嗎?」

——企業老闆這樣說道

如果你是個經驗豐富的工程師,對這種場景肯定不陌生,一聽到這種話,整個脊椎不寒而慄。筆者一直強調用「測量不猜測」的觀點處理效能優化問題。這意味著你要先明確經理所指的「快」是什麼。如果沒有這個定義,你可能永遠都會困在優化週期中,因為每個重大應用總能在某些方面得到改進,從而提高速度。

現實生活中,效能並非是亟待解決的唯一任務;為了提供最有價值的產品,我們應該知道什麼時候應該停止效能優化。更重要的是,我們應該清楚地知道我們的效能目標是什麼,並有乙個明確的規劃去實現之。

相對之前,企業老闆在表達軟體功能需求上已經有所進步。但在功能性需求之外——比如應用的可用性、相容性或效能——老闆心裡其實完全沒底。這個空白常常用「確保它夠快」這種模稜兩可的話,或者與下面類似的要求表達出來:

乍一看這些要求,你可能會覺得沒那麼糟。不再一直念叨著「快快快」,你現在至少有了乙個明確的目標,對吧?事實證明,上面的目標甚至比「快快快」的念叨更加糟糕。雖然它包含了一些可以設為終極目標的具體資料;但實際情況下,上述兩點要求最多只能作為提出更好優化問題的基礎。下面解釋這些要求的錯誤之處。

剩下的五個百分點要怎麼辦?如果將響應時間設為10秒,這個目標是否切合實際呢?連線超時也可以嗎?其實,你應該避免將時間設定為唯一目標,而是設定乙個可接受的延遲分布範圍。這個要求的另乙個問題是,它將所有的操作等同化。如果有95%的操作在4.9秒內反應,就萬事大吉了麼?即便這些操作的速度還可以更快?以下面這些操作為例:

顯示我當前的賬戶餘額:這個操作每天被執行數百萬次,也是每個零售客戶與銀行互動的第乙個問題。

顯示2023年的所有交易:每天僅有少數使用者執行該操作。

顯然,你需要區別對待不同的操作,對第乙個操作有更高要求,而第二次操作可以有更寬鬆的要求。因此,你應該為每個操作型別設定可接受的延遲時間分布,而不是對所有操作一視同仁。

你還應該將延遲需求與載入/吞吐量需求聯絡起來。因此在進行效能測量時,應該找出系統中的負載,並發掘有多少其他操作可以同時執行。然後用這些資訊來構建延遲需求。

精確延遲測量的層。是在終端使用者的環境中進行響應時間測量呢 (比如,瀏覽器呈現響應時或乙個安卓應用更新結果時)?還是當最後乙個位元組從伺服器端傳送後進行測量呢?

大多數軟體總是可以優化得更快,問題是它在經濟上是否可行。

最後,你應該確定哪些操作完全不用擔心延遲。批處理作業和非同步流程就是很好的例子。每月執行的批處理任務需要兩個小時來計算最終的信用卡餘額,不應該視為違反了5秒閾值。完整的會計 csv 報表通過電子郵件傳送得等到10分鐘後,屬於非同步編譯,也不應該視作違反標準。

當考慮真實併發性時,事情從模糊不清變得毫無意義,比如將「100個併發使用者」翻譯成「100次由100個執行緒併發處理的操作」。假設每乙個這樣的操作需要10秒的處理時間,那麼系統的吞吐量就是每秒10次操作。如果現在將操作時間減少十倍,每個操作只需1秒鐘,你就已經將吞吐量提高到100次操作/秒。然而,你並未實現 「100個真實併發使用者」的要求,只是併發處理10個操作,這意味著你未能滿足效能要求。

其實,在表達使用者的具體行為時,應該避免「併發使用者」或任何類似的術語,要求應該更加明確,盡量將這些描述轉化為可以模擬所需負載的負載測試。

需要注意,筆者並非建議你測量吞吐量。這其實沒多大用,因為現實生活中的應用通常是多功能的、應用於動態的狀況。所以很難明確表達出吞吐量的效能目標(每小時的操作量)。但是,如果乙個應用被特定設計為只實現乙個功能,例如發票支付,那麼,設定類似於「1000個發票/分鐘」的吞吐量目標,是非常好的可測量的具體目標。

容量規劃是你應該精確指定的另一重要效能需求。你的團隊是有望實現上文提到的目標——資料庫中容納一萬個帳戶和一千萬個事務?或者期望系統滿足一百萬個賬戶和十億交易這些條件?請明確系統中儲存的資料量。

別忘了明確有關基礎設施的經濟約束。你是否準備使用價值 500美元/月的 aws 實現你的效能要求?或者你能財大氣粗地在32核和幾 tbs 容量的高階配置上部署解決方案?知道這些問題的答案可以幫助你了解基礎設施能承受的效能目標。所以在確定效能需求之前,你應該明確基礎設施的限制。

在制定效能需求時,還應該考慮客戶的網路頻寬限制。網路頻寬是否能接受對操作傳送幾個 mbs 來回的要求?移動應用固然使用廣泛,但你不能指望每個客戶都使用全能的 4g 網路,所以應該構建一組離線操作,可以在本地進行處理,從而將流量從兆位元組轉換為千位元組。

本文所描述的各個方面還不夠完整。在可伸縮性和可用性方面,還有許多效能方面的考慮,可以引導你進一步完善需求。即便如此,你應該更仔細地審視模糊的效能需求,列舉出能落實到現實需要的問題。和企業老闆合作制定可測量的具體目標。否則,你就沒有真正的目標去實現並衡量結果。

通過這個過程,也可以了解相關的成本。企業老闆總是渴望更詳細地了解成本!如果你還記得,大多數軟體總是可以優化得更快,問題是它在經濟上是否可行。從企業所有者的角度來看,他們自然想讓所有操作都盡可能快。但只有當我們了解了實現目標的成本限制,才能設定更為現實的期望。

你真的知道如何定義效能要求麼?

編者按 本文作者是 nikita salnikov tarnovski,是 plumbr 的聯合創始人,作為一名高階開發者,他同時也是一位應用效能調優的專家,擁有多年的效能調優經驗。本文中他通過常見的效能需求誤區經驗,分享應該如何去設定實際的效能需求目標,本文系 oneapm 工程師編譯呈現。以下為...

你知道拔罐後,會怎樣麼?真的太嚇人了,看看吧!

拔火罐是祖先留給我們最健康 最原始的調理身體,預防疾病的方式,很多人在感覺自己身體不舒服的時候都會選擇去拔拔火罐,也知道拔完火罐後身上會留下一些罐印,但看看也就過去了,沒放在心上。熟不知,拔火罐的過程並不是最重要的,最害怕的是留在你身體上的罐印都代表了你身體有哪些亞健康問題你自己居然不知道!紫黑色 ...

老生常談!資料庫如何儲存時間?你真的知道嗎?

我們平時開發中不可避免的就是要儲存時間,比如我們要記錄操作表中這條記錄的時間 記錄轉賬的交易時間 記錄出發時間等等。你會發現這個時間這個東西與我們開發的聯絡還是非常緊密的,用的好與不好會給我們的業務甚至功能帶來很大的影響。所以,我們有必要重新出發,好好認識一下這個東西。我記得我在大學的時候就這樣幹過...