如何在短时间内快速提升网站响应速度
前言:
????????目的:我從事軟件性能優(yōu)化工作多年,想在此總結(jié)一下網(wǎng)站性能優(yōu)化的一些實(shí)戰(zhàn)經(jīng)驗(yàn)。
????????背景:當(dāng)你負(fù)責(zé)公司網(wǎng)站運(yùn)維時(shí)往往會(huì)遇到以下場(chǎng)景:領(lǐng)導(dǎo)要你維護(hù)一個(gè)開發(fā)人員趕工期開發(fā)出來(lái)的一個(gè)新網(wǎng)站。而新網(wǎng)站往往bug多,更沒(méi)有經(jīng)過(guò)什么性能優(yōu)化。網(wǎng)站上線以后用戶量一大,就會(huì)面臨請(qǐng)求慢、頁(yè)面卡頓等問(wèn)題。有時(shí)候甚至?xí)l(fā)服務(wù)器cpu、帶寬、內(nèi)存、硬盤等硬件設(shè)備滿載。這時(shí)候就需要你對(duì)這個(gè)網(wǎng)站進(jìn)行性能優(yōu)化。往往需要你:用最小的工作量、最短的時(shí)間、最少的代價(jià),最大程度地提升網(wǎng)站響應(yīng)速度。
????????本文所面向的受眾:本文描述的性能優(yōu)化手段適用于中、小型網(wǎng)站。因?yàn)槲夷壳熬S護(hù)的網(wǎng)站規(guī)模屬于日活越用戶量(DUA)在一萬(wàn)級(jí)別的中型網(wǎng)站規(guī)模。
????????性能優(yōu)化遵循的兩個(gè)原則:木桶效應(yīng)與二八定律
????????這是我總結(jié)的兩個(gè)原則,理解這兩個(gè)原則,可以幫助您在性能優(yōu)化過(guò)程中省時(shí)省力、抓住重點(diǎn)、有的放矢。畢竟每個(gè)人的時(shí)間精力有限,不要把它花在效益不高的地方~
????????木桶效應(yīng):
? ? ? ? 我們知道,一只木桶的盛水量,取決于桶壁上最短的那塊。同樣,一個(gè)軟件或網(wǎng)站的運(yùn)行流暢程度,取決于運(yùn)行速度最慢的環(huán)節(jié)。
????????舉例:一個(gè)網(wǎng)絡(luò)請(qǐng)求從發(fā)起到結(jié)束,一般要經(jīng)歷用戶操作頁(yè)面、瀏覽器發(fā)起請(qǐng)求、域名解析、HTTP\HTTPS請(qǐng)求、WEB服務(wù)器響應(yīng)請(qǐng)求(涉及cpu、內(nèi)存、數(shù)據(jù)庫(kù)等的運(yùn)行)、返回響應(yīng)數(shù)據(jù)、客戶端瀏覽器下載響應(yīng)數(shù)據(jù)并渲染數(shù)據(jù)。期間每個(gè)環(huán)節(jié)都可能成為短板,比如:短板可能是服務(wù)器硬件條件差、數(shù)據(jù)庫(kù)設(shè)計(jì)不合理、代碼組織不合理、視頻圖片文件太大加載慢等等因素。
????????木桶效應(yīng)告訴我們,性能優(yōu)化的“理想過(guò)程”往往是:先找出最短的短板,然后給他加長(zhǎng),然后再找下一塊最短的短板,再加長(zhǎng),循環(huán)往復(fù)。
????????二八定律:
????????生活中,世界上80%的財(cái)富掌握在20%的人手里。軟件中,一個(gè)軟件的性能由20%甚至10%的環(huán)節(jié)所決定。.
? ? ? ? 引用一段《.net 性能優(yōu)化》中Vance Morrison的話:一般來(lái)說(shuō),你的應(yīng)用程序中有超過(guò)90%的代碼對(duì)性能是不敏感的,它可以使用程序員生產(chǎn)力最大化的方式來(lái)編寫(盡可能使用最少、最簡(jiǎn)化、最容易的方式來(lái)編寫代碼)。然而,剩下的10%,則值得投入大量關(guān)注。編寫這部分代碼需要做出精細(xì)計(jì)劃,甚至需要在代碼編寫之前進(jìn)行。為了做出正確的計(jì)劃,必須收集數(shù)據(jù)(各類操作及類庫(kù)調(diào)用究竟有多快),為此需要測(cè)試工具(Profiler)。這些是所有高性能軟件項(xiàng)目的基石,務(wù)必留心。加入真正掌握了這些內(nèi)容,寫出高性能的軟件也不會(huì)是困難的事情。
????????舉例1:一個(gè)網(wǎng)站一定有常用功能和不常用功能,這些常用功能往往只占整個(gè)網(wǎng)站功能的20%甚至更少。
? ? ? ? 舉例2:一個(gè)軟件或網(wǎng)站,讀寫請(qǐng)求頻率比一般為 80%:20%。也就是說(shuō)一個(gè)網(wǎng)站,8成的資源開銷都花在數(shù)據(jù)查詢讀取上,2成開銷花費(fèi)在增刪改上。
????????二八定律告訴我們性能優(yōu)化時(shí)的重點(diǎn)應(yīng)該放在決定了80%資源開銷的這20%的功能代碼里。
實(shí)操篇:
? ? ? ? 接下來(lái),我在此,根據(jù)木桶效應(yīng)與二八定律,分享一下我再運(yùn)維時(shí)是如何快速優(yōu)化一個(gè)網(wǎng)站的性能的。以下是我梳理的性價(jià)比從高到低的性能優(yōu)化方案。
????????第一步:壓縮文本
? ? ? ? 什么是文本壓縮?一個(gè)網(wǎng)站,文本資源占用了很大一部分,前端html、css、js文件都是文本,前后端也都是通過(guò)json文本進(jìn)行請(qǐng)求和響應(yīng)。文本壓縮,可以最大程度地減少通過(guò)網(wǎng)絡(luò)傳輸?shù)淖止?jié)數(shù),所以使用文本壓縮是一個(gè)可以短時(shí)間內(nèi)快速提升網(wǎng)絡(luò)響應(yīng)速度的方式。文本壓縮分為:
? ? ? ? 1、請(qǐng)求與響應(yīng)數(shù)據(jù)的壓縮,即:json壓縮。 【?這是我使用的響應(yīng)壓縮方法(.NET版)】
? ? ? ? 2、前端靜態(tài)文件壓縮,即:css、js壓縮
????????為什么壓縮文本是第一步?
? ? ? ? 1、代碼性能優(yōu)化工作量小。統(tǒng)一修改少量代碼就可以實(shí)現(xiàn)對(duì)網(wǎng)站中所有文本的壓縮。
? ? ? ? 2、作用面廣。一個(gè)網(wǎng)站,可能成千上萬(wàn)的地方用到了文本。只要你花費(fèi)一次性精力做了文本壓縮,成千上萬(wàn)的地方統(tǒng)一都會(huì)被你一次性優(yōu)化掉。
? ? ? ? 3、效果顯著。zip壓縮率高,文本壓縮一般在80%以上。(類似于txt文件壓縮成zip包的效果)
? ? ? ? 4、顯著減少服務(wù)器帶寬、網(wǎng)絡(luò)壓力,但也會(huì)消耗少量cpu進(jìn)行壓縮。
????????第二步:壓縮圖片及視頻
? ? ? ? 1、對(duì)圖片和視頻本身做壓縮
? ? ? ? ? ? ? ? 1、對(duì)前端靜態(tài)圖片及視頻進(jìn)行壓縮。直接壓縮工具壓縮即可。注意:壓縮分為質(zhì)量壓縮和尺寸壓縮。
? ? ? ? ? ? ? ? ? ? ? ? a、圖片:
????????????????????????????????? ? ? ?1、質(zhì)量壓縮:【?這是我使用的批量圖片壓縮方式】
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、尺寸壓縮:根據(jù)業(yè)務(wù),對(duì)不同頁(yè)面的圖片進(jìn)行尺寸壓縮
? ? ? ? ? ? ? ? ? ? ? ? b、視頻:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1、質(zhì)量壓縮:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、尺寸壓縮:對(duì)一個(gè)項(xiàng)目中所有視頻進(jìn)行壓縮
? ? ? ? ? ? ? ? 2、對(duì)后端動(dòng)態(tài)上傳的圖片及視頻進(jìn)行壓縮。
? ? ? ? ? ? ? ? ? ? ? ? a、修改上傳接口代碼,在接口內(nèi)部對(duì)用戶上傳的圖片及視頻進(jìn)行壓縮
? ? ? ? ? ? ? ? ? ? ? ? b、對(duì)用戶已經(jīng)上傳的圖片及視頻進(jìn)行壓縮。直接拿圖片or視頻壓縮工具壓縮即可。
? ? ? ? 2、圖片or視頻列表頁(yè)面,使用縮略圖(thumbnail)代替原圖或者視頻。
????????第三步:將所有后端接口的響應(yīng)時(shí)間記錄到日志中
????????第四步:數(shù)據(jù)分頁(yè)
? ? ? ? 數(shù)據(jù)分頁(yè)是很常見的性能優(yōu)化
????????第五步:前端懶加載
????????
????????第六步:使用 Javascript 庫(kù) CDN
????????第七步: 數(shù)據(jù)庫(kù)使用索引
????????第八步:使用緩存
????????第九步:數(shù)據(jù)庫(kù)數(shù)據(jù)訪問(wèn)優(yōu)化:用【select (字段1,字段2,字段3) 】代替【select *】
????????第十步:開啟定時(shí)器定期對(duì)數(shù)據(jù)庫(kù)假刪除or老舊棄用數(shù)據(jù)or業(yè)務(wù)邏輯處理過(guò)程中的中間過(guò)程數(shù)據(jù)
????????第十一步:使用負(fù)載均衡
????????第十二步:使用多線程
? ? ? ? 1、后端在邏輯上可以進(jìn)行異步響應(yīng)的接口,可以使用異步:一個(gè)接口的主線程,在某個(gè)節(jié)點(diǎn)直接開啟子線程讓子線程去處理耗時(shí)操作,而主線程不必等候子線程的執(zhí)行結(jié)果,就直接返回響應(yīng)給前端。
? ? ? ? 2、特別耗時(shí)操作可以使用多線程并發(fā)完成任務(wù),最后把子線程的處理結(jié)果合并到一起,如循環(huán)體內(nèi)、圖像處理等等。
本文持續(xù)更新中...
總結(jié)
以上是生活随笔為你收集整理的如何在短时间内快速提升网站响应速度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity 如何实现批量修改图片格式
- 下一篇: html5 摇杆,分享一个虚拟摇杆,比较