Cache

Varnish 不一致地從記憶體中逐出頁面

  • June 23, 2013

在我們的 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 ~ /

引用自:https://serverfault.com/questions/517498