diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d9156cae0f2..51abcd99e8d 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -88,6 +88,7 @@ Thank you! Brian Degenhardt Brian Denehy Bruce Murphy + Carl Vuosalo Carson Gaspar Carson Gaspar Carsten Grzemba diff --git a/src/MemStore.cc b/src/MemStore.cc index 660dd58cd29..97abd7ca5f5 100644 --- a/src/MemStore.cc +++ b/src/MemStore.cc @@ -207,6 +207,14 @@ MemStore::getStats(StoreInfoStats &stats) const const size_t pageSize = Ipc::Mem::PageSize(); stats.mem.shared = true; + + // In SMP mode, only the first worker reports shared memory stats to avoid + // adding up same-cache positive stats (reported by multiple worker + // processes) when Coordinator aggregates worker-reported stats. + // See also: Store::Disk::doReportStat(). + if (UsingSmp() && KidIdentifier != 1) + return; + stats.mem.capacity = Ipc::Mem::PageLimit(Ipc::Mem::PageId::cachePage) * pageSize; stats.mem.size = diff --git a/src/StoreStats.cc b/src/StoreStats.cc index 305e74d6366..dc4220e93a5 100644 --- a/src/StoreStats.cc +++ b/src/StoreStats.cc @@ -23,22 +23,10 @@ StoreInfoStats::operator +=(const StoreInfoStats &stats) // Assume that either all workers use shared memory cache or none do. // It is possible but difficult to report correct stats for an arbitrary // mix, and only rather unusual deployments can benefit from mixing. - - // If workers share memory, we will get shared stats from those workers - // and non-shared stats from other processes. Ignore order and also - // ignore other processes stats because they are zero in most setups. - if (stats.mem.shared) { // workers share memory - // use the latest reported stats, they all should be about the same - mem.shared = true; - mem.size = stats.mem.size; - mem.capacity = stats.mem.capacity; - mem.count = stats.mem.count; - } else if (!mem.shared) { // do not corrupt shared stats, if any - // workers do not share so we must add everything up - mem.size += stats.mem.size; - mem.capacity += stats.mem.capacity; - mem.count += stats.mem.count; - } + mem.shared = mem.shared || stats.mem.shared; // TODO: Remove mem.shared as effectively unused? + mem.size += stats.mem.size; + mem.capacity += stats.mem.capacity; + mem.count += stats.mem.count; store_entry_count += stats.store_entry_count; mem_object_count += stats.mem_object_count; diff --git a/src/snmp_agent.cc b/src/snmp_agent.cc index 3b1e2df3dde..193238b7999 100644 --- a/src/snmp_agent.cc +++ b/src/snmp_agent.cc @@ -25,6 +25,8 @@ #include "StatCounters.h" #include "StatHist.h" #include "Store.h" +#include "store/Controller.h" +#include "StoreStats.h" #include "tools.h" #include "util.h" @@ -409,11 +411,14 @@ snmp_prfSysFn(variable_list * Var, snint * ErrP) SMI_GAUGE32); break; - case PERF_SYS_NUMOBJCNT: + case PERF_SYS_NUMOBJCNT: { + StoreInfoStats stats; + Store::Root().getStats(stats); Answer = snmp_var_new_integer(Var->name, Var->name_length, - (snint) StoreEntry::inUseCount(), + (snint) (stats.mem.count + stats.swap.count), SMI_GAUGE32); break; + } default: *ErrP = SNMP_ERR_NOSUCHNAME;