網(wǎng)站負(fù)載能力和訪問速度優(yōu)化的常用技術(shù)總結(jié)
來源:易賢網(wǎng) 閱讀:1143 次 日期:2016-07-07 09:14:54
溫馨提示:易賢網(wǎng)小編為您整理了“網(wǎng)站負(fù)載能力和訪問速度優(yōu)化的常用技術(shù)總結(jié)”,方便廣大網(wǎng)友查閱!

組件分離

DNS負(fù)載均衡

不同的web內(nèi)容分布到不同的服務(wù)器上,并劃分子域,利用DNS將請求自然轉(zhuǎn)移到不同的服務(wù)器上。主要可以分為兩大內(nèi)容:

1.動態(tài)內(nèi)容,CPU、IO密集型

2.靜態(tài)內(nèi)容,IO密集型

通過在DNS中配置多個A記錄,將請求轉(zhuǎn)移到集群中不同的服務(wù)器,這有助于具有地域性問題的大型web站點(diǎn)上,DNS可以使用戶就近訪問相應(yīng)的web服務(wù)器。像BIND這樣的DNS服務(wù)軟件提供豐富的調(diào)度策略。但是,如果集群中的主機(jī)出現(xiàn)故障的話,需要更新DNS緩存,這通常需要一定的時間。另外,客戶端也可以通過設(shè)置host來繞開DNS調(diào)度。

跨域共享cookie:將cookie的范圍擴(kuò)大到父域。

HTTP重定向

通過使客戶端重定向,來分散和轉(zhuǎn)移請求壓力,比如一些下載服務(wù)通常都有幾個鏡像服務(wù)器。

分布式緩存

無法使用頁面級別緩存時,需要考慮直接緩存數(shù)據(jù),比如使用memcached作為緩存。此時,需要考慮并發(fā)寫memcached的問題。 另外,當(dāng)memcached橫向規(guī)模擴(kuò)大,服務(wù)器數(shù)量增加時,需要一種對應(yīng)算法,能夠使應(yīng)用程序知道應(yīng)該鏈接哪個memcached服務(wù)器(比如,取模運(yùn)算)。分布式緩存能夠自動重建緩存,不必?fù)?dān)心down機(jī)。

負(fù)載均衡

負(fù)載均衡就是將請求分散,這涉及到應(yīng)當(dāng)如何設(shè)計調(diào)度策略,以讓集群發(fā)揮最大的性能。當(dāng)集群中的主機(jī)能力相當(dāng)時應(yīng)當(dāng)盡量平均調(diào)度,能力不均時應(yīng)當(dāng)能者多勞。隨著問題的復(fù)雜,要時刻關(guān)注調(diào)度的性能,不要讓調(diào)度成為性能瓶頸。

反向代理負(fù)載均衡

反向代理服務(wù)器工作在HTTP層,類似代理服務(wù)器,與普通的代理服務(wù)器不同的是,服務(wù)器在代理的后端,而不是客戶端在代理的后端,這類似于NAT,只是NAT工作在網(wǎng)絡(luò)層。同樣是負(fù)載均衡,反向代理服務(wù)器強(qiáng)調(diào)“轉(zhuǎn)發(fā)”而不是“轉(zhuǎn)移”,因為它不僅要轉(zhuǎn)發(fā)客戶端的請求,還要轉(zhuǎn)發(fā)服務(wù)端的響應(yīng)。可以用作反向代理服務(wù)器的軟件有Nginx、lighttp、Apache,另外目前也有一些專業(yè)的代理轉(zhuǎn)發(fā)設(shè)備能夠工作在應(yīng)用層,例如A10。

使用代理轉(zhuǎn)發(fā)要注意以下問題:

由于反向代理的轉(zhuǎn)發(fā)特性,使得代理本身很可能成為性能瓶頸。一般對于CPU密集型請求,使用代理比較合適,如果是IO密集型的話,這種集群方式很可能無法發(fā)揮最大性能

在代理上要開啟健康檢查,及時發(fā)現(xiàn)集群中的故障機(jī),從而調(diào)整轉(zhuǎn)發(fā)策略,這通常比DNS方式實時性更好

黏滯會話:對于啟動session保存用戶信息,或者后端服務(wù)器使用動態(tài)內(nèi)容緩存的應(yīng)用,必須將用戶在一段會話中的的請求保持在同一臺服務(wù)器上。代理服務(wù)器一般支持類似的配置。然而,盡量不要使應(yīng)用過于本地化,比如可以使用cookie保存用戶數(shù)據(jù),或者分布式Session或分布式緩存。

IP負(fù)載均衡

