varnish的作者Poul-Henning Kamp,是寫(xiě)freebsd內(nèi)核的,在寫(xiě)varnish時(shí)結(jié)合了內(nèi)核的一些原理和機(jī)制,摘錄了一些設(shè)計(jì)思路。
1.現(xiàn)代的操作系統(tǒng)對(duì)于內(nèi)存管理,磁盤(pán)讀寫(xiě)有復(fù)雜的優(yōu)化機(jī)制,以提高系統(tǒng)的整體性能,開(kāi)發(fā)用戶(hù)空間的程序時(shí)需要關(guān)注、配合這些機(jī)制,以squid為例,內(nèi)部實(shí)現(xiàn)了對(duì)象的緩存、淘汰策略,其實(shí)現(xiàn)跟操作系統(tǒng)類(lèi)似,比如被訪(fǎng)問(wèn)的對(duì)象會(huì)被緩存,冷對(duì)象會(huì)刷到磁盤(pán),釋放內(nèi)存,在一些情況下,這種機(jī)制可能跟操作系統(tǒng)沖突,從而并不能達(dá)到預(yù)期。當(dāng)squid緩存的內(nèi)存對(duì)象一段時(shí)間內(nèi)未被訪(fǎng)問(wèn),并且還未被squid刷到磁盤(pán)時(shí),操作系統(tǒng)可能因?yàn)閮?nèi)存不足將這些冷對(duì)象swap到磁盤(pán),此時(shí)squid是不知道的,而一直認(rèn)為這些冷對(duì)象還在內(nèi)存中,然后squid根據(jù)淘汰策略將這些冷對(duì)象刷到磁盤(pán)時(shí),操作系統(tǒng)需要先把這些冷對(duì)象從swap中重新載入內(nèi)存,squid接著將這些冷對(duì)象寫(xiě)入磁盤(pán)。可以看出整個(gè)過(guò)程的性能損耗。
評(píng)注:這個(gè)例子需要一分為二的看,應(yīng)用程序的內(nèi)存對(duì)象被系統(tǒng)swap,說(shuō)明系統(tǒng)已經(jīng)內(nèi)存不夠了,內(nèi)存cache效率大打折扣。
2.帶持久化的cache,需要從持久化的數(shù)據(jù)中重構(gòu)cache,一般有兩種方法,一種是直接從磁盤(pán)中按需讀取,由于訪(fǎng)問(wèn)是隨機(jī)的,而磁盤(pán)的隨機(jī)讀效率很低,這種方式訪(fǎng)問(wèn)效率不高但是節(jié)省空間,適合低流量的小機(jī)器,大數(shù)據(jù)量的cache。另外一種方法是預(yù)先從磁盤(pán)中建立完整的索引,能夠大大提升訪(fǎng)問(wèn)效率。
持久化緩存和磁盤(pán)不同的是持久化緩存對(duì)可靠性要求不高,不需要嚴(yán)格的崩潰恢復(fù),varnish使用了第二種方式,通過(guò)分層的保護(hù)提升可靠性,頂層通過(guò)A/B寫(xiě)保證可靠性。底層具體數(shù)據(jù)不保證可靠性。
http://www.varnish-cache.org/trac/wiki/ArchitectNotes