回到索引
效能層面:
我覺得效能分析的話要注意幾個要點:
不要去猜:對於自己寫的**你是否知道你的**要執行多久,是不是還在用時間相減來測試**執行時間?現在有很多自動化的工具可以在程式執行的時候,測試**中每一句語句的執行時間,可以有效分析出**的效能瓶頸。對於比較重要的業務邏輯建議採用類似的工具來進行效能分析,有的時候效能慢的**不一定是自己寫的還可能是框架內提供的,如果沒有乙個豐富的編碼經驗是不太可能知道這些點的,但是通過這樣的分析工具你就能知道這個地方會慢,雖然框架的**我們不能改,但是我們可以進行快取或者是可以換一種方法寫。打個比方你可能認為獲取當前機器的名字是很快的操作,但如果框架內部通過一定的作業系統介面訪問這個操作需要5毫秒的話就很誇張了,很可能這個操作在你整個請求中執行了10次獲取了10次機器名,那麼不知不覺50毫秒就耗去了,這個時候你還以為是資料庫慢,這就永遠找不到問題所在了(解決就相對簡單了只要快取機器名就好了)。因此,除了加點方式來測算**效能,更科學的是採用一些工具來測算,或許這個工具本身就是通過植入無數個加點**來實現這種測算,但這總比自己一次又一次手動改**來的好。總而言之,有一些效能問題不是你自己寫**引起的,或者是外部**或者是框架內的**,猜是猜不出來的。
注意區分優先順序:一般我們可以認為硬體由cpu、記憶體和io構成,其中io分網路和磁碟,不管是網路還是磁碟其效能是最差的也是最可能達到系統中效能瓶頸的地方,知道這一點我們就知道了效能分析的優先順序了,忽略資料庫層面、網路層面的問題把時間浪費和糾結在for/foreach的效能這種純語言層面的東西則不是那麼有效果。這裡舉幾個例子典型的立竿見影的效能相關的例子,同時也可以反映出通過一定的手段看到問題而不是去猜是多麼有效:
3. 注意觀察日誌:對於很多元件(比如mongodb),在其初始化的時候都會對系統基本的配置進行檢測,如果發現因為某個配置不合理元件無法達到最優會給出提示,因此要注意這些元件的日誌,以便及早發現效能問題。
雖然說某些工具可以幫助我們分析程式效能,但是有一些效能問題必定是在高壓力下才會產生的。很典型的就是為了執行緒安全使用的鎖,不管是程式層面的鎖還是資料庫層面的表鎖行鎖,鎖意味著序列,序列意味著在壓力增大的情況下壓力越大排隊越厲害越慢。當然,壓力測試還可能測試出因為多執行緒環境帶來的執行緒安全問題。系統整體的效能是受最差的那個點拖累的,如果系統各個模組抗壓能力差距很大的話,壓力測試比較容易測出問題。作為**開發我們應該有意識,對於普通的伺服器,一般每秒能處理多少請求,一般每秒資料庫能處理多少操作,有乙個熟練級的認識,如果你發現經過壓力測試,web伺服器每秒最大只能處理10個併發,那麼系統肯定存在效能問題的。壓力測試不但可以測試出系統的問題,還可以測試出一定的硬體條件下,系統可以承受的最佳的訪問人數在多少,低於這個人數系統跑不滿,超過這個人數系統的響應走下坡路,根據這個結果可以有理有據去選擇集群的數量。
簡單的辦法可以通過加點,然後把**灰度部署到某些機器檢視日誌來分析原因。
或者還可以直接到某台機器抓取程序樣本來做靜態分析(特別適合有虛擬機器的語言)。通過抓取乙個程序的樣本可以了解程序中哪些物件占用了絕大部分記憶體,垃圾**各個區的狀態來分析記憶體效能問題。通過抓取多個程序樣本可以比較哪些執行緒耗時比較厲害,耗時厲害多執行緒主要集中在執行什麼**來分析cpu效能問題。
除了這種內在的分析辦法還可以通過外部來分析,比如通過fiddler之類的工具來觀察慢是因為網路原因還是因為併發數的原因還是因為服務端的原因。比如通過資料庫的監控工具來監控每乙個sql語句的執行時間抓出最慢的sql。比如通過觀察虛擬機器的狀態,觀察作業系統的效能指標,觀察windows的效能計數器等可以幫助判斷大概存在的效能問題。
我的架構經驗小結(一) 常用的架構模型
經過這幾年的積累,在系統架構方面逐漸積累了一些自己的經驗,到今天有必要對這些經驗作個小結。在我的架構思維中,主要可以歸類為三種架構模型 3 n層架構 框架 外掛程式 架構 地域分布式架構。這是經典的多層架構模型,對於稍微複雜一點或特別複雜的系統,不使用分層架構是很難想象的。下圖是經典的3層架構 如今...
雲幫系列文章 技術架構說明
雲幫是按照面向服務的架構來設計的。目前大多數集群元件都是通過容器映象的形式發布和執行的。後續我們會將所有的元件都容器化,通過kubernetes集群保障元件的高可用。kubernetes負責容器的編排和排程,它的所有行為都是由應用引擎發起的。應用引擎將容器相關的操作都進行了封裝,雲幫通過抽象出了乙個...
MySQL系列文章(一)整體架構
mysql整體的體系架構圖有很多,這個圖就很形象的展示了大致的結構。mysql server自頂向下分為網路連線層 服務層 儲存引擎層和系統檔案層。1.1 網路連線層 主要提供與mysql伺服器建立連線的支援。1.2 服務層 快取 快取機制是由一系列小快取組成的。比如表快取 記錄快取 許可權花村 引...