字面上看,便是利用網(wǎng)絡(luò)層進(jìn)行請求轉(zhuǎn)發(fā),類似NAT網(wǎng)關(guān)。然而,使用網(wǎng)關(guān)轉(zhuǎn)發(fā)在帶寬上可能出現(xiàn)瓶頸,因為出口只有一個,所以出口的帶寬要求較高。Linux中的Netfilter模塊可以通過iptables的配置。比如:對外網(wǎng)端口8001的請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)某臺服務(wù)器,而對外網(wǎng)端口8002的請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)另一臺服務(wù)器。這種方式簡單易行,但是無法對調(diào)度做太多配置。LVS-NAT同樣是Linux中的在網(wǎng)絡(luò)層進(jìn)行轉(zhuǎn)發(fā)的方式,與Netfilter不同,它支持一些動態(tài)調(diào)度算法,比如最小鏈接、帶權(quán)重的最小鏈接、最短期望延遲等。

直接路由

直接路由是通過調(diào)度器修改數(shù)據(jù)包的目的MAC地址,轉(zhuǎn)發(fā)請求數(shù)據(jù)包,但是響應(yīng)數(shù)據(jù)包可以直接發(fā)送給外網(wǎng)的方式。這樣做顯而易見的好處就是無需擔(dān)心網(wǎng)關(guān)瓶頸,但是實際的服務(wù)器和調(diào)度服務(wù)器都需要鏈接在WAN交換機(jī)上,并且擁有獨(dú)立的外網(wǎng)IP地址。

這種方式的工作原理略微復(fù)雜:

首先每臺服務(wù)器都需要設(shè)置一個IP別名,這個IP別名是面向客戶端的一個虛擬IP,只有代理服務(wù)器對這個IP別名的ARP請求做出響應(yīng),這樣客戶端發(fā)給這個IP的請求包首先會到代理服務(wù)器。然后代理服務(wù)器將這個請求包的目的MAC地址填寫為實際服務(wù)器的MAC地址(通過某種調(diào)度算法決定目的服務(wù)器),由于目標(biāo)服務(wù)器也具有這個IP別名,因此,轉(zhuǎn)發(fā)過來的數(shù)據(jù)包能夠被實際的服務(wù)器接收并處理。最后由于數(shù)據(jù)包的源IP地址還是客戶端請求的IP地址,因此,實際的服務(wù)器將通過交換機(jī)直接將響應(yīng)包轉(zhuǎn)發(fā)給客戶端而無需通過代理服務(wù)器。

Linux下可以通過LVS-DR實現(xiàn)直接路由方式

IP隧道

IP隧道的意思是,調(diào)度器將原始的IP數(shù)據(jù)包封裝在新的IP數(shù)據(jù)包中,以實現(xiàn)調(diào)度,實際的服務(wù)器可以將響應(yīng)數(shù)據(jù)包直接轉(zhuǎn)發(fā)給用戶端。

共享文件系統(tǒng)

對于一些簡單的提供文件下載的服務(wù)(包括html中靜態(tài)資源等),自然要考慮利用集群來減壓,但是如何使這些資源在集群中的主機(jī)上同步呢。

NFS

一種方案是讓這些主機(jī)從同一個地方取數(shù)據(jù)。比如采用NFS(Network File System),基于PRC。這種方式簡單易行,但是由于NFS服務(wù)器本身的磁盤吞吐率,或者并發(fā)處理能力以及帶寬等問題,往往很有局限性。

冗余分發(fā)

另一個方案就是在主機(jī)上冗余存儲資源,這樣主機(jī)無需訪問共享文件系統(tǒng),只需讀取本地磁盤上的資源即可。但是這也帶來了一個同步的問題,如何同步這些數(shù)據(jù)呢:

主動分發(fā)式,還分為單級分發(fā)和多級分發(fā),分發(fā)可以借助SCP、SFTP、HTTP擴(kuò)展協(xié)議WebDAV

單級分發(fā):通過一次分發(fā),就達(dá)到目的,這樣的方案簡單易行,但是性能瓶頸會出現(xiàn)在磁盤壓力和網(wǎng)絡(luò)帶寬,難以擴(kuò)展

多級分發(fā):通過多次分發(fā),才達(dá)到目的地,這樣的方案能夠分散磁盤壓力和網(wǎng)絡(luò)帶寬壓力,而且容易擴(kuò)展,壞處是成本高

