大型網站之高性能

大型網站技術架構之高性能

性能指標:

用戶角度:使用app或網站響應的快慢

開發角度: 吞吐量、響應時間、併發數以及系統資源利用情況

吞吐量:每秒處理的請求數,稱爲TPS或QPS

響應時間:從請求發送開始計時到獲取結果所花費的時間,例如從緩存中獲取數據所消耗的時間

併發數:有多少用戶同時請求數據

併發數和吞吐量以及響應時間都是有關聯的,當併發數增多時相應的吞吐量也會增大,但是響應時間會變大,當併發數增多到一定的時候,吞吐量達到一個極限值,系統負載也達到峯值了,當併發數再多時吞吐量就會一直降低直到系統崩潰,吞吐量爲0。

比喻: 車速就對應於響應時間,車子數量對應併發數,高速入口收取的費用對應吞吐量,當高速就一輛車時,速度很快,但是當車輛增多時,高速入口收取費用也會增多,由於車輛增多會出現部分擁堵從而導致車速降低了,當車輛數大到一定值時會導致車都堵在不動從而影響高速入口收取的費用,極端情況下堵到收費門口,從而收取費用爲0

性能測試

通過多線程模擬多個用戶併發訪問系統,不斷增加線程數對系統施加壓力,測試分爲三個階段:用jmeter工具

性能測試:增加併發數,觀察響應時間和吞吐量以及系統資源使用情況,吞吐量線性增加,此次測試一般能滿足需求的性能就可以,要想知道系統最大負載是多少(也就是系統最大承受的併發能力是多少)

負載測試:繼續增加併發數,觀察響應時間,吞吐量緩慢增長,隨着併發數增加,吞吐量會增大到一個臨界值,此時的併發數和吞吐量就係統最大承受能力

壓力測試:繼續增加併發數,此時吞吐量會逐漸下降,隨着併發數增加知道系統崩潰,此時併發數就爲系統承受的最大壓力值

性能優化

前端優化: 合併http請求來減少http請求、瀏覽器緩存、CDN和反向代理、啓用壓縮、減少cookie傳輸

應用程序:

1、緩存

緩存的數據滿足二八法則

緩存數據預熱、緩存雪崩、緩存擊穿

分佈式緩存(一致性hash 保證緩存可用性)

Memcached:由客戶端實現一致hash路由找到對應的緩存服務器

2、異步

主要通過消息隊列來實現異步通訊方式

降低響應:相比同步來說,異步方式可以快速響應客戶端請求

削峯:可以緩解大量流量給服務器造成的壓力

解耦:消息產生者完全不用關係消費者如何消費,也不必關心有哪些消費端,只需產生約定好的消息結構就行

3、集羣

擴容多臺機器,將原來流量分攤到各臺機器山,提高併發能力

4、代碼優化

  • 多線程:

對於CPU計算型線程數不要超過CPU核數,而對於I/O(磁盤、網絡)密集型,通過增加多個線程來提供系統吞吐量

保證線程安全:

使用無狀態的對象(沒有字段的對象)、使用局部對象、鎖同步

  • 對象服用(單例、對象池) 數據庫連接池、線程池、Socket連接池、複雜對象池

對於創建和銷燬對象是非常耗時和耗性能,提前創建好對象,用完歸還到池裏以便下次利用

  • 數據結構

一個好的數據結構對於處理大量數據時具有很好的性能,例如 快速查找可以使用hash表、求top K 使用堆

  • JVM GC調優

5、存儲性能優化

機械硬盤和固態硬盤

機械硬盤是同個馬達驅動磁頭在盤面移動進行讀寫數據,效率很慢,固定硬盤類似於內存通過硅晶體存儲數據,效率是機械磁盤的十倍左右,由於固態硬盤昂貴,現在普遍都是使用機械硬盤,順序寫和讀可以提高磁盤讀寫性能

B+樹是MySQL索引的存儲結構,爲了減少磁盤I/O次數,提高數據的讀寫效率,每個索引節點對應於磁盤中的一塊數據,一個int類型的索引,一個索引節點爲4kb 所以一個索引節點可以存放大概1000條記錄,如果3層的B+索引樹能表示近億條數據,也就意味着最多訪問2次磁盤,因爲根節點會一直駐留在內存中

LVM:當更新時對於B+樹結構最多需要訪問5次磁盤,最多3次從磁盤讀取數據到內存,一次通過主鍵索引掃描行數據,最後一次將更新數據寫入磁盤,磁盤很不適合隨機寫。爲了減少訪問磁盤次數,數據更新先更新內存中的索引結構,等到髒頁到了一定數量時再同步到磁盤中,這樣將多次寫合併成一次寫入,將隨機寫轉換成順序寫,極大提高寫入磁盤效率

冗餘磁盤陣列和分佈式文件系統(HDFS)

磁盤陣列有好幾種方案,RAID0 RAID1 … 目的就是提高磁盤讀寫效率和通過將數據寫入到多張磁盤上,冗餘的方式提高磁盤可用性

目前逐漸使用分佈式文件系統例如HDFS來取代了RAID方案

HDFS:
NameNode 名字節點服務 主要管理目錄名

DataNode 真實存儲數據節點服務,以塊爲單位存儲,默認64M

當向HDFS寫數據時,首先訪問的事NameNode服務,名字節點服務會根據當前數據節點存儲情況,分配對應數據服務節點給客戶端,然後將數據寫入到DataNode服務,DataNode服務會將數據同步到其他幾臺數據節點服務上,保證服務可用性

從HDFS讀取數據時,可以通過MapReduce 並行的從DataNode中獲取數據,提高讀取效率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章