带着问题看 MongoDB——collStats 和 dbStats 命令中的各种 size 怎么理解-阿里云开发者社区

开发者社区> 夏周tony> 正文

带着问题看 MongoDB——collStats 和 dbStats 命令中的各种 size 怎么理解

简介: MongoDB 底层使用了 WiredTiger 存储引擎,WT 使用的块分配策略会产生磁盘碎片,通过理解collStats 和 dbStats 命令中的各种 size,最后我们看下真正的磁盘碎片率怎么计算,是否需要做 compact。
+关注继续查看

dbStats

  • dataSize,未压缩数据的大小的,数据的逻辑大小,删除文档会变化,为各 collection stats.size 的累加
  • storageSize,block manger实际分配的空间大小(文件大小),删除文档不会发生变化,compact 会,使用压缩后,可能会比 dataSize 小,为各 collection stats.storageSize 的累加
  • indexSize,类似于 storageSize,但是反馈的是所有索引表通过 BM 分配的的大小
  • fsUsedSize,文件系统当前实际使用空间
  • fsTotalSize,文件系统总容量,上面两个值都是通过boost::filesystem::space拿到值,如果共有同一个文件系统,和具体的 Database 没有关联
// src/mongo/db/catalog/database_impl.cpp:284
    if (!opCtx->getServiceContext()->getStorageEngine()->isEphemeral()) {
        boost::filesystem::path dbpath(
            opCtx->getServiceContext()->getStorageEngine()->getFilesystemPathForDb(_name));
        boost::system::error_code ec;
        boost::filesystem::space_info spaceInfo = boost::filesystem::space(dbpath, ec);
        if (!ec) {
            output->appendNumber("fsUsedSize", (spaceInfo.capacity - spaceInfo.available) / scale);
            output->appendNumber("fsTotalSize", spaceInfo.capacity / scale);
        } else {
            output->appendNumber("fsUsedSize", -1);
            output->appendNumber("fsTotalSize", -1);
            log() << "Failed to query filesystem disk stats (code: " << ec.value()
                  << "): " << ec.message();
        }
    }

collStats

  • size,  collection 中所有document 的未压缩大小
  • storageSize,collection 文件大小
  • wiredTiger."block-manager"."file size in bytes",等于storageSize
  • wiredTiger."block-manager"."file bytes available for reuse",collection 文件可重用的空间大小
  • totalIndexSize,collection 上所有索引对应的wt表文件的大小
  • indexSizes,Object,分别列出了各个索引的文件大小
  • indexDetails.index_name."block-manager"."file size in bytes",类似于 collection,反映的是索引表的文件大小
  • indexDetails.index_name."block-manager"."file bytes available for reuse",类似于 collection,反映的是索引表可重用空间大小
  • 所以要计算单个 collection(含索引)的磁盘空间碎片率,计算脚本,
function getCollectionDiskSpaceFragRatio(dbname, coll) {
    var res = db.getSiblingDB(dbname).runCommand({
        collStats: coll
    });
    var totalStorageUnusedSize = 0;
    var totalStorageSize = res['storageSize'] + res['totalIndexSize'];
    Object.keys(res.indexDetails).forEach(function(key) {
        var size = res['indexDetails'][key]['block-manager']['file bytes available for reuse'];
        print("index table " + key + " unused size: " + size);
        totalStorageUnusedSize += size;
    });
    var size = res['wiredTiger']['block-manager']['file bytes available for reuse'];
    print("collection table " + coll + " unused size: " + size);
    totalStorageUnusedSize += size;
    print("collection and index table total unused size: " + totalStorageUnusedSize);
    print("collection and index table total file size: " + totalStorageSize);
    print("Fragmentation ratio: " + ((totalStorageUnusedSize * 100.0) / totalStorageSize).toFixed(2) + "%");
}

一次查看 db 下的所有 collection 碎片率,

use xxxdb
db.getCollectionNames().forEach((c) => {print("\n\n" + c); getCollectionDiskSpaceFragRatio(db.getName(), c);});

compact

如果碎片率过高,我们需要做 compact,MongoDB 本身提供了 compact 命令,关于 compact 命令的使用和原理,可以参考团队另外一位同学文章:https://developer.aliyun.com/article/709526

如果是 Sharding 实例,需要执行 compact 命令,请按如下方式执行命令:
https://developer.aliyun.com/article/328761


最后,打一个小广告,阿里云 MongoDB 目前上线了 Serverless 版本,让您方便的以超低成本试用 MongoDB,活动期间首购 1 元包月,续费也有 5 折优惠,欢迎试用:https://www.aliyun.com/product/mongodb

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9504 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10845 0
Java无法连接MongoDB问题
背景介绍:        由于开发用的Linux服务器在一个相对封闭的环境中,只有通过SSH访问22端口。于是就用putty做了一个SSH forwarding,将本机的27018端口映射到远程的27017端口。
865 0
caffe: test code 执行出问题: Check failed: FLAGS_weights.size() > 0 (0 vs. 0) Need model weights to score.
Check failed: FLAGS_weights.size() > 0 (0 vs. 0) Need model weights to score. 出现这个错误,但是我记得昨天还好好的,网上搜了也没有答案,后来仔细检查才发现,原来存放 .caffemodel 的文件名字 中间有空格!!! 把文件夹路径上的名字去掉,果断就可以了。
1763 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13201 0
带着问题看 MongoDB——collStats 和 dbStats 命令中的各种 size 怎么理解
MongoDB 底层使用了 WiredTiger 存储引擎,WT 使用的块分配策略会产生磁盘碎片,通过理解collStats 和 dbStats 命令中的各种 size,最后我们看下真正的磁盘碎片率怎么计算,是否需要做 compact。
1461 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6901 0
+关注
19
文章
84
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载