被動同步式容易理解,可以使用rsync,rsync同步時是根據(jù)最后更新時間進(jìn)行判定是否需要同步的條件的,因此,如果一個文件夾中有的文件數(shù)量太多的話,rsync掃描的時間就很長了,可以通過給文件夾設(shè)置最后更新時間,并合理的規(guī)劃文件目錄,來加快rsync的掃描時間。即使不使用rsync,自己開發(fā)同步程序也可以借助這樣的思想來提升性能。

分布式文件系統(tǒng)

分布式文件系統(tǒng)工作在用戶進(jìn)程層面上,它是一個管理文件的平臺,內(nèi)部維護(hù)冗余,檢索,追蹤、調(diào)度等工作,通常包含一個物理層面的組織結(jié)構(gòu)和邏輯層面的組織結(jié)構(gòu)。物理層面的組織結(jié)構(gòu)由分布式文件系統(tǒng)自行維護(hù),邏輯層面的組織結(jié)構(gòu)面向用戶。其中“追蹤器”起到了關(guān)鍵的作用。

MogileFS就是一個開源分布式文件系統(tǒng),用Perl編寫,包含追蹤器、存儲節(jié)點(diǎn)、管理工具,它使用MySQL分布式文件系統(tǒng)的所有信息、使用WebDAV實現(xiàn)文件復(fù)制。其他著名的還有Hadoop。

每個文件由一個key定義,需要讀取文件時,指定一個key,追蹤器會返回一個實際的路徑,在訪問這個地址即可獲得文件。甚至可以將這個key對應(yīng)的path用分布式緩存緩存起來,這樣可以減少追蹤器的查詢開銷,但這樣也會失去分布式文件系統(tǒng)的調(diào)度策略的優(yōu)越性。另外,可以利用支持reproxy的反向代理服務(wù)器(比如:Perlbal)讓路徑重定向的工作由反向代理服務(wù)器完成。

數(shù)據(jù)庫擴(kuò)展

1.主從復(fù)制,讀寫分離

這種方式是指利用數(shù)據(jù)庫的復(fù)制或鏡像功能,同時在多臺數(shù)據(jù)庫上保存相同的數(shù)據(jù),并且將讀操作和寫操作分開,寫操作集中在一臺主數(shù)據(jù)庫上,讀操作集中在多臺從數(shù)據(jù)庫上,對于讀取比寫更多的站點(diǎn)適合使用這種方式。如果不想在應(yīng)用程序?qū)用婢S護(hù)這種分離映射,那么可以使用數(shù)據(jù)庫反向代理來自動完成對讀寫的分離。

2.垂直分區(qū)

對于不需要進(jìn)行聯(lián)合查詢的數(shù)據(jù)表可以分散到不同的數(shù)據(jù)庫服務(wù)器上,這稱為垂直分區(qū);當(dāng)然每個分區(qū)自身也可以使用讀寫分離。

3.水平分區(qū)

將同一個表的記錄拆分到不同的表甚至是服務(wù)器上,稱為水平分區(qū),這往往需要一個穩(wěn)定的算法來保證讀取時能正確從不同的服務(wù)器上取得數(shù)據(jù),比如簡單的對ID取模、范圍劃分、亦或者是保存映射關(guān)系。 也可以使用類似代理的產(chǎn)品spock。

緩存

構(gòu)建高性能web站點(diǎn)時,拋開基礎(chǔ)架構(gòu)(數(shù)據(jù)庫分區(qū)的問題也包括在基礎(chǔ)架構(gòu)中了),在應(yīng)用程序、編碼層面主要要考慮的問題就是緩存的設(shè)計,合理的緩存設(shè)計可以使提供動態(tài)網(wǎng)頁服務(wù)的網(wǎng)站性能大幅度提高。當(dāng)然,在架構(gòu)階段設(shè)計緩存解決方案,絕非簡單的技術(shù)問題,需要從業(yè)務(wù)出發(fā),再結(jié)合各種技術(shù)。下面按照一次HTTP請求的順序,對每個環(huán)節(jié)的緩存設(shè)計從技術(shù)角度進(jìn)行討論。

1.客戶端緩存

可以利用客戶端瀏覽器的緩存機(jī)制,來減少瀏覽器對服務(wù)端的請求次數(shù)(當(dāng)然在服務(wù)端進(jìn)行圖片等資源合并,并結(jié)合css圖片定位技術(shù),也可以減少HTTP請求),利用好HTTP的緩存協(xié)商,可以設(shè)計出靈活的客戶端緩存方案。在HTTP頭中下面的內(nèi)容與緩存協(xié)商有關(guān):

