common/version.cc \
common/hex.cc
+if WITH_PROFILER
+libcommon_files += perfglue/cpu_profiler.cc
+else
+libcommon_files += perfglue/disabled_stubs.cc
+endif
+
libcrush_a_SOURCES = \
crush/builder.c \
crush/mapper.c \
osdc/Journaler.h\
osdc/ObjectCacher.h\
osdc/Objecter.h\
+ perfglue/cpu_profiler.h\
rgw/rgw_access.h\
rgw/rgw_acl.h\
rgw/rgw_fs.h\
#include "include/types.h"
#include "include/encoding.h"
+#include "msg/msg_types.h" // for entity_inst_t
typedef enum {
CLOG_DEBUG = 0,
/*
* ceph_fs.cc - Some Ceph functions that are shared between kernel space and
* user space.
+ *
*/
/*
#include "common/config.h"
-#ifdef HAVE_PROFILER
-# include <google/profiler.h>
-#endif
+#include "perfglue/cpu_profiler.h"
#define DOUT_SUBSYS mds
} else dout(0) << "bad migrate_dir target syntax" << dendl;
} else dout(0) << "bad migrate_dir syntax" << dendl;
}
-
- else if (m->cmd[0] == "cpu_profiler_start" && m->cmd.size() == 2) {
-#ifdef HAVE_PROFILER
- int r = ProfilerStart(m->cmd[1].c_str());
- clog.info() << "cpu_profiler start, logging to " << m->cmd[1] << ", r=" << r << "\n";
-#else
- clog.info() << "cpu_profiler support not linked in\n";
-#endif
- }
- else if (m->cmd[0] == "cpu_profiler_status") {
-#ifdef HAVE_PROFILER
- if (ProfilingIsEnabledForAllThreads())
- clog.info() << "cpu_profiler is enabled\n";
- else
- clog.info() << "cpu_profiler is not enabled\n";
- ProfilerState st;
- ProfilerGetCurrentState(&st);
- clog.info() << "cpu_profiler " << (st.enabled ? "enabled":"not enabled")
- << " start_time " << st.start_time
- << " profile_name " << st.profile_name
- << " samples " << st.samples_gathered
- << "\n";
-#else
- clog.info() << "cpu_profiler support not linked in\n";
-#endif
- }
- else if (m->cmd[0] == "cpu_profiler_flush") {
-#ifdef HAVE_PROFILER
- clog.info() << "cpu_profiler flush\n";
- ProfilerFlush();
-#else
- clog.info() << "cpu_profiler support not linked in\n";
-#endif
- }
- else if (m->cmd[0] == "cpu_profiler_stop") {
-#ifdef HAVE_PROFILER
- clog.info() << "cpu_profiler flush and stop\n";
- ProfilerFlush();
- ProfilerStop();
-#else
- clog.info() << "cpu_profiler support not linked in\n";
-#endif
+ else if (m->cmd[0] == "cpu_profiler") {
+ cpu_profiler_handle_command(m->cmd, clog);
}
-
else if (m->cmd.size() == 1 && m->cmd[0] == "heap_profiler_options") {
char val[sizeof(int)*8+1];
snprintf(val, sizeof(val), "%i", g_conf.profiler_allocation_interval);
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#include "common/LogClient.h"
+#include "perfglue/cpu_profiler.h"
+
+#include <google/profiler.h>
+
+void cpu_profiler_handle_command(const std::vector<std::string> &cmd,
+ LogClient &clog)
+{
+ if (cmd[1] == "start") {
+ if (cmd.size() < 3) {
+ clog.info() << "cpu_profiler: you must give an argument to start: a "
+ << "file name to log to.\n";
+ return;
+ }
+ const char *file = cmd[2].c_str();
+ int r = ProfilerStart(file);
+ clog.info() << "cpu_profiler: starting logging to " << file
+ << ", r=" << r << "\n";
+ }
+ else if (cmd[1] == "status") {
+ if (ProfilingIsEnabledForAllThreads())
+ clog.info() << "cpu_profiler is enabled\n";
+ else
+ clog.info() << "cpu_profiler is not enabled\n";
+ ProfilerState st;
+ ProfilerGetCurrentState(&st);
+ clog.info() << "cpu_profiler " << (st.enabled ? "enabled":"not enabled")
+ << " start_time " << st.start_time
+ << " profile_name " << st.profile_name
+ << " samples " << st.samples_gathered
+ << "\n";
+ }
+ else if (cmd[1] == "flush") {
+ clog.info() << "cpu_profiler: flushing\n";
+ ProfilerFlush();
+ }
+ else if (cmd[1] == "stop") {
+ clog.info() << "cpu_profiler: flushing and stopping\n";
+ ProfilerFlush();
+ ProfilerStop();
+ }
+ else {
+ clog.info() << "can't understand cpu_profiler command. Expected one of: "
+ << "start,status,flush,stop.\n";
+ }
+}
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+#ifndef CEPH_PERFGLUE_CPU_PROFILER
+
+/*
+ * Ceph glue for the Google Perftools CPU profiler
+ */
+#include <string>
+#include <vector>
+
+class LogClient;
+
+void cpu_profiler_handle_command(const std::vector<std::string> &cmd,
+ LogClient &clog);
+
+#endif
--- /dev/null
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#include "common/LogClient.h"
+#include "perfglue/cpu_profiler.h"
+
+#include <vector>
+#include <string>
+
+void cpu_profiler_handle_command(const std::vector<std::string> &cmd,
+ LogClient &clog)
+{
+ clog.info() << "cpu_profiler support not linked in\n";
+}