From: Amos Jeffries Date: Tue, 1 Feb 2011 02:31:49 +0000 (-0700) Subject: Author: Alex Rousskov X-Git-Tag: SQUID_3_1_11~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9b7a696ab3740698e1719bb643bcb69fd10c5fde;p=thirdparty%2Fsquid.git Author: Alex Rousskov Fix IP/FQDN cache accounting to avoid idle caches on busy servers. When maintaining the IP/FQDN cache size, use the number of entries in the cache rather than the number of allocated and not freed MEM_IPCACHE_ENTRY and MEM_FQDNCACHE_ENTRY objects. These objects are used outside the cache for DNS queries. If queries leak (or perhaps when there are just a lot of them), the memory-pool-based count overestimates the cache size, sometimes to such a degree that the cache remains nearly empty despite lots of misses. Use memory-pool-based counter to estimate cache size also violates IP/FQDN cache encapsulation boundaries because it effectively prevents others from using the same memory pool. --- diff --git a/src/fqdncache.cc b/src/fqdncache.cc index f0744c4621..3bd0902651 100644 --- a/src/fqdncache.cc +++ b/src/fqdncache.cc @@ -153,6 +153,9 @@ static long fqdncache_low = 180; /// \ingroup FQDNCacheInternal static long fqdncache_high = 200; +/// \ingroup FQDNCacheInternal +inline int fqdncacheCount() { return fqdn_table ? fqdn_table->count : 0; } + int fqdncache_entry::age() const { @@ -230,7 +233,7 @@ fqdncache_purgelru(void *notused) eventAdd("fqdncache_purgelru", fqdncache_purgelru, NULL, 10.0, 1); for (m = lru_list.tail; m; m = prev) { - if (memInUse(MEM_FQDNCACHE_ENTRY) < fqdncache_low) + if (fqdncacheCount() < fqdncache_low) break; prev = m->prev; @@ -700,9 +703,12 @@ fqdnStats(StoreEntry * sentry) storeAppendPrintf(sentry, "FQDN Cache Statistics:\n"); - storeAppendPrintf(sentry, "FQDNcache Entries: %d\n", + storeAppendPrintf(sentry, "FQDNcache Entries In Use: %d\n", memInUse(MEM_FQDNCACHE_ENTRY)); + storeAppendPrintf(sentry, "FQDNcache Entries Cached: %d\n", + fqdncacheCount()); + storeAppendPrintf(sentry, "FQDNcache Requests: %d\n", FqdncacheStats.requests); @@ -891,7 +897,7 @@ snmp_netFqdnFn(variable_list * Var, snint * ErrP) case FQDN_ENT: Answer = snmp_var_new_integer(Var->name, Var->name_length, - memInUse(MEM_FQDNCACHE_ENTRY), + fqdncacheCount(), SMI_GAUGE32); break; diff --git a/src/ipcache.cc b/src/ipcache.cc index bd1a210fa7..451b1da9cb 100644 --- a/src/ipcache.cc +++ b/src/ipcache.cc @@ -163,6 +163,9 @@ static long ipcache_high = 200; extern int _dns_ttl_; #endif +/// \ingroup IPCacheInternal +inline int ipcacheCount() { return ip_table ? ip_table->count : 0; } + int ipcache_entry::age() const { @@ -237,7 +240,7 @@ ipcache_purgelru(void *voidnotused) eventAdd("ipcache_purgelru", ipcache_purgelru, NULL, 10.0, 1); for (m = lru_list.tail; m; m = prev) { - if (memInUse(MEM_IPCACHE_ENTRY) < ipcache_low) + if (ipcacheCount() < ipcache_low) break; prev = m->prev; @@ -918,8 +921,10 @@ stat_ipcache_get(StoreEntry * sentry) dlink_node *m; assert(ip_table != NULL); storeAppendPrintf(sentry, "IP Cache Statistics:\n"); - storeAppendPrintf(sentry, "IPcache Entries: %d\n", + storeAppendPrintf(sentry, "IPcache Entries In Use: %d\n", memInUse(MEM_IPCACHE_ENTRY)); + storeAppendPrintf(sentry, "IPcache Entries Cached: %d\n", + ipcacheCount()); storeAppendPrintf(sentry, "IPcache Requests: %d\n", IpcacheStats.requests); storeAppendPrintf(sentry, "IPcache Hits: %d\n", @@ -1501,7 +1506,7 @@ snmp_netIpFn(variable_list * Var, snint * ErrP) case IP_ENT: Answer = snmp_var_new_integer(Var->name, Var->name_length, - memInUse(MEM_IPCACHE_ENTRY), + ipcacheCount(), SMI_GAUGE32); break;