Last-Modified:動態(tài)頁面通過主動推送該值,暗示瀏覽器在下次請求同一個url的時候,優(yōu)先使用If-Modified-Since值與服務(wù)端進(jìn)行緩存協(xié)商,如果緩存沒有過期,那么服務(wù)端可以不用重新計算動態(tài)網(wǎng)頁,通過返回304通知瀏覽器。網(wǎng)站的靜態(tài)資源往往使用這種方法。但是該方法有一個缺點(diǎn):有時,文件的最后更改時間雖然改了,但是內(nèi)容卻沒有變,這樣無法充分發(fā)揮瀏覽器緩存的能力。

ETag:Web服務(wù)器為每個url生成一個散列值,增加在HTTP頭的ETag標(biāo)記中,瀏覽器會優(yōu)先使用If-None-Match加上這個散列值來協(xié)商緩存過期。通過對靜態(tài)文件的內(nèi)容進(jìn)行md5變換,可以生成散列值,這樣可以彌補(bǔ)Last-Modified的不足。但是隨之帶來的是服務(wù)端md5變換的計算開銷。

Expires:上述兩種方式,雖然可以使服務(wù)端多少避免了反復(fù)的動態(tài)網(wǎng)頁解析和計算,但瀏覽器還是必須通過HTTP請求來進(jìn)行協(xié)商,并沒有真正意義上減少請求的次數(shù)。通過在HTTP頭中添加Expires標(biāo)記可以明確的告知瀏覽器過期形式,瀏覽器會徹底減少請求的次數(shù)。

2.反向代理緩存

在web服務(wù)器前端,還有反向代理服務(wù)器緩存。反向代理服務(wù)器本質(zhì)上就是代理服務(wù)器,只是將外網(wǎng)的請求轉(zhuǎn)發(fā)給內(nèi)網(wǎng)的web服務(wù)器處理,他們都工作在應(yīng)用層,能夠理解HTTP協(xié)議。正向代理服務(wù)器具有HTTP緩存、HTTP過濾等功能,反向代理服務(wù)器同樣具有HTTP緩存的能力,而且還具備一定程度上的安全性。一切HTTP友好的動態(tài)程序同樣能夠很好的在反向代理服務(wù)器上實現(xiàn)緩存。重量級的squid、輕量級的varnish、甚至是Nginx這樣的web服務(wù)器軟件,都可以勝任反向代理服務(wù)。

上述的代理服務(wù)器軟件產(chǎn)品,通過各種配置可以緩存基于HTTP協(xié)議的web響應(yīng)。

3.Web服務(wù)器緩存

Web服務(wù)器有可能支持基于url的緩存(基于key-value對),這類似反向代理緩存。緩存通??梢酝ㄟ^配置存儲在內(nèi)存或磁盤上,在緩存有效期的問題上,通常是基于HTTP協(xié)議中的頭部信息判斷。但是使用這樣的機(jī)制需要注意:

動態(tài)程序會可能變得依賴于特定的web服務(wù)器 注意編寫面向HTTP緩存友好的動態(tài)程序,會使你的動態(tài)程序更有生命力 web 服務(wù)器還具有緩存文件描述符(類似句柄)的能力,這樣可以減少文件的open操作,同樣是一種減少系統(tǒng)調(diào)用的措施,這對于一些小文件有些效果,因為文件越小花在open上的開銷將越來越占有重要的比例。

4.應(yīng)用程序緩存

應(yīng)用程序本身可以對動態(tài)內(nèi)容進(jìn)行緩存,這可以體現(xiàn)在三個層面:

動態(tài)腳本緩存:每次腳本解析都需要消耗一定的時間,為了加快這個速度,一些服務(wù)器端腳本語言都支持動態(tài)腳本的預(yù)編譯,比如我們熟悉的ASP.NET、JSP都有所謂的中間語言,解析這些中間語言會快很多。

動態(tài)腳本框架支持的緩存:一些動態(tài)腳本框架支持緩存,同樣在選型的時候要關(guān)注一下這些框架的緩存機(jī)制和原理,比如緩存如何存放,過期如何設(shè)置,是否支持局部緩存等。

應(yīng)用程序自身實現(xiàn)緩存:應(yīng)用程序根據(jù)特定的業(yè)務(wù)需求獨(dú)立設(shè)計緩存。

在緩存設(shè)計的具體技術(shù)上有以下幾點(diǎn):

緩存在內(nèi)存,這種方式的優(yōu)點(diǎn)就是減少了磁盤的讀寫,但是內(nèi)存有限,單機(jī)不易擴(kuò)展。

緩存在分布式緩存,這種方式的優(yōu)點(diǎn)是減少了磁盤讀寫,并提高了可靠性和擴(kuò)展性,但是由于需要網(wǎng)絡(luò)IO,性能稍遜于單機(jī)緩存。

