WiredTiger 存储引擎
WiredTiger 存储引擎是mongodb默认存储引擎。
WiredTiger 内存使用
默认存储引擎WiredTiger 内存缓存大小为以下两者中的较大者:
(RAM 大小 - 1 GB)的 50%,或 256 MB.
例如,在总 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 中创建数据文件的存储引擎。