From cee51c1bf7fc093c04eef8b940e1e689b21f6302 Mon Sep 17 00:00:00 2001 From: sageweil Date: Fri, 31 Aug 2007 16:46:56 +0000 Subject: [PATCH] logger can calc average and variance git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1756 29311d96-e01e-0410-9327-a35deaab8ce9 --- trunk/ceph/common/LogType.h | 7 ++++++ trunk/ceph/common/Logger.cc | 47 +++++++++++++++++++++++++++++++++---- trunk/ceph/common/Logger.h | 3 +++ trunk/ceph/config.cc | 2 ++ trunk/ceph/config.h | 2 ++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/trunk/ceph/common/LogType.h b/trunk/ceph/common/LogType.h index 35008e79ff045..a0889545acb6a 100644 --- a/trunk/ceph/common/LogType.h +++ b/trunk/ceph/common/LogType.h @@ -36,6 +36,7 @@ class LogType { hash_map keymap; vector keys; set inc_keys; + vector avg; int version; @@ -62,6 +63,7 @@ class LogType { i = keys.size(); keys.push_back(key); + avg.push_back(false); intptr_t p = (intptr_t)key; keymap[p] = i; @@ -76,6 +78,11 @@ class LogType { int add_set(const char *key) { return add_key(key, false); } + int add_avg(const char *key) { + int i = add_key(key, true); + avg[i] = true; + return i; + } bool have_key(const char* key) { return lookup_key(key) < 0; diff --git a/trunk/ceph/common/Logger.cc b/trunk/ceph/common/Logger.cc index 509f1d39ee668..18613bc5746f6 100644 --- a/trunk/ceph/common/Logger.cc +++ b/trunk/ceph/common/Logger.cc @@ -166,8 +166,11 @@ void Logger::_flush() if (wrote_header != type->version || wrote_header_last > 10) { out << "#" << type->keymap.size(); - for (unsigned i=0; ikeys.size(); i++) + for (unsigned i=0; ikeys.size(); i++) { out << "\t" << type->keys[i]; + if (type->avg[i]) + out << "\t" << type->keys[i] << "*\t" << type->keys[i] << "~"; + } out << std::endl; //out << "\t (" << type->keymap.size() << ")" << endl; wrote_header = type->version; wrote_header_last = 0; @@ -177,11 +180,29 @@ void Logger::_flush() // write line to log out << last_flush; + vector< vector > to_avg(type->keys.size()); + to_avg.swap(vals_to_avg); for (unsigned i=0; ikeys.size(); i++) { - if (fvals[i] > 0 && vals[i] == 0) - out << "\t" << fvals[i]; - else - out << "\t" << vals[i]; + if (type->avg[i]) { + if (vals[i] > 0) { + double avg = (fvals[i] / (double)vals[i]); + //logger_lock.Unlock(); + double var = 0.0; + if (g_conf.logger_calc_variance) { + int n = vals[i]; + for (vector::iterator p = to_avg[i].begin(); n--; ++p) + var += (avg - *p) * (avg - *p); + } + //logger_lock.Lock(); + out << "\t" << avg << "\t" << vals[i] << "\t" << var; + } else + out << "\t" << 0 << "\t"; + } else { + if (fvals[i] > 0 && vals[i] == 0) + out << "\t" << fvals[i]; + else + out << "\t" << vals[i]; + } } out << std::endl; @@ -251,6 +272,22 @@ double Logger::fset(const char *key, double v) return r; } +double Logger::favg(const char *key, double v) +{ + if (!g_conf.log) return 0; + logger_lock.Lock(); + int i = type->lookup_key(key); + if (i < 0) i = type->add_avg(key); + maybe_resize(i+1); + + vals[i]++; + double r = fvals[i] = v; + if (g_conf.logger_calc_variance) + vals_to_avg[i].push_back(v); + logger_lock.Unlock(); + return r; +} + long Logger::get(const char* key) { if (!g_conf.log) return 0; diff --git a/trunk/ceph/common/Logger.h b/trunk/ceph/common/Logger.h index 7c97344b50725..39bedab82c6c8 100644 --- a/trunk/ceph/common/Logger.h +++ b/trunk/ceph/common/Logger.h @@ -34,11 +34,13 @@ class Logger { // values for this instance vector vals; vector fvals; + vector< vector > vals_to_avg; void maybe_resize(unsigned s) { if (s >= vals.size()) { vals.resize(s); fvals.resize(s); + vals_to_avg.resize(s); } } @@ -64,6 +66,7 @@ class Logger { double fset(const char *s, double v); double finc(const char *s, double v); + double favg(const char *s, double v); //void flush(); void _flush(); diff --git a/trunk/ceph/config.cc b/trunk/ceph/config.cc index 97efd6582da2f..04bf0406fe7e4 100644 --- a/trunk/ceph/config.cc +++ b/trunk/ceph/config.cc @@ -73,6 +73,8 @@ md_config_t g_conf = { log_messages: true, log_pins: true, + logger_calc_variance: true, + dout_dir: 0, fake_clock: false, diff --git a/trunk/ceph/config.h b/trunk/ceph/config.h index 34eeb98943f2b..f6104ea030219 100644 --- a/trunk/ceph/config.h +++ b/trunk/ceph/config.h @@ -53,6 +53,8 @@ struct md_config_t { bool log_messages; bool log_pins; + bool logger_calc_variance; + char *dout_dir; bool fake_clock; -- 2.39.5