Cache
Varnish 不一致地從記憶體中逐出頁面
在我們的 varnish 配置中,我們有一個 vcl_fetch 函式定義如下:
if (beresp.ttl > 0s) { /* Remove Expires from backend, it's not long enough */ unset beresp.http.expires; /* Set the clients TTL on this object */ set beresp.http.cache-control = "max-age=900"; /* Set how long Varnish will keep it */ set beresp.ttl = 1h; /* marker for vcl_deliver to reset Age: */ set beresp.http.magicmarker = "1"; }
然後在 vcl_deliver 中:
if (resp.http.magicmarker) { /* Remove the magic marker */ unset resp.http.magicmarker; /* By definition we have a fresh object */ set resp.http.age = "0"; }
問題是,如果我設置一個腳本(shell 腳本或 php 腳本)來訪問相同的 URL,我首先會看到一個 MISS,然後是一個 HIT(到目前為止一切都很好)。
我期望坐的是重複 HITS 直到 1 小時標記過去,1 小時標記處有一個 MISS,然後再次 HIT 一個小時。換句話說,因為我反复點擊同一個 URL,它應該每 1 小時在 HIT 和 MISS 之間循環一次。
相反,我看到的是這樣的:
6/20/2013 6:30:05 - STRING HIT NOT FOUND 6/20/2013 10:32:11 - STRING HIT NOT FOUND 6/21/2013 12:33:06 - STRING HIT NOT FOUND 6/21/2013 2:34:06 - STRING HIT NOT FOUND
現在是凌晨 5 點 57 分(距離未找到 HIT 已近 4 小時)。
上面的記憶體未命中都出現在半小時左右,但它們相隔 4 小時、2 小時和 2 小時,並且 TTL 設置為 1 小時。
所以我不明白為什麼該對像被保存超過 1 小時以及為什麼它以看似隨機的時間間隔被驅逐。我怎樣才能更好地確定發生了什麼?
順便說一句,如果有幫助的話,我正在使用 varnish 3。
所以有問題的清漆伺服器正在記憶體一個 Drupal 7 站點。在 Drupal 7 站點中,我們配置並啟用了 Drupal Varnish 模組。
據我所知,這是定期清除記憶體。我能夠確定使用以下命令並查看我尚未發布的 BAN:
varnishadm -T localhost:6082 -S /etc/varnish/secret ban.list Present bans: 1371834738.031740 193 req.http.host ~ www.ourdomain.com && req.url ~ /