MongoDB源码分析WiredTiger存储引擎内存计算逻辑

 WiredTiger 存储引擎

WiredTiger 存储引擎是mongodb默认存储引擎。

WiredTiger 内存使用
默认存储引擎WiredTiger 内存缓存大小为以下两者中的较大者:
(RAM 大小 - 1 GB)的 50%,或 256 MB.

MongoDB源码分析WiredTiger存储引擎内存计算逻辑_第1张图片


例如,在总 RAM 为 4GB 的系统上,WiredTiger 缓存使用 1.5GB RAM (0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,在总 RAM 为 1.25GB 的系统上,WiredTiger 为 WiredTiger 缓存分配了 256 MB,因为这大于总 RAM 的一半减去 1 GB (0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB)。

如果设置内存cacheSizeGB超过 0.8 *系统内存 则输出告警日志;

如果设置内存cacheSizeGB超过 10000GB,则将内存赋值成 10000GB

下面分析mongodb4.0.7源代码

 mongo/db/storage/wiredtiger/wiredtiger_util.cpp计算引擎内存大小

size_t WiredTigerUtil::getCacheSizeMB(double requestedCacheSizeGB) {
    double cacheSizeMB;
    const double kMaxSizeCacheMB = 10 * 1000 * 1000;
    if (requestedCacheSizeGB == 0) {
        // Choose a reasonable amount of cache when not explicitly specified by user.
        // Set a minimum of 256MB, otherwise use 50% of available memory over 1GB.
        ProcessInfo pi;
        double memSizeMB = pi.getMemSizeMB();
		获取系统内存,计算默认内存大小
        cacheSizeMB = std::max((memSizeMB - 1024) * 0.5, 256.0);
    } else {
        cacheSizeMB = 1024 * requestedCacheSizeGB;
    }
    if (cacheSizeMB > kMaxSizeCacheMB) {
        log() << "Requested cache size: " << cacheSizeMB << "MB exceeds max; setting to "
              << kMaxSizeCacheMB << "MB";
        如果设置内存超过10000GB则赋值10000GB
        cacheSizeMB = kMaxSizeCacheMB;
    }
    return static_cast(cacheSizeMB);
}

mongo/db/storage/wiredtiger/ wiredtiger_init.cpp创建WiredTiger引擎

size_t cacheMB = WiredTigerUtil::getCacheSizeMB(wiredTigerGlobalOptions.cacheSizeGB);

const double memoryThresholdPercentage = 0.8;
ProcessInfo p;
if (p.supported()) {
	if (cacheMB > memoryThresholdPercentage * p.getMemSizeMB()) {
		如果内存大小超过0.8*系统内存则发送告警日志
	}
}
const bool ephemeral = false;
const auto maxCacheOverflowMB =
	static_cast(1024 * wiredTigerGlobalOptions.maxCacheOverflowFileSizeGB);
WiredTigerKVEngine* kv =
	new WiredTigerKVEngine(getCanonicalName().toString(),
						   params.dbpath,
						   getGlobalServiceContext()->getFastClockSource(),
						   wiredTigerGlobalOptions.engineConfig,
						   cacheMB,
						   maxCacheOverflowMB,
						   params.dur,
						   ephemeral,
						   params.repair,
						   params.readOnly);

wiredTigerGlobalOptions.cacheSizeGB可以调整 WiredTiger 内部缓存大小,配置参数storage.wiredTiger.engineConfig.cacheSizeGB 和 --wiredTigerCacheSizeGB。避免将 WiredTiger 内部缓存大小增加到超过其默认值。


mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 引擎设置

WiredTigerKVEngine::WiredTigerKVEngine(const std::string& canonicalName,
                                       const std::string& path,
                                       ClockSource* cs,
                                       const std::string& extraOpenOptions,
                                       size_t cacheSizeMB,
                                       size_t maxCacheOverflowFileSizeMB,
                                       bool durable,
                                       bool ephemeral,
                                       bool repair,
                                       bool readOnly)
    : _clockSource(cs),
      _oplogManager(std::make_unique()),
      _canonicalName(canonicalName),
      _path(path),
      _sizeStorerSyncTracker(cs, 100000, Seconds(60)),
      _durable(durable),
      _ephemeral(ephemeral),
      _inRepairMode(repair),
      _readOnly(readOnly),
      _keepDataHistory(serverGlobalParams.enableMajorityReadConcern) {
    boost::filesystem::path journalPath = path;
    journalPath /= "journal";
    if (_durable) {
        if (!boost::filesystem::exists(journalPath)) {
            try {
                boost::filesystem::create_directory(journalPath);
            } catch (std::exception& e) {
                log() << "error creating journal dir " << journalPath.string() << ' ' << e.what();
                throw;
            }
        }
    }

    _previousCheckedDropsQueued = _clockSource->now();

    std::stringstream ss;
    ss << "create,";
MongoDB启动日志打印出来内存大小
    ss << "cache_size=" << cacheSizeMB << "M,";
    ss << "cache_overflow=(file_max=" << maxCacheOverflowFileSizeMB << "M),";
    ss << "session_max=33000,";
    ss << "eviction=(threads_min=4,threads_max=4),";
    ss << "config_base=false,";
    ss << "statistics=(fast),";

WiredTiger 内部缓存和磁盘格式中的数据使用不同的表示形式:
文件系统缓存中的数据与磁盘上的数据格式相同,并且同样拥有数据文件压缩带来的好处。操作系统使用文件系统缓存来减少磁盘 I/O。

WiredTiger 内部缓存中加载的索引具有与磁盘上格式不同的数据表示形式,但仍可利用索引前缀压缩来减少 RAM 使用量。索引前缀压缩会对被索引字段中的常用前缀去重。
WiredTiger 内部缓存中的集合数据未压缩,并使用与磁盘上格式不同的表示形式。区块压缩可大幅节省磁盘上存储空间,但数据必须解压缩才能由服务器操作。
 

WiredTiger 存储引擎对于现有部署,mongodb指定引擎参数 --storageEngine 或 storage.engine 设置,则 mongod 实例可以自动确定用于在 --dbpath 或 storage.dbPath 中创建数据文件的存储引擎。

你可能感兴趣的:(mongodb源代码分析,mongodb,数据库,nosql,sql)