網站訪問速度過慢的原因

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

一、針對這個題目我們可以簡單理解成是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服務器集羣,在服務器前面加一個負載均衡,負載均衡就是專門負責分發,把用戶的請求均勻分佈到各個服務器上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章