對于一個 Web 站點或是一個 APP 應(yīng)用來說,當用戶打開你的站點時,最在乎的并不是你提供的內(nèi)容有多么的吸引人、內(nèi)容質(zhì)量有多么高,因為此時用戶還沒看見你的提供的內(nèi)容,那么用戶最在乎的是什么呢?是你站點加載速度和訪問速度。
有研究表明,大多數(shù)用戶期望的網(wǎng)站加載時間是3秒,如果時間長過3秒,就會始流失57%的用戶。如果超過8秒,幾乎所有用戶會毫不猶豫的離開你的網(wǎng)站,這就是所謂的8秒原則。
隨著技術(shù)的日新月異,Web2.0的到來大大提高了網(wǎng)站與網(wǎng)民間之間的互動,可以提供直播、視頻、圖片等等多媒體方式,因此誕生了許多優(yōu)秀的門戶網(wǎng)站與企業(yè)網(wǎng)站。但是同時也帶來了很多問題,其中最大的問題就是網(wǎng)站訪問速度的問題,這個問題直接影響到網(wǎng)站的流量。
眾所周知,互聯(lián)網(wǎng)時代是一個流量為王的時代,誰掌握了流量誰就能賺錢。那么如何解決網(wǎng)站訪問慢的問題呢?
要解決網(wǎng)站為什么訪問慢,我們得了解,是什么原因會導(dǎo)致網(wǎng)絡(luò)訪問變慢,我總結(jié)下主要有以下幾點:
鏈路問題;
不同運營商之間互相訪問;
DNS 解析問題;
服務(wù)器系統(tǒng)存在瓶頸導(dǎo)致差導(dǎo)致的訪問慢;
程序問題的訪問慢。
鏈路問題
舉個例子,假設(shè)杭州的一個網(wǎng)友小李,他通過手機訪問一家圖片類的網(wǎng)站,但是這家網(wǎng)站的服務(wù)器是在北京,如圖所示:
他怎么訪問到這臺服務(wù)器的呢?首先,小李從他的設(shè)備打開瀏覽器訪問對應(yīng)的網(wǎng)站,此時數(shù)據(jù)就會從網(wǎng)卡將請求發(fā)出去,假設(shè)小李從客戶端連接的是WiFi,就會首先從WiFi對應(yīng)的路由器將數(shù)據(jù)轉(zhuǎn)發(fā)出去,然后經(jīng)過運營商的網(wǎng)絡(luò),這中間會經(jīng)過很多個大大小小的路由設(shè)備,最終將數(shù)據(jù)傳遞到對應(yīng)的網(wǎng)站服務(wù)器,如圖所示:
這就好比你從杭州買個高鐵票到北京,中間經(jīng)過很多個站點,比如上海站、山東站等,這一個一個的站點就可以理解為一個一個的路由器。需要注意的是,上圖所示的只是客戶端將數(shù)據(jù)發(fā)送給服務(wù)器的過程,那么服務(wù)器收到數(shù)據(jù)之后就會與客戶端建立經(jīng)典的TCP 握手,也就是收到客戶端發(fā)送的SYN標志位,然后會回復(fù)客戶端SYN+ACK,此時數(shù)據(jù)又從服務(wù)器對應(yīng)的機房出口路由器一層一層的返回給客戶端。一來一回,你是不是感覺這個過程很慢,事實上這確實是比較慢。但是網(wǎng)絡(luò)的傳輸速度還是比現(xiàn)實中坐高鐵快得多的,所以這個過程可能也就需要幾秒的時間。
眾所周知,2個不同路由器下的設(shè)備如果要進行通信,就必須要需要使用 IP 地址,在IPV4協(xié)議的報頭中有一個字段叫 TTL ,即Time To Live的縮寫,該字段指定IP包被路由器丟棄之前允許通過的最大網(wǎng)段數(shù)量。TTL的最大值是255,一般推薦值是64。這個值越大說明經(jīng)過的路由越多,延遲也就越大。
在IP數(shù)據(jù)包從源到目的的整個轉(zhuǎn)發(fā)路徑上,每經(jīng)過一個路由器,路由器都會修改這個TTL字段值,具體的做法是把TTL的值減1,然后再將IP包轉(zhuǎn)發(fā)出去。如果在IP包到達目的IP之前,TTL減少為0,路由器將會丟棄收到的TTL=0的IP包并向IP包的發(fā)送者發(fā)送 ICMP time exceeded消息。
比如我們要 ping 百度 從下面就可以看到 ttl 等于 54:
# ping www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=1 ttl=54 time=12.4 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=2 ttl=54 time=12.2 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=3 ttl=54 time=12.0 ms
64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=4 ttl=54 time=11.9 ms
不過,如果客戶端在請求時,中間某個路由器設(shè)備或網(wǎng)絡(luò)線路出現(xiàn)故障,那么就無法正常建立連接了。這個時候就會出現(xiàn)丟包,如果丟包率達到100%,就說明這個網(wǎng)站是完全無法訪問,我們可以通過 mtr 或traceroute 等命令來確認從客戶端到達目標網(wǎng)絡(luò)中間鏈路是否丟包是否延遲很大。
其中的Loss% 列如果對應(yīng)的行出現(xiàn)丟包率 100% 就說明該行對應(yīng)的IP 地址所在的路由設(shè)備出現(xiàn)問題,從而導(dǎo)致無法繼續(xù)將數(shù)據(jù)轉(zhuǎn)發(fā)出去了。
Keys: Help Display mode Restart statistics Order of fields quit
Packets Pings
Host Loss% Snt Last Avg Best Wrst StDev
1. ???
2. 10.206.48.65 0.0% 360 1.3 1.4 1.0 3.3 0.2
3. 115.238.120.149 0.0% 360 1.4 1.9 1.0 10.7 0.7
4. 115.238.120.101 0.0% 360 1.6 1.7 1.1 11.2 1.0
5. 220.191.200.243 0.0% 360 5.4 6.3 5.0 105.5 7.0
6. 202.97.33.161 36.5% 360 16.2 17.7 12.0 311.6 34.1
7. 202.102.73.150 0.0% 360 15.4 22.6 13.8 220.3 22.7
8. ???
9. 180.97.32.102 100.0% 360 24.7 30.3 14.3 91.1 16.8
10. ???
不同運營商之間互相訪問
還有一種情況就是不同運營商的網(wǎng)絡(luò)之間訪問也會導(dǎo)致訪問延遲變大,從而導(dǎo)致請求丟包或連接被拒絕。
在國內(nèi),不同運營商之間的網(wǎng)絡(luò)走的線路是不一樣的,假設(shè)小李是使用的中國移動的網(wǎng)絡(luò),而他訪問的目標網(wǎng)站是一個中國聯(lián)通的服務(wù)器,由于存在這種問題就會導(dǎo)致請求變得非常慢或直接無法訪問。
要解決這個問題就是服務(wù)器選擇BGP(邊界網(wǎng)關(guān)協(xié)議,Border Gateway Protocol)線路的機房, BGP是互聯(lián)網(wǎng)上一個核心的去中心化自治路由協(xié)議,它可以很好地解決不同運營商之間的訪問延遲大等問題。
DNS 解析問題
不同的DNS 服務(wù)器解析得到的 IP 結(jié)果是不一樣的。一般情況下,如果不主動配置,運營商會默認給客戶端分配一些運營商自己的 DNS 服務(wù)器,這些服務(wù)器由于更新緩存慢,也會導(dǎo)致無法訪問等情況出現(xiàn)。因此建議客戶端配置公共的 DNS 服務(wù)器,例如 114.114.114 等DNS地址。
服務(wù)器本身性能問題
如果服務(wù)器的訪問量過大,就會導(dǎo)致系統(tǒng) CPU、內(nèi)存、磁盤I/O、網(wǎng)絡(luò)I/O飆高,也會導(dǎo)致請求被中斷,從而無法正常請求無法被處理從而導(dǎo)致報錯,例如 HTTP 報 5XX 的錯誤。
應(yīng)用本身問題
如果一個網(wǎng)站服務(wù)器存在大量的圖片則會導(dǎo)致瀏覽器加載變慢,從而導(dǎo)致訪問慢,另外一些html文件或js css文件沒有經(jīng)過壓縮也會導(dǎo)致文件變大,從而導(dǎo)致加載時間變長,亦或者程序的某個方法寫的有問題導(dǎo)致請求時間過長等等。
我們可以通過例如Chrome等瀏覽器的開發(fā)者模式來確認到底是那些文件加載時間過長,從而針對性的進行優(yōu)化。
如何優(yōu)化?
那么怎么優(yōu)化呢?首先,可以通過配置 Web 服務(wù)器的緩存規(guī)則來實現(xiàn)對一些靜態(tài)資源進行緩存,從而達到快速訪問的效果。例如 nginx 中通過如下配置,實現(xiàn)將制定的文件進行緩存 30天。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 30d;
}
當文件被緩存后,請求就不會直接去磁盤獲取文件,從而減小 I/O 資源的消耗。
其次,可以配合 CDN 來實現(xiàn)加速,CDN 全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)。
CDN是構(gòu)建在網(wǎng)絡(luò)之上的內(nèi)容分發(fā)網(wǎng)絡(luò),依靠部署在各地的邊緣服務(wù)器,通過中心平臺的負載均衡、內(nèi)容分發(fā)、調(diào)度、緩存等功能模塊,使用戶就近獲取所需內(nèi)容,降低網(wǎng)絡(luò)擁塞,提高用戶訪問響應(yīng)速度和命中率。使用 CDN 可以大大降低客戶端到達服務(wù)器的網(wǎng)絡(luò)延遲。
另外,對系統(tǒng)進行監(jiān)控,判斷瓶頸在哪里并進行必要的升級或水平擴容,從而達到降低系統(tǒng)負載。
此外,服務(wù)端如果有多臺服務(wù)器,也可以針對不同運營商的請求使用 DNS 分發(fā)到不同的區(qū)域或不同的運營商從而達到降低負載以及解決不同運營商之間訪問慢的問題。
最后,可以對應(yīng)用程序本身進行檢查,比如是否是哪個方法或調(diào)用出現(xiàn)問題導(dǎo)致的訪問變慢。
作為碼一代,想教碼二代卻無從下手:
聽說少兒編程很火,可它有哪些好處呢?
孩子多大開始學習比較好呢?又該如何學習呢?
最新的編程教育政策又有哪些呢?