漫畫:性能、可用性和鎖
經過了幾天的熟悉環境,小魚開始讓飛鳥嘗試負責解決一些問題。分配的第一個問題現象是這樣的:
接口有偶爾的超時現象。平時的時候接口可以在2s響應調用的上遊。但是偶爾會有幾次,超時特別嚴重,有時候20s、30s才返回。但是上遊的超時時間是10s。所以這時候上遊是拿不到結果的。對上遊來說這次請求失敗了。
飛鳥通過排查,找到了一些線索,就抱著電腦去找小魚。
接口超時造成的上遊請求失敗是一個可用性的問題。為了解決這個問題,就需要優化系統,提高響應速度,這是一個性能的問題。具體到問題裏,因為用到了鎖,對性能造成了影響。可以通過優化這個鎖性能來解決。即:
目標:
可用性
手段:
性能優化
抓手:
優化鎖性能
可用性和性能不同的人有不同的理解。
可用性一般指正常運行時間占總時間的百分比。對上遊來說,超時是一種不可用狀態。
性能是指系統或服務在具體事情的時候表現如何。嚴格來說可用性也是性能的一個指標。
對於單接口來說,接口不可用大體分為下面四個方面:
-
接口內部異常
這個多為系統bug,如常見的空指針NPE、內存泄漏等。
根據問題解決問題即可。
-
接口沒在限定的時間內返回
如今天的鎖等待導致的超時問題。
這個問題解決一般需要依賴監控數據,如各個鏈路調用的處理時間。根據各個環節耗時情況和處理邏輯進行相應優化。常用優化方式如:異步化、並行化、改造耗時邏輯等。
-
接口不提供服務
如接口被降級或者系統崩潰。
解決這個問題需要從系統和架構上考慮。
-
接口響應其他原因沒到達調用方
如被限流、網絡不通等。
解決這個問題系統要做好服務治理和全鏈路監控。
性能方面,今天就先說一下一些性能參考指標:
- 執行時間
一段代碼從開始運行到運行結束所使用的時間。
- CPU時間
(算法)函數或者線程占用CPU的時間。
- 內存分配
程序在運行時占用的內存空間
- 磁盤吞吐量
描述I/O的使用情況
- 網絡吞吐量
描述網絡的使用情況
- 響應時間
系統對某用戶行為或者動作做出響應的時間
最後說一下鎖,分布式鎖比傳統的線程鎖和進程鎖開銷要大很多,但是它解決了跨JVM來進行共享資源的訪問問題。目前主要有三種實現:
-
基於數據庫實現的分布式鎖
-
基於緩存實現的分布式鎖
-
基於zookeeper實現的分布式鎖
不管是哪種鎖,一旦用到鎖,就說明是阻塞式的。所以再並發度上一般來說都會比無鎖的情況低一點。鎖優化的思路和方法總結一下,有以下幾種:
-
減少鎖持有時間
-
減小鎖粒度
-
鎖分離
-
鎖粗化
-
鎖消除
關註靜兒公眾號,不定期漫畫技術推送~
本期內容:
漫畫:性能、可用性和鎖