目錄:前端
1、網站性能測試算法
2、Web前端性能優化數據庫
3、應用服務器性能優化(重點)瀏覽器
4、存儲性能優化緩存
PS:本文爲《大型網站技術架構 & 核心原理與案例分析(李智慧 著)》一書的讀書筆記安全
// =======================================================================================性能優化
網站性能測試服務器
1、不一樣視角下的網站性能網絡
一、用戶視角:直觀視覺感覺數據結構
二、開發人員視角:響應延遲、吞吐量、併發處理能力等
三、運維人員視角:基礎設置資源利用率
2、性能測試指標
一、響應時間:請求從發出處處理完接收的時間
二、併發數:同時處理請求的數量,即同時提交請求的用戶數
三、吞吐量:單位時間內處理請求的數量
*:隨着併發數增大:系統吞吐量先逐漸增長到極限,以後反而降低;系統響應時間先是小幅上升,當吞吐量達到極限後快速上升
四、性能計數器:服務器監控指標,如CPU、內存、磁盤IO、網絡IO
3、性能測試(壓測)方法
*:不斷增長系統訪問壓力(併發請求數),以獲取系統性能指標數據
4、性能測試(壓測)報告
*:要可以反應壓測的系統性能曲線規律,閱讀者能評估系統性能是否能知足需求
// ===========================================================
Web前端性能優化
1、瀏覽器訪問優化
一、減小http請求:每次獨立的http請求的通訊和服務開銷都很昂貴,可經過合併CSS、JS、圖片等方式減小http請求數
二、使用瀏覽器緩存:經過設置http頭的Cache-Control和Expires屬性設定瀏覽器緩存,將CSS、JS、圖片等較少變動的資源緩存下來
三、啓用壓縮:文件壓縮可減小通信傳輸的數據量,文本壓縮率可達80%以上,但壓縮解壓會增長計算壓力(權衡)
四、CSS渲染放最上面,JS功能腳本放最下面:使用戶視覺感覺先已經看到頁面
2、CND加速
*:部署在網絡運營商機房,用戶請求路由的第一條就到達CND服務器,有效下降請求時間
3、反向代理
*:部署在網站機房內,用戶請求先到達反向代理服務器,有3個主要功能
一、加速Web請求:經過配置緩存功能來實現
二、安全:在用戶請求和應用服務器間創建一個屏障
三、負載均衡:均勻分發請求到應用服務器
// ===========================================================
應用服務器性能優化
1、分佈式緩存(memcache)
*:網站性能優化第必定律:優先考慮緩存
一、緩存的基本原理:本質爲內存Hash表
*:數據以Key、Value對形式存儲在內存Hash表中。經過Hash(Key)獲得HashCode,即Value對應內存的位置
二、合理使用緩存
*:不適合緩存的數據:頻繁修改(寫致使緩存中的數據失效)、沒有熱點、一致性要求高(緩存設有失效時間,這段時間內可能有髒數據)
*:緩存預熱:緩存剛起來時爲空數據,最好在使用前預加載數據庫數據
*:緩存雪崩:當緩存服務器崩潰時,全部請求會落到數據庫致使數據庫宕機。好的方法是使用分佈式緩存服務器提升緩存可用性
*:緩存穿透:不正確或者惡意的請求可能落在某個不存在的Key致使頻繁讀數據庫,一個簡單對策將不存在的Key也緩存起來
三、分佈式緩存架構
*:一種是以JBossCache爲表明的,每一個緩存服務器數據相同,需同步更新的分佈式緩存(不多用)
*:一種是以Memcache爲表明的,每一個緩存服務器數據部相同,之間不須要通訊的分佈式緩存。應用程序經過一致性Hash等路由算法選擇具體的緩存服務器
四、Memcache的特色
*:簡單的通行協議:TCP的,一套基於簡單文本的自定義協議(一個命令關鍵字+一組命令操做數,如get <key>)
*:豐富的客戶端程序:幾乎支持全部主流語言(由於通訊協議簡單)
*:高性能的網絡通訊:基於Libevent,提供穩定的長鏈接
*:高效的內存管理::簡單固定的內存空間分配,slab_class=>slab=>chunk
*:互不通訊的集羣架構:客戶端路由算法一致性Hash更成爲數據存儲伸縮性架構的範例
2、異步操做
*:使用消息隊列將調用異步化,可改善網站的擴展性
*:消息隊列:用戶請求發送給消息隊列後當即返回,再由消費隊列的消費者進程將消息異步寫入數據庫,具備很好的削峯做用
3、使用集羣
*:利用集羣解決高併發問題,前端用負載均衡技術將請求均勻分發到多臺服務器上(不僅僅侷限在應用服務器)
4、代碼優化
一、多線程
*:線程的優勢:比進程更輕量,佔用更少系統資源,切換代價更小
*:使用多線程的2個主要緣由:IO阻塞(阻塞時能夠調用其餘線程處理)和多CPU(最大限度使用CPU)
*:線程數估算公式:啓動線程數 = [ 任務執行時間 / ( 任務執行時間 - IO等待時間 ) ] * CPU核數
*:線程安全問題實質:多線程併發對某塊內存進行修改操做(對象、內存、文件、數據庫等)
*:線程安全問題解決思路:對象設計爲無狀態,使用局部變量,併發訪問加鎖等
二、資源複用
*:開銷較大的系統資源:數據庫鏈接,網絡Socket鏈接,線程,複雜對象等
*:資源複用的2個方法:單例模式和對象池,均可以防止沒必要要的建立和銷燬操做
三、數據結構和算法
*:靈活組合數據結構和算法優化程序執行復雜度,如Hash等
// ===========================================================
存儲性能優化
1、機械硬盤和固態硬盤
一、機械硬盤:每次訪問數據都須要移動磁頭臂(物理運動),故數據連續訪問和隨機訪問性能表現差異大
二、固態硬盤:沒有機械裝置,數據存儲於硅晶體中,有更好的性能。可靠性,性價比還有待提高,但逐步取代機械硬盤是早晚的事
2、B+樹和LSM樹
一、因爲機械硬盤具備快速順序讀寫,慢速隨機讀寫的特性,故應用程序選擇存儲結構和算法極爲重要
二、B+樹是一種專門針對磁盤存儲而優化的N叉排序樹,目前數據庫多采用兩級索引,樹的層次最多三層
三、LSM樹能夠看爲一個N階合併樹,數據寫操做都在內存中進行,目前許多NoSQL都採用LSM樹做爲主要數據結構
3、RAID和HDFS
一、RAID,即廉價磁盤冗餘陣列,主要是爲了改善磁盤訪問延遲,增長磁盤可用性和容錯能力(數據在多塊磁盤併發讀寫和數據備份)
二、HDFS,即分佈式文件系統,Hadoop的文件系統,系統在整個存儲集羣的多臺服務器上進行數據併發讀寫和備份