From e4a1f917ad7a808e70018079ba1dac6d75831833 Mon Sep 17 00:00:00 2001 From: Mathias Stearn Date: Mon, 21 Oct 2013 15:45:24 -0400 Subject: [PATCH] SERVER-6950 Add a TCMalloc ServerStatusSection --- SConstruct | 1 + src/mongo/SConscript | 9 +- .../util/tcmalloc_server_status_section.cpp | 82 +++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/mongo/util/tcmalloc_server_status_section.cpp diff --git a/SConstruct b/SConstruct index 9a1c888dd32..6f5cda6f019 100644 --- a/SConstruct +++ b/SConstruct @@ -1670,6 +1670,7 @@ module_sconscripts = moduleconfig.get_module_sconscripts(mongo_modules) Export("env") Export("shellEnv") Export("testEnv") +Export("get_option") Export("has_option use_system_version_of_library") Export("installSetup mongoCodeVersion") Export("usev8") diff --git a/src/mongo/SConscript b/src/mongo/SConscript index 1b40464c025..10488232b9a 100644 --- a/src/mongo/SConscript +++ b/src/mongo/SConscript @@ -10,6 +10,7 @@ Import("env") Import("shellEnv") Import("testEnv") Import("has_option") +Import("get_option") Import("usev8") Import("installSetup") Import("enforce_glibc") @@ -366,6 +367,10 @@ env.CppUnitTest( ] ) +tcmallocServerStatus = [] +if get_option('allocator') == 'tcmalloc': + tcmallocServerStatus.append("util/tcmalloc_server_status_section.cpp") + env.StaticLibrary("coredb", [ "client/parallel.cpp", "db/audit.cpp", @@ -420,7 +425,9 @@ env.StaticLibrary("coredb", [ "db/stats/timer_stats.cpp", "db/stats/top.cpp", "s/shardconnection.cpp", - ], + ] + + tcmallocServerStatus + , LIBDEPS=['db/auth/serverauth', 'db/common', 'server_parameters', diff --git a/src/mongo/util/tcmalloc_server_status_section.cpp b/src/mongo/util/tcmalloc_server_status_section.cpp new file mode 100644 index 00000000000..2dfed8cb2bf --- /dev/null +++ b/src/mongo/util/tcmalloc_server_status_section.cpp @@ -0,0 +1,82 @@ +/* Copyright 2013 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mongo/platform/basic.h" + +#include + +#include "mongo/db/commands/server_status.h" + +namespace mongo { +namespace { + class TCMallocServerStatusSection : public ServerStatusSection { + public: + + TCMallocServerStatusSection() : ServerStatusSection("tcmalloc") {} + virtual bool includeByDefault() const { return false; } + + virtual BSONObj generateSection(const BSONElement& configElement) const { + BSONObjBuilder builder; + + // For a list of properties see the "Generic Tcmalloc Status" section of + // http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html and + // http://code.google.com/p/gperftools/source/browse/src/gperftools/malloc_extension.h + { + BSONObjBuilder sub(builder.subobjStart("generic")); + appendNumericPropertyIfAvailable(sub, "current_allocated_bytes", + "generic.current_allocated_bytes"); + appendNumericPropertyIfAvailable(sub, "heap_size", + "generic.heap_size"); + } + { + BSONObjBuilder sub(builder.subobjStart("tcmalloc")); + appendNumericPropertyIfAvailable(sub, "pageheap_free_bytes", + "tcmalloc.pageheap_free_bytes"); + appendNumericPropertyIfAvailable(sub, "pageheap_unmapped_bytes", + "tcmalloc.pageheap_unmapped_bytes"); + appendNumericPropertyIfAvailable(sub, "max_total_thread_cache_bytes", + "tcmalloc.max_total_thread_cache_bytes"); + appendNumericPropertyIfAvailable(sub, "current_total_thread_cache_bytes", + "tcmalloc.current_total_thread_cache_bytes"); + // Not including tcmalloc.slack_bytes since it is deprecated. + + // These are not available in our version but are available with use-system-tcmalloc + appendNumericPropertyIfAvailable(sub, "central_cache_free_bytes", + "tcmalloc.central_cache_free_bytes"); + appendNumericPropertyIfAvailable(sub, "transfer_cache_free_bytes", + "tcmalloc.transfer_cache_free_bytes"); + appendNumericPropertyIfAvailable(sub, "thread_cache_free_bytes", + "tcmalloc.thread_cache_free_bytes"); + } + + char buffer[4096]; + MallocExtension::instance()->GetStats(buffer, sizeof(buffer)); + builder.append("formattedString", buffer); + + return builder.obj(); + } + + private: + static void appendNumericPropertyIfAvailable(BSONObjBuilder& builder, + StringData bsonName, + const char* property) { + size_t value; + if (MallocExtension::instance()->GetNumericProperty(property, &value)) + builder.appendNumber(bsonName, value); + } + } tcmallocServerStatusSection; +} +} +