summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-08-13 17:36:57 -0700
committerSamuel Just <sam.just@inktank.com>2013-08-14 14:22:41 -0700
commitebde89d5602536b4bc651737e4280fdfb6634c32 (patch)
treef99dc5764f541b215361af3d443b1fb1c44d85e5
parent95f3353a6ab3a4dd2bf28eaca7122487942e913e (diff)
downloadceph-ebde89d5602536b4bc651737e4280fdfb6634c32.tar.gz
ObjectStore: add ObjectStore::get_cur_stats and impl in FileStore
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/common/perf_counters.cc16
-rw-r--r--src/common/perf_counters.h20
-rw-r--r--src/os/FileStore.cc11
-rw-r--r--src/os/FileStore.h19
-rw-r--r--src/os/ObjectStore.h2
-rw-r--r--src/osd/OSD.cc2
6 files changed, 70 insertions, 0 deletions
diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc
index 1dd4cdabd9d..339ff6a372b 100644
--- a/src/common/perf_counters.cc
+++ b/src/common/perf_counters.cc
@@ -203,6 +203,22 @@ utime_t PerfCounters::tget(int idx) const
return utime_t(data.u64 / 1000000000ull, data.u64 % 1000000000ull);
}
+pair<uint64_t, uint64_t> PerfCounters::get_tavg_ms(int idx) const
+{
+ if (!m_cct->_conf->perf)
+ return make_pair(0, 0);
+
+ Mutex::Locker lck(m_lock);
+ assert(idx > m_lower_bound);
+ assert(idx < m_upper_bound);
+ const perf_counter_data_any_d& data(m_data[idx - m_lower_bound - 1]);
+ if (!(data.type & PERFCOUNTER_TIME))
+ return make_pair(0, 0);
+ if (!(data.type & PERFCOUNTER_LONGRUNAVG))
+ return make_pair(0, 0);
+ return make_pair(data.avgcount, data.u64/1000000);
+}
+
void PerfCounters::dump_formatted(Formatter *f, bool schema)
{
Mutex::Locker lck(m_lock);
diff --git a/src/common/perf_counters.h b/src/common/perf_counters.h
index ec10f9a9282..f4651c69f1c 100644
--- a/src/common/perf_counters.h
+++ b/src/common/perf_counters.h
@@ -65,6 +65,24 @@ enum perfcounter_type_d
class PerfCounters
{
public:
+ template <typename T>
+ struct avg_tracker {
+ pair<uint64_t, T> last;
+ pair<uint64_t, T> cur;
+ avg_tracker() : last(0, 0), cur(0, 0) {}
+ T avg() const {
+ if (cur.first == last.first)
+ return cur.first ?
+ cur.second / cur.first :
+ 0; // no change, report avg over all time
+ return (cur.second - last.second) / (cur.first - last.first);
+ }
+ void consume_next(const pair<uint64_t, T> &next) {
+ last = cur;
+ cur = next;
+ }
+ };
+
~PerfCounters();
void inc(int idx, uint64_t v = 1);
@@ -78,6 +96,8 @@ public:
void dump_formatted(ceph::Formatter *f, bool schema);
+ pair<uint64_t, uint64_t> get_tavg_ms(int idx) const;
+
const std::string& get_name() const;
void set_name(std::string s) {
m_name = s;
diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc
index 108a857ab9f..e442dd4fe2b 100644
--- a/src/os/FileStore.cc
+++ b/src/os/FileStore.cc
@@ -126,6 +126,17 @@ static const __SWORD_TYPE XFS_SUPER_MAGIC(0x58465342);
#define ALIGNED(x, by) (!((x) % (by)))
#define ALIGN_UP(x, by) (ALIGNED((x), (by)) ? (x) : (ALIGN_DOWN((x), (by)) + (by)))
+void FileStore::FSPerfTracker::update_from_perfcounters(
+ PerfCounters &logger)
+{
+ os_commit_latency.consume_next(
+ logger.get_tavg_ms(
+ l_os_commit_lat));
+ os_apply_latency.consume_next(
+ logger.get_tavg_ms(
+ l_os_apply_lat));
+}
+
ostream& operator<<(ostream& out, const FileStore::OpSequencer& s)
{
diff --git a/src/os/FileStore.h b/src/os/FileStore.h
index 86d267dddf1..ba428093cda 100644
--- a/src/os/FileStore.h
+++ b/src/os/FileStore.h
@@ -55,6 +55,25 @@ class FileStore : public JournalingObjectStore,
public md_config_obs_t
{
public:
+
+ struct FSPerfTracker {
+ PerfCounters::avg_tracker<uint64_t> os_commit_latency;
+ PerfCounters::avg_tracker<uint64_t> os_apply_latency;
+
+ filestore_perf_stat_t get_cur_stats() const {
+ filestore_perf_stat_t ret;
+ ret.filestore_commit_latency = os_commit_latency.avg();
+ ret.filestore_apply_latency = os_apply_latency.avg();
+ return ret;
+ }
+
+ void update_from_perfcounters(PerfCounters &logger);
+ } perf_tracker;
+ filestore_perf_stat_t get_cur_stats() {
+ perf_tracker.update_from_perfcounters(*logger);
+ return perf_tracker.get_cur_stats();
+ }
+
static const uint32_t on_disk_version = 3;
private:
string internal_name; ///< internal name, used to name the perfcounter instance
diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h
index 6bfefa09a47..eb5b40c5a69 100644
--- a/src/os/ObjectStore.h
+++ b/src/os/ObjectStore.h
@@ -81,6 +81,8 @@ public:
Logger *logger;
+ virtual filestore_perf_stat_t get_cur_stats() = 0;
+
/**
* a sequencer orders transactions
*
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 1a77dae730a..14bdc87487c 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -3648,6 +3648,8 @@ void OSD::send_pg_stats(const utime_t &now)
stat_lock.Lock();
osd_stat_t cur_stat = osd_stat;
stat_lock.Unlock();
+
+ osd_stat.fs_perf_stat = store->get_cur_stats();
pg_stat_queue_lock.Lock();