分布式系統的效能優化方法

2021-10-01 15:08:38 字數 1674 閱讀 7623

本文主要記錄在分布式系統下優化的常用方法。

這句話似乎是廢話, 但是確實至關重要的。因為, 整個系統的效能瓶頸, 滿足木桶效應, 最短的那根木板決定了桶裡面能夠容納水的量。類似的, 系統的整體效能或者叫吞吐量, 取決於系統中效能最差的那個模組或者某個部分的**, 可能是幾個介面。

如果我們沒有找到正確的效能瓶頸, 盲目的憑藉經驗或者感覺去定位效能瓶頸點, 很有可能忙乎了好長一陣, 但是沒有任何提公升, 因為最短板的地方沒有任何修復。

定位效能瓶頸的方法簡單的**優化

這個是在比較新的系統中常出現, 之前知識關注與功能, 在第一次效能優化的時候, 會發現經常很小的改動就能提公升很多:

單執行緒的效能問題

在很多時候, 單執行緒意味著任務需要乙個接乙個的執行, 如果能夠將任務並行的分配到不同的執行緒來執行, 並且這些任務沒有相關性, 是能夠大幅度提公升效能的, 這也是在單機系統下最常用的效能優化手段。

由鎖引起的效能問題

多執行緒是提公升效能的利器, 但是如果執行緒的設計不合理的時候, 很可能會造成死鎖, 或者效能的嚴重下降。死鎖的問題相對容易發現, 因為一旦死鎖, 系統就完全卡住了。由互斥鎖引起的效能問題, 不是很容易發現, 因為他只是造成系統間過多的同步或者通知, 並不是太明顯。

因此設計多執行緒系統的時候, 一定要根據具體的業務場景, 設計合理的任務分發機制, 並且儘量減少執行緒之間的同步, 盡量染乙個執行緒完成整改任務。

模組間的通訊造成的效能問題

跨機器的程式一般通過tcp或者http協議來進行通訊, 網路通訊有很多的因素會影響到傳輸的效率, 比如,socket的設定, 我們需要盡可能的了解協議本身的機制, 然後根據我們的業務特徵去選擇不同的通訊方式。

資料庫引起的效能問題

一般的資料庫, 像mysql, mongodb, 他們本身的吞吐量是比較低的, 在對相應要求比較高的系統中, 盡可能採用redis-mysql或者redis-mongodb的方式來提公升效能, 當然, 需要重點關注資料一致性的問題。

如果,資料量沒有非常龐大的情況, 也可以考慮redis 集群作為儲存, 而不是快取, 來提公升系統效能。

另外, 當前的nosql也出現了好多年, 為資料庫的儲存提供了比較多的選擇, nosql通常去掉了rdb的很多限制條件, 效能相對於關聯式資料庫普遍高一些。

client-server模式, 盡量提公升server端的效能

在client-server模式下, 系統的吞吐量, 很大程度上取決於server端處理的速度。 提公升server的處理速度, 是乙個比較直觀地想法, 通常盡可能的實現非同步呼叫,非同步呼叫的好處就是可以盡可能快的響應客戶端,將呼叫本身的時間變成非同步。 但是, 可能的問題就是前段發過來的待處理訊息太多, 後端來不及處理, 因此通常需要評估後端的處理能力, 進行必要的流量控制。

還有一種提公升後端的處理能力, 就是後端的併發處理能力, 可能是想nginx那樣的啟動多個程序, 併發處理不同的請求, 也可以是多執行緒的模式來並行處理。

快取方式解決重複的呼叫

還有一種問題是需要重複地呼叫來獲得一些資訊, 比如檔案的屬性資訊, 而這些資訊其實變化很小, 大部分時間是相同的, 為了獲得實時的資料, 需要一次次的頻繁呼叫, 這種情況下, 可以將屬性資訊分成可變部分與不可變部分, 我們可以快取不變部分, 來減少呼叫的次數。

快取的使用, 分為本地記憶體快取和分布式快取, 比如redis。 本地快取,速度快簡單, 但是容量有限易丟失。

總之, 效能問題, 需要因地制宜, 問題不同處理的方式也不相同。

分布式 分布式系統的設計

在計算機領域,當單機效能達到瓶頸時,一般有兩種方式解決效能問題 而分布式系統的設計說白了就是 如何合理將乙個系統拆分成多個子系統部署到不同機器上。講設計方法前,先介紹分布式系統的特性 1 分布性 空間中隨機分布。這些計算機可以分布在不同的機房,不同的城市,甚至不同的國家。2 對等性 分布式系統中的計...

分布式效能測試

應用場景 單台測試機不能產生足夠的執行緒數,需要多台測試機協作測試伺服器效能 概念 分布式 多台測試機協作,以集群的方式共同完成測試任務 作用 產生海量併發 1,控制機制定測試任務,下發到執行機 2,執行機執行任務並將結果返回給控制機器 3,控制機做結果彙總 1環境搭建 步驟1.搭建物理環境 準備乙...

分布式系統漫談 拾肆 分布式系統常用優化思路

本文說說系統優化的常用手段吧,其中可能有一些內容在系列前面的文章裡已經總結過了,這裡還是再系統地整理出來,方便將知識彙總,有個整體上的認識。本文只講方 沒有具體實現。限於水平總結得可能不全,後面還會補充。本文將系統主要分為前端優化和架構優化兩個層面來說。前端優化 1.頁面優化 延遲載入 對一些還沒有...