1. 程式人生 > >網站訪問速度過慢的原因

網站訪問速度過慢的原因

問題場景:某個使用者向你反映說你開發的網站訪問速度很慢,但是該使用者訪問其他問題很正常,分析下原因、有哪些工具分析原因、怎麼解決問題?

一、針對這個題目我們可以簡單理解成是server端出現的問題,而不是client端出現了問題(使用者網路不好包括域名伺服器解析等可能),當然面試官要考你使用者端的知識,例如域名解析,也是有挺多可以考到的知識點,但單就這個問題,更強調的是server端的知識點。下面逐一來剖析可能的原因:

(1)可能的原因一:伺服器出口頻寬不夠用。這是一個很常見的瓶頸。一方面,可能是本身購買的伺服器出口頻寬就很小(企業購買頻寬相當昂貴),一旦使用者訪問量上來了,併發量大了,自然均分給使用者的出口頻寬就更小了,所以某些使用者的訪問速度就會下降了很多。另一個,就是跨運營商網路導致頻寬縮減,例如很多公司的網站(伺服器)是放在電信的網路上的,而如果使用者這邊對接的是長城或者說聯通的寬頻,運營商之間網路傳輸在對接時是會有限制的,這就可能導致頻寬的縮減。

(2)可能原因二:伺服器負載過大忙不過來,比如說CPU和記憶體消耗完了,這個容易理解,不展開。

(3)可能原因三:網站的開發程式碼沒寫好,例如MySQL語句沒有進行優化,導致資料庫的讀寫相當耗費時間。

(4)可能原因四:資料庫的瓶頸,也是很常見的一個瓶頸,這點跟上面第三個原因可以一起來說。當我們的資料庫變得愈發龐大,比如好多G好多T這麼大,那對於資料庫的讀寫就會變得相當緩慢了,索引優化固然能提升一些效率,但資料庫已經如此龐大的話,如果每次查詢都對這麼大的資料庫進行全域性查詢,自然會很慢。這個學過資料庫的話也是挺容易理解的。

二、針對上面可能的原因,有哪些方法和工具去檢測呢:

(1)某個使用者反饋網站訪問變慢,怎麼去定位問題。首先你自己也開啟下網站,看是否會出現使用者反映的問題,如果你這邊訪問沒問題,那就可能是使用者那邊的問題了,這塊就是要先確定是使用者那一方的問題還是自身比如說伺服器或者網站的問題。

(2)發現確實是自己伺服器或者網站的問題,那麼可以利用瀏覽器的除錯功能(一般瀏覽器都會有),除錯網路看看各種資料載入的速度,哪一項消耗了多少時間都可以看到,是哪塊資料耗時過多,是圖片載入太慢,還是某些資料載入老半天都查不出來。

(3)然後針對伺服器的負載情況,可以去檢視下伺服器硬體(網路頻寬、CPU、記憶體)的消耗狀況。頻寬方面檢視流量監控看是不是已經到了峰值,頻寬不夠用了,如果是公司自己買伺服器搭的網站伺服器的話,需要自己搭建監控環境;如果用的是阿里雲騰訊雲這些的,那這些平臺那邊會提供各方面的監控比如CPU、頻寬等等,在後臺就可以看到了。

(4)如果發現硬體資源消耗都不高,都比較充裕,那要去看看是不是程式的問題了。這個可以通過查日誌來找,比如

PHP日誌、Apache日誌、mysql日誌等等的錯誤日誌,特別如mysql有個慢查詢的日誌功能,可以看到是不是某條mysql語句特別慢,如果某條語句花的時間太長,那這條語句很有可能有問題。

(5)至於說到的資料庫太龐大,這個直接看就看得到了,比如一個表的檔案大小變得特別大了。

三、針對上面的這些問題,有哪些解決和優化的辦法呢:

(1)出口頻寬的問題,這個很簡單,加頻寬,有錢就多買頻寬,很簡單。

(2)mysql語句優化,開發人員職責。

(3)資料庫太龐大,為了讀寫速度,進行“拆表”、“拆庫”,就是把資料表或者資料庫進行拆分。

(4)上面的拆庫拆表都是針對資料庫實在太龐大才會這樣做,一般在此之前會有其他優化方法,比如mysql的主從複製,一臺主伺服器專門用於寫,然後其他從伺服器用來讀,寫完之後會同步更新到其他讀的伺服器中。例如阿里的雙十一活動,都不知道用了多少萬臺伺服器一起在扛著。

(6)還有這幾年用得比較多的非關係型資料庫,它使用了快取機制,它把資料快取到了記憶體,使用者訪問資料直接從記憶體讀取,讀取速度就比在磁碟中讀取快了很多,還有它的一個key-value讀取機制,這個聽師兄說之後沒聽懂。

(7)CDN(content-delivery-network:內容分發網路),雞蛋放在多個籃子裡,把資料放在離使用者更近的位置(例如網站的一些靜態檔案比如圖片或者js指令碼),使用者訪問時判斷IP來源是廣州,那就通過智慧DNS解析到廣州的伺服器上,直接從廣州的籃子裡去獲取資料,速度就快了。這裡有個靜態資料和動態資料的概念,例如圖片和一些js檔案一般是不變的,那就可以把它們的映像分佈到全國各地,加快速度,而一些需要在網站後臺動態產生的一些資料,則需要去到網站所在的伺服器去產生並得到。這個涉及到兩種資料的顯示的問題,這就交由瀏覽器處理了。同時非同步載入的技術例如前端的Ajax技術,非同步請求資料,可以使這些動態資料延遲載入,這塊自己不怎麼了解,可能表述不好。前端開發的人員應該更懂一些。

(8)上面都沒有說到架構的優化,如果網站扛不住,是不是網站架構已經不能適應了,比如做個小部落格把資料庫伺服器和web伺服器都用同一臺伺服器,那所有負載都在同一臺伺服器上了。但是訪問量上來扛不住了,就得加伺服器了,就得在架構上優化了,比如在資料庫上做叢集,在web伺服器上也做叢集,比如web伺服器叢集,在伺服器前面加一個負載均衡,負載均衡就是專門負責分發,把使用者的請求均勻分佈到各個伺服器上。