diff options
Diffstat (limited to 'src/mongo/util/processinfo_solaris.cpp')
-rw-r--r-- | src/mongo/util/processinfo_solaris.cpp | 320 |
1 files changed, 156 insertions, 164 deletions
diff --git a/src/mongo/util/processinfo_solaris.cpp b/src/mongo/util/processinfo_solaris.cpp index 5cbb51740b4..f42717f82d0 100644 --- a/src/mongo/util/processinfo_solaris.cpp +++ b/src/mongo/util/processinfo_solaris.cpp @@ -52,194 +52,186 @@ using namespace std; namespace mongo { - /** - * Read the first line from a file; return empty string on failure - */ - static string readLineFromFile(const char* fname) { - std::string fstr; - std::ifstream f(fname); - if (f.is_open()) { - std::getline(f, fstr); - } - return fstr; +/** + * Read the first line from a file; return empty string on failure + */ +static string readLineFromFile(const char* fname) { + std::string fstr; + std::ifstream f(fname); + if (f.is_open()) { + std::getline(f, fstr); } + return fstr; +} - struct ProcPsinfo { - ProcPsinfo() { - FILE* f = fopen("/proc/self/psinfo", "r"); - massert(16846, - mongoutils::str::stream() << "couldn't open \"/proc/self/psinfo\": " - << errnoWithDescription(), - f); - size_t num = fread(&psinfo, sizeof(psinfo), 1, f); - int err = errno; - fclose(f); - massert(16847, - mongoutils::str::stream() << "couldn't read from \"/proc/self/psinfo\": " - << errnoWithDescription(err), - num == 1); - } - psinfo_t psinfo; - }; - - struct ProcUsage { - ProcUsage() { - FILE* f = fopen("/proc/self/usage", "r"); - massert(16848, - mongoutils::str::stream() << "couldn't open \"/proc/self/usage\": " - << errnoWithDescription(), - f); - size_t num = fread(&prusage, sizeof(prusage), 1, f); - int err = errno; - fclose(f); - massert(16849, - mongoutils::str::stream() << "couldn't read from \"/proc/self/usage\": " - << errnoWithDescription(err), - num == 1); - } - prusage_t prusage; - }; +struct ProcPsinfo { + ProcPsinfo() { + FILE* f = fopen("/proc/self/psinfo", "r"); + massert(16846, + mongoutils::str::stream() + << "couldn't open \"/proc/self/psinfo\": " << errnoWithDescription(), + f); + size_t num = fread(&psinfo, sizeof(psinfo), 1, f); + int err = errno; + fclose(f); + massert(16847, + mongoutils::str::stream() + << "couldn't read from \"/proc/self/psinfo\": " << errnoWithDescription(err), + num == 1); + } + psinfo_t psinfo; +}; + +struct ProcUsage { + ProcUsage() { + FILE* f = fopen("/proc/self/usage", "r"); + massert(16848, + mongoutils::str::stream() + << "couldn't open \"/proc/self/usage\": " << errnoWithDescription(), + f); + size_t num = fread(&prusage, sizeof(prusage), 1, f); + int err = errno; + fclose(f); + massert(16849, + mongoutils::str::stream() + << "couldn't read from \"/proc/self/usage\": " << errnoWithDescription(err), + num == 1); + } + prusage_t prusage; +}; - ProcessInfo::ProcessInfo(ProcessId pid) : _pid(pid) { } - ProcessInfo::~ProcessInfo() { } +ProcessInfo::ProcessInfo(ProcessId pid) : _pid(pid) {} +ProcessInfo::~ProcessInfo() {} - bool ProcessInfo::supported() { - return true; - } +bool ProcessInfo::supported() { + return true; +} - int ProcessInfo::getVirtualMemorySize() { - ProcPsinfo p; - return static_cast<int>(p.psinfo.pr_size / 1024); - } +int ProcessInfo::getVirtualMemorySize() { + ProcPsinfo p; + return static_cast<int>(p.psinfo.pr_size / 1024); +} - int ProcessInfo::getResidentSize() { - ProcPsinfo p; - return static_cast<int>(p.psinfo.pr_rssize / 1024); - } +int ProcessInfo::getResidentSize() { + ProcPsinfo p; + return static_cast<int>(p.psinfo.pr_rssize / 1024); +} - double ProcessInfo::getSystemMemoryPressurePercentage() { - return 0.0; - } +double ProcessInfo::getSystemMemoryPressurePercentage() { + return 0.0; +} - void ProcessInfo::getExtraInfo(BSONObjBuilder& info) { - ProcUsage p; - info.appendNumber("page_faults", static_cast<long long>(p.prusage.pr_majf)); - } +void ProcessInfo::getExtraInfo(BSONObjBuilder& info) { + ProcUsage p; + info.appendNumber("page_faults", static_cast<long long>(p.prusage.pr_majf)); +} - /** - * Save a BSON obj representing the host system's details - */ - void ProcessInfo::SystemInfo::collectSystemInfo() { - struct utsname unameData; - if (uname(&unameData) == -1) { - log() << "Unable to collect detailed system information: " << strerror(errno) << endl; - } +/** + * Save a BSON obj representing the host system's details + */ +void ProcessInfo::SystemInfo::collectSystemInfo() { + struct utsname unameData; + if (uname(&unameData) == -1) { + log() << "Unable to collect detailed system information: " << strerror(errno) << endl; + } - char buf_64[32]; - char buf_native[32]; - if (sysinfo(SI_ARCHITECTURE_64, buf_64, sizeof(buf_64)) != -1 && - sysinfo(SI_ARCHITECTURE_NATIVE, buf_native, sizeof(buf_native)) != -1) { - addrSize = mongoutils::str::equals(buf_64, buf_native) ? 64 : 32; - } - else { - log() << "Unable to determine system architecture: " << strerror(errno) << endl; - } + char buf_64[32]; + char buf_native[32]; + if (sysinfo(SI_ARCHITECTURE_64, buf_64, sizeof(buf_64)) != -1 && + sysinfo(SI_ARCHITECTURE_NATIVE, buf_native, sizeof(buf_native)) != -1) { + addrSize = mongoutils::str::equals(buf_64, buf_native) ? 64 : 32; + } else { + log() << "Unable to determine system architecture: " << strerror(errno) << endl; + } - osType = unameData.sysname; - osName = mongoutils::str::ltrim(readLineFromFile("/etc/release")); - osVersion = unameData.version; - pageSize = static_cast<unsigned long long>(sysconf(_SC_PAGESIZE)); - memSize = pageSize * static_cast<unsigned long long>(sysconf(_SC_PHYS_PAGES)); - numCores = static_cast<unsigned>(sysconf(_SC_NPROCESSORS_CONF)); - cpuArch = unameData.machine; - hasNuma = checkNumaEnabled(); - - // We prefer FSync over msync, when: - // 1. Pre-Oracle Solaris 11.2 releases - // 2. Illumos kernel releases (which is all non Oracle Solaris releases) - preferMsyncOverFSync = false; - - if (mongoutils::str::startsWith(osName, "Oracle Solaris")) { - - std::vector<std::string> versionComponents; - splitStringDelim(osVersion, &versionComponents, '.'); - - if (versionComponents.size() > 1) { - unsigned majorInt, minorInt; - Status majorStatus = - parseNumberFromString<unsigned>(versionComponents[0], &majorInt); - - Status minorStatus = - parseNumberFromString<unsigned>(versionComponents[1], &minorInt); - - if (!majorStatus.isOK() || !minorStatus.isOK()) { - warning() << "Could not parse OS version numbers from uname: " << osVersion; - } - else if ((majorInt == 11 && minorInt >= 2) || majorInt > 11) { - preferMsyncOverFSync = true; - } - } - else { - warning() << "Could not parse OS version string from uname: " << osVersion; + osType = unameData.sysname; + osName = mongoutils::str::ltrim(readLineFromFile("/etc/release")); + osVersion = unameData.version; + pageSize = static_cast<unsigned long long>(sysconf(_SC_PAGESIZE)); + memSize = pageSize * static_cast<unsigned long long>(sysconf(_SC_PHYS_PAGES)); + numCores = static_cast<unsigned>(sysconf(_SC_NPROCESSORS_CONF)); + cpuArch = unameData.machine; + hasNuma = checkNumaEnabled(); + + // We prefer FSync over msync, when: + // 1. Pre-Oracle Solaris 11.2 releases + // 2. Illumos kernel releases (which is all non Oracle Solaris releases) + preferMsyncOverFSync = false; + + if (mongoutils::str::startsWith(osName, "Oracle Solaris")) { + std::vector<std::string> versionComponents; + splitStringDelim(osVersion, &versionComponents, '.'); + + if (versionComponents.size() > 1) { + unsigned majorInt, minorInt; + Status majorStatus = parseNumberFromString<unsigned>(versionComponents[0], &majorInt); + + Status minorStatus = parseNumberFromString<unsigned>(versionComponents[1], &minorInt); + + if (!majorStatus.isOK() || !minorStatus.isOK()) { + warning() << "Could not parse OS version numbers from uname: " << osVersion; + } else if ((majorInt == 11 && minorInt >= 2) || majorInt > 11) { + preferMsyncOverFSync = true; } + } else { + warning() << "Could not parse OS version string from uname: " << osVersion; } - - BSONObjBuilder bExtra; - bExtra.append("kernelVersion", unameData.release); - bExtra.append("pageSize", static_cast<long long>(pageSize)); - bExtra.append("numPages", static_cast<int>(sysconf(_SC_PHYS_PAGES))); - bExtra.append("maxOpenFiles", static_cast<int>(sysconf(_SC_OPEN_MAX))); - _extraStats = bExtra.obj(); } - bool ProcessInfo::checkNumaEnabled() { - lgrp_cookie_t cookie = lgrp_init(LGRP_VIEW_OS); + BSONObjBuilder bExtra; + bExtra.append("kernelVersion", unameData.release); + bExtra.append("pageSize", static_cast<long long>(pageSize)); + bExtra.append("numPages", static_cast<int>(sysconf(_SC_PHYS_PAGES))); + bExtra.append("maxOpenFiles", static_cast<int>(sysconf(_SC_OPEN_MAX))); + _extraStats = bExtra.obj(); +} - if (cookie == LGRP_COOKIE_NONE) { - warning() << "lgrp_init failed: " << errnoWithDescription(); - return false; - } +bool ProcessInfo::checkNumaEnabled() { + lgrp_cookie_t cookie = lgrp_init(LGRP_VIEW_OS); - ON_BLOCK_EXIT(lgrp_fini, cookie); + if (cookie == LGRP_COOKIE_NONE) { + warning() << "lgrp_init failed: " << errnoWithDescription(); + return false; + } - int groups = lgrp_nlgrps(cookie); + ON_BLOCK_EXIT(lgrp_fini, cookie); - if (groups == -1) { - warning() << "lgrp_nlgrps failed: " << errnoWithDescription(); - return false; - } + int groups = lgrp_nlgrps(cookie); - // NUMA machines have more then 1 locality group - return groups > 1; + if (groups == -1) { + warning() << "lgrp_nlgrps failed: " << errnoWithDescription(); + return false; } - bool ProcessInfo::blockCheckSupported() { - return true; - } + // NUMA machines have more then 1 locality group + return groups > 1; +} - bool ProcessInfo::blockInMemory(const void* start) { - char x = 0; - if (mincore(static_cast<char*>(const_cast<void*>(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, std::vector<char>* out) { - out->resize(numPages); - if (mincore(static_cast<char*>(const_cast<void*>(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( + static_cast<char*>(const_cast<void*>(alignToStartOfPage(start))), getPageSize(), &x)) { + log() << "mincore failed: " << errnoWithDescription() << endl; + return 1; } + return x & 0x1; +} +bool ProcessInfo::pagesInMemory(const void* start, size_t numPages, std::vector<char>* out) { + out->resize(numPages); + if (mincore(static_cast<char*>(const_cast<void*>(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; +} } |