diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2015-06-20 00:22:50 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2015-06-20 10:56:02 -0400 |
commit | 9c2ed42daa8fbbef4a919c21ec564e2db55e8d60 (patch) | |
tree | 3814f79c10d7b490948d8cb7b112ac1dd41ceff1 /src/mongo/db/startup_warnings_mongod.cpp | |
parent | 01965cf52bce6976637ecb8f4a622aeb05ab256a (diff) | |
download | mongo-9c2ed42daa8fbbef4a919c21ec564e2db55e8d60.tar.gz |
SERVER-18579: Clang-Format - reformat code, no comment reflow
Diffstat (limited to 'src/mongo/db/startup_warnings_mongod.cpp')
-rw-r--r-- | src/mongo/db/startup_warnings_mongod.cpp | 499 |
1 files changed, 242 insertions, 257 deletions
diff --git a/src/mongo/db/startup_warnings_mongod.cpp b/src/mongo/db/startup_warnings_mongod.cpp index ff1b1647ba0..4d73540482c 100644 --- a/src/mongo/db/startup_warnings_mongod.cpp +++ b/src/mongo/db/startup_warnings_mongod.cpp @@ -48,308 +48,293 @@ namespace mongo { namespace { - const std::string kTransparentHugePagesDirectory("/sys/kernel/mm/transparent_hugepage"); +const std::string kTransparentHugePagesDirectory("/sys/kernel/mm/transparent_hugepage"); } // namespace - using std::ios_base; - using std::string; - - // static - StatusWith<std::string> StartupWarningsMongod::readTransparentHugePagesParameter( - const std::string& parameter) { - - return readTransparentHugePagesParameter(parameter, kTransparentHugePagesDirectory); - } - - // static - StatusWith<std::string> StartupWarningsMongod::readTransparentHugePagesParameter( - const std::string& parameter, - const std::string& directory) { - - std::string opMode; - try { - boost::filesystem::path directoryPath(directory); - if (!boost::filesystem::exists(directoryPath)) { - return StatusWith<std::string>(ErrorCodes::NonExistentPath, str::stream() - << "Unable to read non-existent transparent Huge Pages directory: " - << directory); - } +using std::ios_base; +using std::string; + +// static +StatusWith<std::string> StartupWarningsMongod::readTransparentHugePagesParameter( + const std::string& parameter) { + return readTransparentHugePagesParameter(parameter, kTransparentHugePagesDirectory); +} + +// static +StatusWith<std::string> StartupWarningsMongod::readTransparentHugePagesParameter( + const std::string& parameter, const std::string& directory) { + std::string opMode; + try { + boost::filesystem::path directoryPath(directory); + if (!boost::filesystem::exists(directoryPath)) { + return StatusWith<std::string>( + ErrorCodes::NonExistentPath, + str::stream() << "Unable to read non-existent transparent Huge Pages directory: " + << directory); + } - boost::filesystem::path parameterPath(directoryPath / parameter); - if (!boost::filesystem::exists(parameterPath)) { - return StatusWith<std::string>(ErrorCodes::NonExistentPath, str::stream() - << "Unable to read non-existent transparent Huge Pages file: " - << parameterPath.string()); - } + boost::filesystem::path parameterPath(directoryPath / parameter); + if (!boost::filesystem::exists(parameterPath)) { + return StatusWith<std::string>( + ErrorCodes::NonExistentPath, + str::stream() << "Unable to read non-existent transparent Huge Pages file: " + << parameterPath.string()); + } - std::string filename(parameterPath.string()); - std::ifstream ifs(filename.c_str()); - if (!ifs) { - return StatusWith<std::string>(ErrorCodes::FileNotOpen, str::stream() - << "Unable to open transparent Huge Pages file " << filename); - } + std::string filename(parameterPath.string()); + std::ifstream ifs(filename.c_str()); + if (!ifs) { + return StatusWith<std::string>( + ErrorCodes::FileNotOpen, + str::stream() << "Unable to open transparent Huge Pages file " << filename); + } - std::string line; - if (!std::getline(ifs, line)) { - int errorcode = errno; - return StatusWith<std::string>(ErrorCodes::FileStreamFailed, str::stream() - << "failed to read from " << filename << ": " - << ((ifs.eof()) ? "EOF" : errnoWithDescription(errorcode))); - } + std::string line; + if (!std::getline(ifs, line)) { + int errorcode = errno; + return StatusWith<std::string>( + ErrorCodes::FileStreamFailed, + str::stream() << "failed to read from " << filename << ": " + << ((ifs.eof()) ? "EOF" : errnoWithDescription(errorcode))); + } - std::string::size_type posBegin = line.find("["); - std::string::size_type posEnd = line.find("]"); - if (posBegin == string::npos || posEnd == string::npos || - posBegin >= posEnd) { - return StatusWith<std::string>(ErrorCodes::FailedToParse, str::stream() - << "cannot parse line: '" << line << "'"); - } + std::string::size_type posBegin = line.find("["); + std::string::size_type posEnd = line.find("]"); + if (posBegin == string::npos || posEnd == string::npos || posBegin >= posEnd) { + return StatusWith<std::string>(ErrorCodes::FailedToParse, + str::stream() << "cannot parse line: '" << line << "'"); + } - opMode = line.substr(posBegin + 1, posEnd - posBegin - 1); - if (opMode.empty()) { - return StatusWith<std::string>(ErrorCodes::BadValue, str::stream() - << "invalid mode in " << filename << ": '" << line << "'"); - } + opMode = line.substr(posBegin + 1, posEnd - posBegin - 1); + if (opMode.empty()) { + return StatusWith<std::string>(ErrorCodes::BadValue, + str::stream() << "invalid mode in " << filename << ": '" + << line << "'"); + } - // Check against acceptable values of opMode. - if (opMode != "always" && opMode != "madvise" && opMode != "never") { - return StatusWith<std::string>(ErrorCodes::BadValue, str::stream() + // Check against acceptable values of opMode. + if (opMode != "always" && opMode != "madvise" && opMode != "never") { + return StatusWith<std::string>( + ErrorCodes::BadValue, + str::stream() << "** WARNING: unrecognized transparent Huge Pages mode of operation in " << filename << ": '" << opMode << "''"); - } - } - catch (const boost::filesystem::filesystem_error& err) { - return StatusWith<std::string>(ErrorCodes::UnknownError, str::stream() - << "Failed to probe \"" << err.path1().string() << "\": " - << err.code().message()); } - - return StatusWith<std::string>(opMode); + } catch (const boost::filesystem::filesystem_error& err) { + return StatusWith<std::string>(ErrorCodes::UnknownError, + str::stream() << "Failed to probe \"" << err.path1().string() + << "\": " << err.code().message()); } - void logMongodStartupWarnings(const StorageGlobalParams& params) { - logCommonStartupWarnings(); + return StatusWith<std::string>(opMode); +} - bool warned = false; +void logMongodStartupWarnings(const StorageGlobalParams& params) { + logCommonStartupWarnings(); - if (sizeof(int*) == 4) { - log() << startupWarningsLog; - log() << "** NOTE: This is a 32 bit MongoDB binary." << startupWarningsLog; - log() << "** 32 bit builds are limited to less than 2GB of data " - << "(or less with --journal)." << startupWarningsLog; - if (!params.dur) { - log() << "** Note that journaling defaults to off for 32 bit " - << "and is currently off." << startupWarningsLog; - } - log() << "** See http://dochub.mongodb.org/core/32bit" << startupWarningsLog; - warned = true; - } + bool warned = false; - if (!ProcessInfo::blockCheckSupported()) { - log() << startupWarningsLog; - log() << "** NOTE: your operating system version does not support the method that " - << "MongoDB" << startupWarningsLog; - log() << "** uses to detect impending page faults." << startupWarningsLog; - log() << "** This may result in slower performance for certain use " - << "cases" << startupWarningsLog; - warned = true; + if (sizeof(int*) == 4) { + log() << startupWarningsLog; + log() << "** NOTE: This is a 32 bit MongoDB binary." << startupWarningsLog; + log() << "** 32 bit builds are limited to less than 2GB of data " + << "(or less with --journal)." << startupWarningsLog; + if (!params.dur) { + log() << "** Note that journaling defaults to off for 32 bit " + << "and is currently off." << startupWarningsLog; } + log() << "** See http://dochub.mongodb.org/core/32bit" << startupWarningsLog; + warned = true; + } + + if (!ProcessInfo::blockCheckSupported()) { + log() << startupWarningsLog; + log() << "** NOTE: your operating system version does not support the method that " + << "MongoDB" << startupWarningsLog; + log() << "** uses to detect impending page faults." << startupWarningsLog; + log() << "** This may result in slower performance for certain use " + << "cases" << startupWarningsLog; + warned = true; + } #ifdef __linux__ - if (boost::filesystem::exists("/proc/vz") && !boost::filesystem::exists("/proc/bc")) { - log() << startupWarningsLog; - log() << "** WARNING: You are running in OpenVZ which can cause issues on versions " - << "of RHEL older than RHEL6." << startupWarningsLog; - warned = true; - } + if (boost::filesystem::exists("/proc/vz") && !boost::filesystem::exists("/proc/bc")) { + log() << startupWarningsLog; + log() << "** WARNING: You are running in OpenVZ which can cause issues on versions " + << "of RHEL older than RHEL6." << startupWarningsLog; + warned = true; + } - bool hasMultipleNumaNodes = false; - try { - hasMultipleNumaNodes = boost::filesystem::exists("/sys/devices/system/node/node1"); - } catch(boost::filesystem::filesystem_error& e) { - log() << startupWarningsLog; - log() << "** WARNING: Cannot detect if NUMA interleaving is enabled. " - << "Failed to probe \"" << e.path1().string() << "\": " << e.code().message() - << startupWarningsLog; - } - if (hasMultipleNumaNodes) { - // We are on a box with a NUMA enabled kernel and more than 1 numa node (they start at - // node0) - // Now we look at the first line of /proc/self/numa_maps - // - // Bad example: - // $ cat /proc/self/numa_maps - // 00400000 default file=/bin/cat mapped=6 N4=6 - // - // Good example: - // $ numactl --interleave=all cat /proc/self/numa_maps - // 00400000 interleave:0-7 file=/bin/cat mapped=6 N4=6 - - std::ifstream f("/proc/self/numa_maps", std::ifstream::in); - if (f.is_open()) { - std::string line; //we only need the first line - std::getline(f, line); - if (f.fail()) { - warning() << "failed to read from /proc/self/numa_maps: " - << errnoWithDescription() << startupWarningsLog; + bool hasMultipleNumaNodes = false; + try { + hasMultipleNumaNodes = boost::filesystem::exists("/sys/devices/system/node/node1"); + } catch (boost::filesystem::filesystem_error& e) { + log() << startupWarningsLog; + log() << "** WARNING: Cannot detect if NUMA interleaving is enabled. " + << "Failed to probe \"" << e.path1().string() << "\": " << e.code().message() + << startupWarningsLog; + } + if (hasMultipleNumaNodes) { + // We are on a box with a NUMA enabled kernel and more than 1 numa node (they start at + // node0) + // Now we look at the first line of /proc/self/numa_maps + // + // Bad example: + // $ cat /proc/self/numa_maps + // 00400000 default file=/bin/cat mapped=6 N4=6 + // + // Good example: + // $ numactl --interleave=all cat /proc/self/numa_maps + // 00400000 interleave:0-7 file=/bin/cat mapped=6 N4=6 + + std::ifstream f("/proc/self/numa_maps", std::ifstream::in); + if (f.is_open()) { + std::string line; // we only need the first line + std::getline(f, line); + if (f.fail()) { + warning() << "failed to read from /proc/self/numa_maps: " << errnoWithDescription() + << startupWarningsLog; + warned = true; + } else { + // skip over pointer + std::string::size_type where = line.find(' '); + if ((where == std::string::npos) || (++where == line.size())) { + log() << startupWarningsLog; + log() << "** WARNING: cannot parse numa_maps line: '" << line << "'" + << startupWarningsLog; warned = true; } - else { - // skip over pointer - std::string::size_type where = line.find(' '); - if ((where == std::string::npos) || (++where == line.size())) { - log() << startupWarningsLog; - log() << "** WARNING: cannot parse numa_maps line: '" << line << "'" - << startupWarningsLog; - warned = true; - } - // if the text following the space doesn't begin with 'interleave', then - // issue the warning. - else if (line.find("interleave", where) != where) { - log() << startupWarningsLog; - log() << "** WARNING: You are running on a NUMA machine." - << startupWarningsLog; - log() << "** We suggest launching mongod like this to avoid " - << "performance problems:" << startupWarningsLog; - log() << "** numactl --interleave=all mongod [other options]" - << startupWarningsLog; - warned = true; - } + // if the text following the space doesn't begin with 'interleave', then + // issue the warning. + else if (line.find("interleave", where) != where) { + log() << startupWarningsLog; + log() << "** WARNING: You are running on a NUMA machine." << startupWarningsLog; + log() << "** We suggest launching mongod like this to avoid " + << "performance problems:" << startupWarningsLog; + log() << "** numactl --interleave=all mongod [other options]" + << startupWarningsLog; + warned = true; } } } + } - if (params.dur) { - std::fstream f("/proc/sys/vm/overcommit_memory", ios_base::in); - unsigned val; - f >> val; - - if (val == 2) { - log() << startupWarningsLog; - log() << "** WARNING: /proc/sys/vm/overcommit_memory is " << val - << startupWarningsLog; - log() << "** Journaling works best with it set to 0 or 1" - << startupWarningsLog; - } - } + if (params.dur) { + std::fstream f("/proc/sys/vm/overcommit_memory", ios_base::in); + unsigned val; + f >> val; - if (boost::filesystem::exists("/proc/sys/vm/zone_reclaim_mode")){ - std::fstream f("/proc/sys/vm/zone_reclaim_mode", ios_base::in); - unsigned val; - f >> val; - - if (val != 0) { - log() << startupWarningsLog; - log() << "** WARNING: /proc/sys/vm/zone_reclaim_mode is " << val - << startupWarningsLog; - log() << "** We suggest setting it to 0" << startupWarningsLog; - log() << "** http://www.kernel.org/doc/Documentation/sysctl/vm.txt" - << startupWarningsLog; - } + if (val == 2) { + log() << startupWarningsLog; + log() << "** WARNING: /proc/sys/vm/overcommit_memory is " << val << startupWarningsLog; + log() << "** Journaling works best with it set to 0 or 1" + << startupWarningsLog; } + } - // Transparent Hugepages checks - StatusWith<std::string> transparentHugePagesEnabledResult = - StartupWarningsMongod::readTransparentHugePagesParameter("enabled"); - if (transparentHugePagesEnabledResult.isOK()) { - if (transparentHugePagesEnabledResult.getValue() == "always") { - log() << startupWarningsLog; - log() << "** WARNING: " << kTransparentHugePagesDirectory - << "/enabled is 'always'." - << startupWarningsLog; - log() << "** We suggest setting it to 'never'" - << startupWarningsLog; - warned = true; - } + if (boost::filesystem::exists("/proc/sys/vm/zone_reclaim_mode")) { + std::fstream f("/proc/sys/vm/zone_reclaim_mode", ios_base::in); + unsigned val; + f >> val; + + if (val != 0) { + log() << startupWarningsLog; + log() << "** WARNING: /proc/sys/vm/zone_reclaim_mode is " << val << startupWarningsLog; + log() << "** We suggest setting it to 0" << startupWarningsLog; + log() << "** http://www.kernel.org/doc/Documentation/sysctl/vm.txt" + << startupWarningsLog; } - else if (transparentHugePagesEnabledResult.getStatus().code() != - ErrorCodes::NonExistentPath) { - warning() << startupWarningsLog; - warning() << transparentHugePagesEnabledResult.getStatus().reason() - << startupWarningsLog; + } + + // Transparent Hugepages checks + StatusWith<std::string> transparentHugePagesEnabledResult = + StartupWarningsMongod::readTransparentHugePagesParameter("enabled"); + if (transparentHugePagesEnabledResult.isOK()) { + if (transparentHugePagesEnabledResult.getValue() == "always") { + log() << startupWarningsLog; + log() << "** WARNING: " << kTransparentHugePagesDirectory << "/enabled is 'always'." + << startupWarningsLog; + log() << "** We suggest setting it to 'never'" << startupWarningsLog; warned = true; } + } else if (transparentHugePagesEnabledResult.getStatus().code() != + ErrorCodes::NonExistentPath) { + warning() << startupWarningsLog; + warning() << transparentHugePagesEnabledResult.getStatus().reason() << startupWarningsLog; + warned = true; + } - StatusWith<std::string> transparentHugePagesDefragResult = - StartupWarningsMongod::readTransparentHugePagesParameter("defrag"); - if (transparentHugePagesDefragResult.isOK()) { - if (transparentHugePagesDefragResult.getValue() == "always") { - log() << startupWarningsLog; - log() << "** WARNING: " << kTransparentHugePagesDirectory - << "/defrag is 'always'." - << startupWarningsLog; - log() << "** We suggest setting it to 'never'" - << startupWarningsLog; - warned = true; - } - } - else if (transparentHugePagesDefragResult.getStatus().code() != - ErrorCodes::NonExistentPath) { - warning() << startupWarningsLog; - warning() << transparentHugePagesDefragResult.getStatus().reason() - << startupWarningsLog; + StatusWith<std::string> transparentHugePagesDefragResult = + StartupWarningsMongod::readTransparentHugePagesParameter("defrag"); + if (transparentHugePagesDefragResult.isOK()) { + if (transparentHugePagesDefragResult.getValue() == "always") { + log() << startupWarningsLog; + log() << "** WARNING: " << kTransparentHugePagesDirectory << "/defrag is 'always'." + << startupWarningsLog; + log() << "** We suggest setting it to 'never'" << startupWarningsLog; warned = true; } + } else if (transparentHugePagesDefragResult.getStatus().code() != ErrorCodes::NonExistentPath) { + warning() << startupWarningsLog; + warning() << transparentHugePagesDefragResult.getStatus().reason() << startupWarningsLog; + warned = true; + } #endif // __linux__ #if defined(RLIMIT_NPROC) && defined(RLIMIT_NOFILE) - //Check that # of files rlmit > 1000 , and # of processes > # of files/2 - const unsigned int minNumFiles = 1000; - const double filesToProcsRatio = 2.0; - struct rlimit rlnproc; - struct rlimit rlnofile; - - if(!getrlimit(RLIMIT_NPROC,&rlnproc) && !getrlimit(RLIMIT_NOFILE,&rlnofile)){ - if(rlnofile.rlim_cur < minNumFiles){ - log() << startupWarningsLog; - log() << "** WARNING: soft rlimits too low. Number of files is " - << rlnofile.rlim_cur - << ", should be at least " << minNumFiles << startupWarningsLog; - } + // Check that # of files rlmit > 1000 , and # of processes > # of files/2 + const unsigned int minNumFiles = 1000; + const double filesToProcsRatio = 2.0; + struct rlimit rlnproc; + struct rlimit rlnofile; + + if (!getrlimit(RLIMIT_NPROC, &rlnproc) && !getrlimit(RLIMIT_NOFILE, &rlnofile)) { + if (rlnofile.rlim_cur < minNumFiles) { + log() << startupWarningsLog; + log() << "** WARNING: soft rlimits too low. Number of files is " << rlnofile.rlim_cur + << ", should be at least " << minNumFiles << startupWarningsLog; + } - if(false){ - // juse to make things cleaner - } + if (false) { + // juse to make things cleaner + } #ifdef __APPLE__ - else if(rlnproc.rlim_cur >= 709){ - // os x doesn't make it easy to go higher - // ERH thinks its ok not to add the warning in this case 7/3/2012 - } + else if (rlnproc.rlim_cur >= 709) { + // os x doesn't make it easy to go higher + // ERH thinks its ok not to add the warning in this case 7/3/2012 + } #endif - else if(rlnproc.rlim_cur < rlnofile.rlim_cur/filesToProcsRatio){ - log() << startupWarningsLog; - log() << "** WARNING: soft rlimits too low. rlimits set to " - << rlnproc.rlim_cur << " processes, " - << rlnofile.rlim_cur << " files. Number of processes should be at least " - << rlnofile.rlim_cur/filesToProcsRatio << " : " - << 1/filesToProcsRatio << " times number of files." << startupWarningsLog; - } - } else { + else if (rlnproc.rlim_cur < rlnofile.rlim_cur / filesToProcsRatio) { log() << startupWarningsLog; - log() << "** WARNING: getrlimit failed. " << errnoWithDescription() - << startupWarningsLog; + log() << "** WARNING: soft rlimits too low. rlimits set to " << rlnproc.rlim_cur + << " processes, " << rlnofile.rlim_cur + << " files. Number of processes should be at least " + << rlnofile.rlim_cur / filesToProcsRatio << " : " << 1 / filesToProcsRatio + << " times number of files." << startupWarningsLog; } + } else { + log() << startupWarningsLog; + log() << "** WARNING: getrlimit failed. " << errnoWithDescription() << startupWarningsLog; + } #endif #ifdef _WIN32 - ProcessInfo p; - - if (p.hasNumaEnabled()) { - log() << startupWarningsLog; - log() << "** WARNING: You are running on a NUMA machine." - << startupWarningsLog; - log() << "** We suggest disabling NUMA in the machine BIOS " - << startupWarningsLog; - log() << "** by enabling interleaving to avoid performance problems. " - << startupWarningsLog; - log() << "** See your BIOS documentation for more information." - << startupWarningsLog; - warned = true; - } -#endif // #ifdef _WIN32 + ProcessInfo p; + + if (p.hasNumaEnabled()) { + log() << startupWarningsLog; + log() << "** WARNING: You are running on a NUMA machine." << startupWarningsLog; + log() << "** We suggest disabling NUMA in the machine BIOS " << startupWarningsLog; + log() << "** by enabling interleaving to avoid performance problems. " + << startupWarningsLog; + log() << "** See your BIOS documentation for more information." + << startupWarningsLog; + warned = true; + } +#endif // #ifdef _WIN32 - if (warned) { - log() << startupWarningsLog; - } + if (warned) { + log() << startupWarningsLog; } -} // namespace mongo +} +} // namespace mongo |