2013-01-15 40 views
0

目前我們有一個基於各種獲取參數創建XML頁面的服務。 隨着參數數量的增加,不同組合的數量也在增加,這意味着我們的清漆緩存中的命中率已經下降。 我們已經增加了TTL,因此命中率有所增加,但是我正在玩弄以下想法:邊緣限制包含在一頁內?

我剛剛遇到了Edge Side Includes,並且正在想.. 如果我生成的XML頁面包含50元素,我可以生成一個包含50個ESI(s)的頁面,然後將這些清漆合併成一個文檔?

爲什麼選擇50個ESI元素?由於每個XML元素本身都很容易被一個URL緩存,但是這些過濾器的組合會導致生成大量不同的完整XML文檔。因此,即使有一個請求過濾掉了前10個XML元素(因爲它們沒有向get params確認),因爲使用ESIs,每個元素都將從緩存中獲取。

這將在服務器上有多沉重?這樣做有意義嗎? ESI是非常昂貴的,在這種情況下,它是沒有意義的。

更新


首先,我們從來沒有用完的內存和核彈是零。我們目前的命中率爲0,4,時間爲4小時,這在我看來是糟糕的...由於所有這些組合(國家,地區等)。更糟糕的是,tomcat的使用率已經達到100%,而清漆停留在研究的1-3%。我的直覺告訴我們,用清漆縫合ESI,記住這些子文檔將更好地保護tomcat並提高我們的容量。我們從來不需要奇怪地使用Nuke項目,這意味着在高速緩存條目到期之前永遠不會填滿〜1GB高速緩存。我確定如果我們緩存每個子文檔,我們可能會達到內存限制,並開始nuking項目...但不清漆使用某種最近最少使用的算法?

+1

你可能會發現你正在尋找從http://stackoverflow.com/questions/5960598/varnish-and-esi-how-is-the-performance – Ketola

+0

葉,那正是那種事情的答案我正在尋找。謝謝! –

回答

1

通常不是覆蓋緩存集合的最佳決策,其中有大量不同的查詢組合。很有可能,某些查詢組合的訪問次數比其他查詢組合要多得多(例如,有很多SEO果汁的組合,或者在您的網站上發佈/共享鏈接到/有鏈接的組合,或者與您的用戶更相關),所以這些應該有選擇地緩存。將所有內容緩存很長時間的問題在於,如果url空間很大,那麼您可能會耗盡內存和核查經常訪問的資源,以便緩存不常訪問的內容。

對於每頁包含的ESI沒有限制,假設xml子文檔的命中率非常高,您描述的方法是一個很好的策略。清漆中的高速緩存命中非常輕量級,因此即使頁面是由50個高速緩存命中組成的複合體,我認爲與沒有高速緩存相比,它的性能會非常好。如果包含子文檔在內的esi的命中率很低,並且每頁上都有大量的文檔,則會導致性能下降,而不僅僅是每次都有後端呈現子文檔。我肯定會推薦在下列情況下進行一些負載測試,以便您可以作出明智的決定:

  1. 沒有緩存,後端每次都會呈現子文檔。
  2. ESI將子文檔呈現爲片段,0%緩存命中。
  3. ESI將子文檔呈現爲片段,50%緩存命中。
  4. ESI將子文檔呈現爲片段,100%緩存命中。

這將給出一個關於性能如何降低你的命中率下降(它可能不是線性的,因此做0%,50%,100%),並告訴你有多少緩存可以提高理論上的表現。對我來說,最好的解決方案似乎是esi的一些組合:包括片段在經常訪問的子文檔的「工作集」中,並且如果子文檔不在工作集中,則直接在子系統上呈現子文檔。

+0

我添加了一個更新到我原來的問題,澄清進一步的信息...最近使用最少的清漆嗎? –

+0

是 - https://www.varnish-cache.org/trac/wiki/ArchitectureLRU –

+0

只是緩存子文檔將使用相當少的內存,因爲每個子文檔只會在緩存中存在一次。它現在設置的方式,每個子目錄可能存在於10個頁面的緩存中,其中沒有一個可能再次被使用。所以如果你改變了結構,你可以安全地增加TTL並提高命中率,同時使用更少的RAM。 –