summaryrefslogtreecommitdiff
path: root/src/mongo/util/processinfo_osx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/util/processinfo_osx.cpp')
-rw-r--r--src/mongo/util/processinfo_osx.cpp279
1 files changed, 142 insertions, 137 deletions
diff --git a/src/mongo/util/processinfo_osx.cpp b/src/mongo/util/processinfo_osx.cpp
index 994b4759e81..abbe2a62522 100644
--- a/src/mongo/util/processinfo_osx.cpp
+++ b/src/mongo/util/processinfo_osx.cpp
@@ -52,176 +52,181 @@ using namespace std;
namespace mongo {
- ProcessInfo::ProcessInfo( ProcessId pid ) : _pid( pid ) {
- }
+ProcessInfo::ProcessInfo(ProcessId pid) : _pid(pid) {}
- ProcessInfo::~ProcessInfo() {
- }
+ProcessInfo::~ProcessInfo() {}
- bool ProcessInfo::supported() {
- return true;
- }
+bool ProcessInfo::supported() {
+ return true;
+}
- int ProcessInfo::getVirtualMemorySize() {
- task_t result;
+int ProcessInfo::getVirtualMemorySize() {
+ task_t result;
- mach_port_t task;
+ mach_port_t task;
- if ((result = task_for_pid(mach_task_self(), _pid.toNative(), &task)) != KERN_SUCCESS) {
- cout << "error getting task\n";
- return 0;
- }
+ if ((result = task_for_pid(mach_task_self(), _pid.toNative(), &task)) != KERN_SUCCESS) {
+ cout << "error getting task\n";
+ return 0;
+ }
#if !defined(__LP64__)
- task_basic_info_32 ti;
+ task_basic_info_32 ti;
#else
- task_basic_info_64 ti;
+ task_basic_info_64 ti;
#endif
- mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT;
- if ( ( result = task_info( task , TASK_BASIC_INFO , (task_info_t)&ti, &count ) ) != KERN_SUCCESS ) {
- cout << "error getting task_info: " << result << endl;
- return 0;
- }
- return (int)((double)ti.virtual_size / (1024.0 * 1024 ) );
+ mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT;
+ if ((result = task_info(task, TASK_BASIC_INFO, (task_info_t)&ti, &count)) != KERN_SUCCESS) {
+ cout << "error getting task_info: " << result << endl;
+ return 0;
}
+ return (int)((double)ti.virtual_size / (1024.0 * 1024));
+}
- int ProcessInfo::getResidentSize() {
- task_t result;
+int ProcessInfo::getResidentSize() {
+ task_t result;
- mach_port_t task;
+ mach_port_t task;
- if ((result = task_for_pid(mach_task_self(), _pid.toNative(), &task)) != KERN_SUCCESS) {
- cout << "error getting task\n";
- return 0;
- }
+ if ((result = task_for_pid(mach_task_self(), _pid.toNative(), &task)) != KERN_SUCCESS) {
+ cout << "error getting task\n";
+ return 0;
+ }
#if !defined(__LP64__)
- task_basic_info_32 ti;
+ task_basic_info_32 ti;
#else
- task_basic_info_64 ti;
+ task_basic_info_64 ti;
#endif
- mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT;
- if ( ( result = task_info( task , TASK_BASIC_INFO , (task_info_t)&ti, &count ) ) != KERN_SUCCESS ) {
- cout << "error getting task_info: " << result << endl;
- return 0;
- }
- return (int)( ti.resident_size / (1024 * 1024 ) );
- }
-
- double ProcessInfo::getSystemMemoryPressurePercentage() {
- return 0.0;
+ mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT;
+ if ((result = task_info(task, TASK_BASIC_INFO, (task_info_t)&ti, &count)) != KERN_SUCCESS) {
+ cout << "error getting task_info: " << result << endl;
+ return 0;
}
+ return (int)(ti.resident_size / (1024 * 1024));
+}
- void ProcessInfo::getExtraInfo(BSONObjBuilder& info) {
- struct task_events_info taskInfo;
- mach_msg_type_number_t taskInfoCount = TASK_EVENTS_INFO_COUNT;
+double ProcessInfo::getSystemMemoryPressurePercentage() {
+ return 0.0;
+}
- if ( KERN_SUCCESS != task_info(mach_task_self(), TASK_EVENTS_INFO,
- (integer_t*)&taskInfo, &taskInfoCount) ) {
- cout << "error getting extra task_info" << endl;
- return;
- }
+void ProcessInfo::getExtraInfo(BSONObjBuilder& info) {
+ struct task_events_info taskInfo;
+ mach_msg_type_number_t taskInfoCount = TASK_EVENTS_INFO_COUNT;
- info.append("page_faults", taskInfo.pageins);
+ if (KERN_SUCCESS !=
+ task_info(mach_task_self(), TASK_EVENTS_INFO, (integer_t*)&taskInfo, &taskInfoCount)) {
+ cout << "error getting extra task_info" << endl;
+ return;
}
- /**
- * Get a sysctl string value by name. Use string specialization by default.
- */
- typedef long long NumberVal;
- template <typename Variant>
- Variant getSysctlByName( const char * sysctlName ) {
- string value;
- size_t len;
- int status;
- // NB: sysctlbyname is called once to determine the buffer length, and once to copy
- // the sysctl value. Retry if the buffer length grows between calls.
- do {
- status = sysctlbyname(sysctlName, NULL, &len, NULL, 0);
- if (status == -1)
- break;
- value.resize(len);
- status = sysctlbyname(sysctlName, &*value.begin(), &len, NULL, 0);
- } while (status == -1 && errno == ENOMEM);
- if (status == -1) {
- // unrecoverable error from sysctlbyname
- log() << sysctlName << " unavailable" << endl;
- return "";
- }
+ info.append("page_faults", taskInfo.pageins);
+}
+
+/**
+ * Get a sysctl string value by name. Use string specialization by default.
+ */
+typedef long long NumberVal;
+template <typename Variant>
+Variant getSysctlByName(const char* sysctlName) {
+ string value;
+ size_t len;
+ int status;
+ // NB: sysctlbyname is called once to determine the buffer length, and once to copy
+ // the sysctl value. Retry if the buffer length grows between calls.
+ do {
+ status = sysctlbyname(sysctlName, NULL, &len, NULL, 0);
+ if (status == -1)
+ break;
value.resize(len);
- return value;
+ status = sysctlbyname(sysctlName, &*value.begin(), &len, NULL, 0);
+ } while (status == -1 && errno == ENOMEM);
+ if (status == -1) {
+ // unrecoverable error from sysctlbyname
+ log() << sysctlName << " unavailable" << endl;
+ return "";
}
+ value.resize(len);
+ return value;
+}
- /**
- * Get a sysctl integer value by name (specialization)
- */
- template <>
- long long getSysctlByName< NumberVal > ( const char * sysctlName ) {
- long long value = 0;
- size_t len = sizeof(value);
- if ( sysctlbyname(sysctlName, &value, &len, NULL, 0) < 0 ) {
- log() << "Unable to resolve sysctl " << sysctlName << " (number) " << endl;
- }
- if (len > 8) {
- log() << "Unable to resolve sysctl " << sysctlName << " as integer. System returned " << len << " bytes." << endl;
- }
- return value;
+/**
+ * Get a sysctl integer value by name (specialization)
+ */
+template <>
+long long getSysctlByName<NumberVal>(const char* sysctlName) {
+ long long value = 0;
+ size_t len = sizeof(value);
+ if (sysctlbyname(sysctlName, &value, &len, NULL, 0) < 0) {
+ log() << "Unable to resolve sysctl " << sysctlName << " (number) " << endl;
}
-
- void ProcessInfo::SystemInfo::collectSystemInfo() {
- osType = "Darwin";
- osName = "Mac OS X";
- osVersion = getSysctlByName< string >( "kern.osrelease");
- addrSize = (getSysctlByName< NumberVal >( "hw.cpu64bit_capable" ) ? 64 : 32);
- memSize = getSysctlByName< NumberVal >( "hw.memsize" );
- numCores = getSysctlByName< NumberVal >( "hw.ncpu" ); // includes hyperthreading cores
- pageSize = static_cast<unsigned long long>(sysconf( _SC_PAGESIZE ));
- cpuArch = getSysctlByName< string >( "hw.machine" );
- hasNuma = checkNumaEnabled();
-
- BSONObjBuilder bExtra;
- bExtra.append( "versionString", getSysctlByName< string >( "kern.version" ) );
- bExtra.append( "alwaysFullSync", static_cast< int >( getSysctlByName< NumberVal >( "vfs.generic.always_do_fullfsync" ) ) );
- bExtra.append( "nfsAsync", static_cast< int >( getSysctlByName< NumberVal >( "vfs.generic.nfs.client.allow_async" ) ) );
- bExtra.append( "model", getSysctlByName< string >( "hw.model" ) );
- bExtra.append( "physicalCores", static_cast< int >( getSysctlByName< NumberVal >( "machdep.cpu.core_count" ) ) );
- bExtra.append( "cpuFrequencyMHz", static_cast< int >( (getSysctlByName< NumberVal >( "hw.cpufrequency" ) / (1000 * 1000)) ) );
- bExtra.append( "cpuString", getSysctlByName< string >( "machdep.cpu.brand_string" ) );
- bExtra.append( "cpuFeatures", getSysctlByName< string >( "machdep.cpu.features" ) + string(" ") +
- getSysctlByName< string >( "machdep.cpu.extfeatures" ) );
- bExtra.append( "pageSize", static_cast< int >( getSysctlByName< NumberVal >( "hw.pagesize" ) ) );
- bExtra.append( "scheduler", getSysctlByName< string >( "kern.sched" ) );
- _extraStats = bExtra.obj();
+ if (len > 8) {
+ log() << "Unable to resolve sysctl " << sysctlName << " as integer. System returned "
+ << len << " bytes." << endl;
}
+ return value;
+}
- bool ProcessInfo::checkNumaEnabled() {
- return false;
- }
+void ProcessInfo::SystemInfo::collectSystemInfo() {
+ osType = "Darwin";
+ osName = "Mac OS X";
+ osVersion = getSysctlByName<string>("kern.osrelease");
+ addrSize = (getSysctlByName<NumberVal>("hw.cpu64bit_capable") ? 64 : 32);
+ memSize = getSysctlByName<NumberVal>("hw.memsize");
+ numCores = getSysctlByName<NumberVal>("hw.ncpu"); // includes hyperthreading cores
+ pageSize = static_cast<unsigned long long>(sysconf(_SC_PAGESIZE));
+ cpuArch = getSysctlByName<string>("hw.machine");
+ hasNuma = checkNumaEnabled();
+
+ BSONObjBuilder bExtra;
+ bExtra.append("versionString", getSysctlByName<string>("kern.version"));
+ bExtra.append("alwaysFullSync",
+ static_cast<int>(getSysctlByName<NumberVal>("vfs.generic.always_do_fullfsync")));
+ bExtra.append(
+ "nfsAsync",
+ static_cast<int>(getSysctlByName<NumberVal>("vfs.generic.nfs.client.allow_async")));
+ bExtra.append("model", getSysctlByName<string>("hw.model"));
+ bExtra.append("physicalCores",
+ static_cast<int>(getSysctlByName<NumberVal>("machdep.cpu.core_count")));
+ bExtra.append(
+ "cpuFrequencyMHz",
+ static_cast<int>((getSysctlByName<NumberVal>("hw.cpufrequency") / (1000 * 1000))));
+ bExtra.append("cpuString", getSysctlByName<string>("machdep.cpu.brand_string"));
+ bExtra.append("cpuFeatures",
+ getSysctlByName<string>("machdep.cpu.features") + string(" ") +
+ getSysctlByName<string>("machdep.cpu.extfeatures"));
+ bExtra.append("pageSize", static_cast<int>(getSysctlByName<NumberVal>("hw.pagesize")));
+ bExtra.append("scheduler", getSysctlByName<string>("kern.sched"));
+ _extraStats = bExtra.obj();
+}
- bool ProcessInfo::blockCheckSupported() {
- return true;
- }
+bool ProcessInfo::checkNumaEnabled() {
+ return false;
+}
- bool ProcessInfo::blockInMemory(const void* start) {
- char x = 0;
- if (mincore(alignToStartOfPage(start), getPageSize(), &x)) {
- log() << "mincore failed: " << errnoWithDescription() << endl;
- return 1;
- }
- return x & 0x1;
- }
+bool ProcessInfo::blockCheckSupported() {
+ return true;
+}
- bool ProcessInfo::pagesInMemory(const void* start, size_t numPages, vector<char>* out) {
- out->resize(numPages);
- if (mincore(alignToStartOfPage(start), numPages * getPageSize(), &out->front())) {
- log() << "mincore failed: " << errnoWithDescription() << endl;
- return false;
- }
- for (size_t i = 0; i < numPages; ++i) {
- (*out)[i] &= 0x1;
- }
- return true;
+bool ProcessInfo::blockInMemory(const void* start) {
+ char x = 0;
+ if (mincore(alignToStartOfPage(start), getPageSize(), &x)) {
+ log() << "mincore failed: " << errnoWithDescription() << endl;
+ return 1;
}
+ return x & 0x1;
+}
+bool ProcessInfo::pagesInMemory(const void* start, size_t numPages, vector<char>* out) {
+ out->resize(numPages);
+ if (mincore(alignToStartOfPage(start), numPages * getPageSize(), &out->front())) {
+ log() << "mincore failed: " << errnoWithDescription() << endl;
+ return false;
+ }
+ for (size_t i = 0; i < numPages; ++i) {
+ (*out)[i] &= 0x1;
+ }
+ return true;
+}
}