一船老、性能測試指標和測試方法
- 性能指標
- 響應(yīng)時間
從發(fā)出請求開始到收到最后響應(yīng)數(shù)據(jù)所需要的時間 - 并發(fā)數(shù)
是指系統(tǒng)同時處理請求的數(shù)目 - 吞吐量
單位時間內(nèi)系統(tǒng)處理的請求數(shù)量 - 性能計數(shù)器
描述服務(wù)器或操作系統(tǒng)性能的一些數(shù)據(jù)指標,包括System Load娇钱、對象與線程數(shù)悦施、內(nèi)存使用并扇、CPU使用、磁盤與網(wǎng)絡(luò)I/O等指標抡诞。 - 性能測試方法
- 性能測試
- 負載測試
- 壓力測試
- 穩(wěn)定性測試
二穷蛹、Web前端性能優(yōu)化
2.1 瀏覽器端
- 減少HTTP請求
主要手段是合并CSS、合并JavaScript昼汗、合并圖片 - 使用瀏覽器緩存
通過設(shè)置HTTP頭中的Cache-Control和Expires屬性肴熏。通過對靜態(tài)文件改名并更新Html中的引用實現(xiàn)。 - 啟用壓縮
在服務(wù)器端對文件進行壓縮顷窒,在瀏覽器端對文件進行解壓縮蛙吏,可有效減少通信傳輸?shù)臄?shù)據(jù)量。但壓縮會對服務(wù)器和瀏覽器產(chǎn)生一定壓力蹋肮,需要權(quán)衡出刷。 - CSS放在頁面最上面,JavaScript放在頁面最下面
- 減少Cookie傳輸
一是靜態(tài)資源不要攜帶Cookie坯辩,而是盡量減小Cookie本身攜帶的數(shù)據(jù)量馁龟。
2.2 使用CDN加速
主要將靜態(tài)資源(如圖片、文件漆魔、CSS坷檩、JavaScript、靜態(tài)網(wǎng)頁等)放在網(wǎng)絡(luò)服務(wù)提供商的本地機房中進行緩存
2.3 使用反向代理服務(wù)器
傳統(tǒng)代理服務(wù)器位于瀏覽器一側(cè)改抡,代理瀏覽器將HTTP請求發(fā)送到互聯(lián)網(wǎng)上矢炼。而反向代理服務(wù)器位于網(wǎng)站機房一側(cè),代理網(wǎng)站的Web服務(wù)器接受HTTP請求阿纤,來自互聯(lián)網(wǎng)的所有訪問請求必須經(jīng)過代理服務(wù)再到達應(yīng)用服務(wù)器句灌。
反向代理可以實現(xiàn)的三個作用:
- 保護網(wǎng)站安全:相當于在Web服務(wù)器和可能的網(wǎng)絡(luò)攻擊之間建立了一個屏障
- 緩存:當靜態(tài)內(nèi)容第一次被訪問后,就將靜態(tài)內(nèi)容緩存在反向代理服務(wù)器上,之后相同的靜態(tài)內(nèi)容請求可以直接從反向代理服務(wù)器返回胰锌,不必再到達應(yīng)用服務(wù)器骗绕。也可以將像熱門詞條、帖子资昧、博客等動態(tài)內(nèi)容緩存在反向代理服務(wù)器上酬土。
- 實現(xiàn)負載均衡
三、應(yīng)用服務(wù)器性能優(yōu)化
3.1 分布式緩存
緩存的基本原理
緩存是指將數(shù)據(jù)存儲在訪問速度較快的存儲介質(zhì)中(如內(nèi)存)格带。緩存的本質(zhì)是一個內(nèi)存Hash表撤缴,數(shù)據(jù)以一對key、value的形式存儲在內(nèi)存Hash表中--數(shù)據(jù)讀寫的時間復(fù)雜度為O(1)叽唱。
緩存主要用來存放讀寫比(大于2)高屈呕、很少變化的數(shù)據(jù)。合理使用緩存
①頻繁修改的數(shù)據(jù)不要放在緩存中棺亭;
②只緩存熱點數(shù)據(jù)凉袱。內(nèi)存有限,如果沒有熱點侦铜,大部分數(shù)據(jù)還沒有被再次訪問就被擠出緩存了专甩;
③應(yīng)用要容忍一定時間的數(shù)據(jù)不一致,如果數(shù)據(jù)更新后立即更新緩存钉稍,會帶來更多系統(tǒng)開銷和事務(wù)一致性問題涤躲;
④通過分布式緩存服務(wù)器集群提高緩存可用性
⑤緩存預(yù)熱
⑥準備好應(yīng)對緩存穿透(訪問的數(shù)據(jù)不在緩存中,直接落到數(shù)據(jù)庫上):一個簡單的對策是將不存在的數(shù)據(jù)也緩存起來贡未,value設(shè)為null种樱。分布式緩存架構(gòu)
分布式緩存是指緩存部署在多個服務(wù)器組成的集群中,以集群方法提供緩存服務(wù)俊卤。其架構(gòu)有兩種方式:
①以JBoss Cache為代表的需要更新同步的分布式緩存:
集群中的所有服務(wù)器中保存相同的緩存數(shù)據(jù)嫩挤,當某臺服務(wù)器有緩存數(shù)據(jù)更新的時候,會通知集群中的其他機器進行更新緩存會或清除緩存數(shù)據(jù)消恍。通常岂昭,將應(yīng)用程序和緩存部署在同一臺服務(wù)器上(應(yīng)用程序也是集群部署),應(yīng)用程序可以從本地快速獲取緩存數(shù)據(jù)狠怨。但由于數(shù)據(jù)同步的代價較大约啊,這種方案更多見于企業(yè)應(yīng)用中,很少在大型網(wǎng)站中使用佣赖。
②以Memcached為代表的不互相通信的分布式緩存:
緩存與應(yīng)用分離部署恰矩,應(yīng)用程序通過一致性Hash等路由算法來確定緩存數(shù)據(jù)存放的緩存服務(wù)器,然后遠程訪問獲取緩存數(shù)據(jù)憎蛤。緩存服務(wù)器之間不需要通信外傅,緩存集群的規(guī)模可以很容易地實現(xiàn)擴容,具有良好的可伸縮性萎胰。
Memcached的特點:簡單的通信協(xié)議彬碱;豐富的客戶端支持;高性能的網(wǎng)絡(luò)通信奥洼;高效的內(nèi)存管理;互不通信的服務(wù)器集群架構(gòu)晚胡;
3.2 使用消息隊列實現(xiàn)異步操作
使用消息隊列將調(diào)用異步化灵奖,可改善網(wǎng)站的擴展性,還可以改善網(wǎng)站系統(tǒng)的性能估盘。
主要體現(xiàn)在使用消息隊列進行削峰:通過異步處理瓷患,將短時間高并發(fā)產(chǎn)生的事務(wù)消息存儲在消息隊列中,從而削平高峰期的并發(fā)事務(wù)遣妥。但由于數(shù)據(jù)在后續(xù)的業(yè)務(wù)校驗擅编、寫數(shù)據(jù)庫等操作中有可能失敗,因此在使用消息隊列進行業(yè)務(wù)異步處理后箫踩,需要適當修改業(yè)務(wù)流程進行配合爱态。
3.3 使用集群
使用負載均衡技術(shù)構(gòu)建應(yīng)用服務(wù)器集群,將并發(fā)訪問請求發(fā)到多臺服務(wù)器進行處理境钟,避免單一應(yīng)用服務(wù)器因負載壓力過大而響應(yīng)緩慢锦担。
3.4 代碼優(yōu)化
多線程
①一臺應(yīng)用服務(wù)器上啟動多少線程合適?可供參考的估算公式:
啟動線程數(shù)=[任務(wù)執(zhí)行時間/(任務(wù)執(zhí)行時間-IO等待時間)]×CPU內(nèi)核數(shù)
②線程安全問題的解決手段
a.將對象設(shè)計為無狀態(tài)對象(如Java中的Servlet就是無狀態(tài)對象):無狀態(tài)對象是指對象本身不存儲狀態(tài)信息對象無成員變量或者成員變量本身也是無狀態(tài)對象慨削。(我覺得還有一種就是有狀態(tài)洞渔,但是狀態(tài)只能是一種,永遠不會改變)---不符合面向?qū)ο蟮乃枷耄?br> b.使用局部對象:在方法內(nèi)部創(chuàng)建對象缚态,這些對象會被進入該方法的每個線程創(chuàng)建磁椒,除非程序手動將對象傳遞給其他線程,否則不會出現(xiàn)對象被多線程并發(fā)訪問的情形玫芦。
c.并發(fā)訪問資源時浆熔,使用鎖。隨著操作系統(tǒng)和編程語言的進步桥帆,出現(xiàn)各種輕量級鎖蘸拔,使得運行期線程獲取鎖和釋放鎖的代價變小,但由于鎖導(dǎo)致線程同步順序執(zhí)行环葵,可能會對系統(tǒng)性能產(chǎn)生嚴重影響调窍。資源復(fù)用
主要有兩種方式:單例和對象池。
單例:使用同一個對象张遭。Spring默認構(gòu)造的對象都是單例邓萨。
對象池:比如線程池、連接池等可以理解為對象池,都由一個池來管理固定的幾個對象(可能有最大缔恳、最小值)宝剖,使用的時候從池里面拿出閑著的那個對象來用,用完還給池歉甚。數(shù)據(jù)結(jié)構(gòu)
靈活組合各種數(shù)據(jù)機構(gòu)改善數(shù)據(jù)讀寫和計算特性万细。垃圾回收
如果應(yīng)用運行在JVM等就有垃圾回收功能的環(huán)境中,那么垃圾回收可能會對系統(tǒng)的性能產(chǎn)生巨大影響纸泄。理解垃圾回收機制有助于程序優(yōu)化和參數(shù)調(diào)優(yōu)赖钞,以及編寫內(nèi)存安全的代碼。
3.5 存儲性能優(yōu)化
- 固態(tài)硬盤 vs 機械硬盤
- B+樹 vs LSM樹
- RAID vs HDFS