局部頁面緩存,對于一些頁面無法完整緩存的,可以考慮局部緩存。

靜態(tài)化,將網(wǎng)站靜態(tài)化可以極大的提高性能,因為用戶的請求不需要動態(tài)腳本處理。

服務(wù)器系統(tǒng)能力的制約因素:

這部分內(nèi)容對于所有的服務(wù)器(無論是代理服務(wù)器、web服務(wù)器還是其他),都具有普遍適用的意義。

多進(jìn)程、多線程的選擇和調(diào)度:進(jìn)程切換和線程切換都需要一定的系統(tǒng)開銷,通常使用多線程模型的web服務(wù)器軟件比使用多進(jìn)程,具備更優(yōu)的性能。

系統(tǒng)調(diào)用:一些需要從用戶模式切換到內(nèi)核模式的函數(shù)調(diào)用可以稱為系統(tǒng)調(diào)用,比如:打開文件。系統(tǒng)調(diào)用會有一定程度上的開銷,減少系統(tǒng)調(diào)用是可以加快處理速度的程序設(shè)計細(xì)節(jié)。

TCP鏈接保持:可以通過保持TCP鏈接來減少服務(wù)端和客戶端之間的創(chuàng)建和關(guān)閉TCP鏈接的操作。HTTP中的Connection:Keep-Alive就有這樣的功能

IO模型:由于CPU的速度遠(yuǎn)遠(yuǎn)比IO快,IO延遲往往成為性能瓶頸,因此,IO模型十分重要。

各種IO模型:

PIO:CPU直接干預(yù)磁盤和內(nèi)存的數(shù)據(jù)交互,即無論是數(shù)據(jù)從內(nèi)存到磁盤還是磁盤到內(nèi)存都要經(jīng)過CPU寄存器。這樣的模型,可想而知,CPU有很多時間都需要等待慢速設(shè)備。

DMA(Direct Memory Access):CPU通過向DMA控制器發(fā)送指令來控制處理數(shù)據(jù),數(shù)據(jù)處理完之后通知CPU,這可以很大程度上釋放CPU資源。

同步阻塞I/O:對于進(jìn)程來說,一些系統(tǒng)調(diào)用為了同步IO,會不同程度上阻塞進(jìn)程,比如accept、send、read等。

同步非阻塞I/O:對于進(jìn)程來說,一些系統(tǒng)調(diào)用可以在調(diào)用完之后立即返回,告知進(jìn)程IO是否就緒,避免阻塞進(jìn)程。

多路I/O就緒通知:對于同步非阻塞I/O的方式,進(jìn)程仍然需要輪詢文件描述符(句柄)來得知哪些IO就緒了,而多路I/O就緒通知將這個過程改成回調(diào)通知。

內(nèi)存映射:將文件與內(nèi)存的某塊地址空間相映射,這樣可以想寫內(nèi)存一樣寫文件。當(dāng)然這種方式本質(zhì)上跟寫文件沒有什么區(qū)別。

直接I/O:在用戶進(jìn)程地址空間和磁盤中間通常都會有操作系統(tǒng)管轄的內(nèi)核緩沖區(qū),當(dāng)寫入文件時,一般是寫入這個緩沖區(qū),然后由一些延遲策略來寫入磁盤。這樣做可以提高寫效率。但是對于諸如數(shù)據(jù)庫這樣的應(yīng)用來說,往往希望自己管理讀寫緩存,避免內(nèi)核緩沖區(qū)的無畏內(nèi)存浪費(fèi)。Linux的open函數(shù)支持O_DIRECT參數(shù)來進(jìn)行直接IO。

sendfile:如果web服務(wù)器想發(fā)送一個文件,將會經(jīng)歷如下過程:打開文件,從磁盤中讀取文件內(nèi)容(這通常涉及到內(nèi)核緩沖區(qū)數(shù)據(jù)復(fù)制到用戶進(jìn)程),然后進(jìn)程通過socket發(fā)送文件內(nèi)容(這通常設(shè)計到用戶進(jìn)程數(shù)據(jù)復(fù)制到網(wǎng)卡內(nèi)核緩沖區(qū)),可以看到重復(fù)的數(shù)據(jù)復(fù)制是可以避免的。sendfile可以支持直接從文件內(nèi)核緩沖區(qū)復(fù)制到網(wǎng)卡內(nèi)核緩沖區(qū)。

更多信息請查看網(wǎng)站運(yùn)營
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
相關(guān)閱讀網(wǎng)站運(yùn)營

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機(jī)號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)