Varnish是一款高性能的開源HTTP加速器,挪威最大的在線報紙Verdens Gang使用3臺Varnish代替了原來的12臺Squid,性能比以前更好。
簡介
Varnish的作者Poul-Henning Kamp是FreeBSD的內(nèi)核開發(fā)者之一,他認為現(xiàn)在的計算機比起1975年已經(jīng)復(fù)雜許多。在1975年時,儲存媒介只有兩種:內(nèi)存與硬盤。但現(xiàn)在計算機系統(tǒng)的內(nèi)存除了主存外,還包括了CPU內(nèi)的L1、L2,甚至有L3快取。硬盤上也有自己的快取裝置,因此Squid Cache自行處理物件替換的架構(gòu)不可能得知這些情況而做到最佳化,但操作系統(tǒng)可以得知這些情況,所以這部份的工作應(yīng)該交給操作系統(tǒng)處理,這就是Varnish cache設(shè)計架構(gòu)。
varnish項目是2006年發(fā)布的第一個版本0.9.距今已經(jīng)有十多年了,此文檔之前也提過varnish還不穩(wěn)定,那是2007年時候編寫的,經(jīng)過varnish開發(fā)團隊和網(wǎng)友們的辛苦耕耘,現(xiàn)在的varnish已經(jīng)很健壯。很多門戶網(wǎng)站已經(jīng)部署了varnish,并且反應(yīng)都很好,甚至反應(yīng)比Squid還穩(wěn)定,且效率更高,資源占用更少。相信在反向代理,web加速方面,varnish已經(jīng)有足夠能力代替squid。
總體架構(gòu)
2.1總體流程
主進程fork子進程,主進程等待子進程的信號,子進程退出后,主進程重新啟動子進程
子進程生成若干線程。
Accept線程:接受請求,將請求掛在overflow隊列上
Work線程:多個,從對列上摘除請求,對請求進行處理,直到完成,然后處理下一個
請求
Epoll線程:一個請求處理稱作一個session,在session周期內(nèi),處理完請求后,會交給
Epoll處理,監(jiān)聽是否還有事件發(fā)生。
Expire線程:對于緩存的對象,根據(jù)過期時間,組織成二叉堆,該線程周期檢查該堆的
根,處理過期的文件。
線程之間的關(guān)系:
2.1.1accept線程
監(jiān)聽端口,接受連接。
接受后組織成struct ses(session結(jié)構(gòu)),看是否有空閑的工作線程,如果有,將請求給它,
pthread_cond_signal信號通知它沒有空閑線程,如果overflow過大,則放棄該請求。否則,
將其掛在overflow上(需要更多工作線程,發(fā)通知)。
繼續(xù)監(jiān)聽2.1.2work線程
從overflow隊列上摘取請求(struct ses),進入狀態(tài)機處理,處理結(jié)束后,通過pipe通信,
將struct ses發(fā)送給epoll線程。
2.1.3Epoll線程,得到傳過來的struct ses,若還沒有過期,將socket放入epoll的事件中,事
件發(fā)生時,也會將其放入到overflow中進行。
工作流程
Varnish與一般服務(wù)器軟件類似,分為master(management)進程和child(worker,主要做cache的工作)進程。master進程讀入命令,進行一些初始化,然后fork并監(jiān)控child進程。child進程分配若干線程進行工作,主要包括一些管理線程和很多woker線程。
針對文件緩存部分,master讀入存儲配置(-s file[,path[,size[,granularity]]]),調(diào)用合適的存儲類型,然后創(chuàng)建/讀入相應(yīng)大小的緩存大文件。接著,master初始化管理該存儲空間的結(jié)構(gòu)體。這些變量都是全局變量,在fork以后會被child進程所繼承(包括文件描述符)。
在child進程主線程初始化過程中,將前面打開的存儲大文件整個mmap到內(nèi)存中(如果超出系統(tǒng)的虛擬內(nèi)存,mmap失敗,進程會減少原來的配置mmap大小,然后繼續(xù)mmap),此時創(chuàng)建并初始化空閑存儲結(jié)構(gòu)體,掛到存儲管理結(jié)構(gòu)體,以待分配。
接著,真正的工作開始,Varnish的某個負責接受新HTTP連接的線程開始等待用戶,如果有新的HTTP連接過來,它總負責接收,然后叫醒某個等待中的線程,并把具體的處理過程交給它。Worker線程讀入HTTP請求的URI,查找已有的object,如果命中則直接返回并回復(fù)用戶。如果沒有命中,則需要將所請求的內(nèi)容,從后端服務(wù)器中取過來,存到緩存中,然后再回復(fù)。
分配緩存的過程是這樣的:它根據(jù)所讀到object的大小,創(chuàng)建相應(yīng)大小的緩存文件。為了讀寫方便,程序會把每個object的大小變?yōu)樽罱咏浯笮〉膬?nèi)存頁面倍數(shù)。然后從現(xiàn)有的空閑存儲結(jié)構(gòu)體中查找,找到最合適的大小的空閑存儲塊,分配給它。如果空閑塊沒有用完,就把多余的內(nèi)存另外組成一個空閑存儲塊,掛到管理結(jié)構(gòu)體上。如果緩存已滿,就根據(jù)LRU機制,把最舊的object釋放掉。
釋放緩存的過程是這樣的:有一個超時線程,檢測緩存中所有object的生存期,如果超初設(shè)定的TTL(Time To Live)沒有被訪問,就刪除之,并且釋放相應(yīng)的結(jié)構(gòu)體及存儲內(nèi)存。注意釋放時會檢查該存儲內(nèi)存塊前面或后面的空閑內(nèi)存塊,如果前面或后面的空閑內(nèi)存和該釋放內(nèi)存是連續(xù)的,就將它們合并成更大一塊內(nèi)存。
整個文件緩存的管理,沒有考慮文件與內(nèi)存的關(guān)系,實際上是將所有的object都考慮是在內(nèi)存中,如果系統(tǒng)內(nèi)存不足,系統(tǒng)會自動將其換到swap空間,而不需要varnish程序去控制。
安裝配置
wget-c http://repo.varnish-cache.org/source/varnish-3.0.1.tar.gz
tar xzvf varnish-3.0.1.tar.gz
cd varnish-3.0.1
./configure--prefix=/usr/local/varnish
make
make install
groupadd varnish
useradd-d/var/lib/varnish-g varnish -s/sbin/nologin varnish
ln-s/usr/local/varnish/sbin/varnishd/usr/sbin/varnishd
啟動varnish:
varnishd-f/usr/local/varnish/etc/varnish/default.vcl-s malloc,1G-g varnish -u varnish-T 127.0.0.1:2000
關(guān)閉varnish:
pkill varnish
啟動參數(shù)介紹:
-f /usr/local/etc/varnish/default.vcl
這個–f選項指定varnishd使用哪個配置文件。
-s malloc,1G
這個–s選項用來確定varnish使用的存儲類型和存儲容量,我使用的是malloc類型(malloc是一個C函數(shù),用于分配內(nèi)存空間),1G定義多少內(nèi)存被malloced,1G=1gigabyte。
-T 127.0.0.1:2000
Varnish有一個基于文本的管理接口,啟動它的話可以在不停止varnish的情況下來管理varnish。您可以指定管理軟件監(jiān)聽哪個接口。當然您不能讓全世界的人都能訪問您的varnish管理接口,因為他們可以很輕松的通過訪問varnish管理接口來獲得您的root訪問權(quán)限。我推薦只讓它監(jiān)聽本機端口。如果您的系統(tǒng)里有您不完全信任的用戶,您可以通過防火墻規(guī)則來限制他訪問varnish的管理端口。
-a 0.0.0.0:8080
這一句的意思是制定varnish監(jiān)聽所有IP發(fā)給8080端口的http請求,如果在生產(chǎn)環(huán)境下,您應(yīng)該讓varnish監(jiān)聽80,這也是默認的。
vcl配置文件的介紹請執(zhí)行如何命令查看:
man/usr/local/varnish/share/man/man7/vcl.7
版本發(fā)布
2011年08月24日,Varnish3.0.1RC1發(fā)布,HTTP加速器。
2011年08月30日,Varnish3.0.1正式版發(fā)布了,與3.0版本比較,改進包括:
對象以優(yōu)雅和保持設(shè)置被錯誤地視為候選的短暫存儲,但不會迅速清理,這表現(xiàn)為如果有一個內(nèi)存泄漏。現(xiàn)在這是固定的。
當多個客戶正在等待一個對象,所有客戶端會醒來當一個物體變得可用,從而導(dǎo)致卡線程。這已經(jīng)被修正
一個bug在XML實體是如何處理應(yīng)急服務(wù)國際公司已經(jīng)固定
文檔目睹了大量的更新
varnishncsa現(xiàn)在更加穩(wěn)定和支持顯示任意請求和響應(yīng)字段。
2011年10月26日,Varnish Cache 3.0.2發(fā)布。
2012年08月20日,Varnish Cache 3.0.3發(fā)布。
2013年06月17日,Varnish Cache 3.0.4發(fā)布,為目前最新版本。
最新版為2018-04-15更新,地址于參考資料。
參考資料 >