标签搜索

MongoDB内存分析实践

anker
2021-06-26 / 0 评论 / 131 阅读 / 正在检测是否收录...

问题现象:外服120W数据DB>使用了12GB内存,但同样的数据导入一个开发实例,只占用了5GB

定位工具
  • 1.查看内存使用db.serverStatus().mem,单位MB
  • 2 连接数mongo --quiet --eval "db.serverStatus().connections"
  • 3.线程数量 top -p 18852 -H -b -n1 |sed 1,7d|wc -l
  • 4.查看进程内存分部cat /proc/{pid}/smaps
  • 5.查看系统固定线程栈大小 一般是8M,代码可动态定制。 ulimit -a| grep 'stack size' 通过pthread_attr_setstack函数可以设置线程栈大小
  • 6.查看tcmalloc内存使用情况:mongo --quiet --eval "db.serverStatus().tcmalloc.tcmalloc.formattedString", total_free_bytes表示内存池中还有多少可用内存, 分线程级别小对象cached和进程级别cache
内存使用模块
  • 连接池消耗

    • 每个连接对应一个线程, 一般占用1MB线程栈
    • 协议栈本身收发缓存区

      • 查看系统设置 sysctl -a| grep 'net.ipv4.tcp_[w/r]mem'
      • 查看当前连接收发缓存区: ss -m 输出rb+tb, 线上大约5MB
    • 线上有1048个连接,所以消耗6MB*1048=~6GB
  • WiredTiger内部缓存(数据页,索引页,溢出页)

    • 查看命令mongo --quiet --eval "db.serverStatus().wiredTiger"
    • 查看使用的引擎mongo --quiet --eval "db.serverStatus().storageEngine"
    • 默认最大cacheSizeGB = max(256MB, (RAM - 1 GB)/2),状态命令的中maximum bytes configured
    • page images(10GB)在cache(12GB)中占比85%, 正常
  • 构建索引时缓存

    • maxIndexBuildMemoryUsageMegabytes, 每张表默认500MB, 多表同时构建时可能会造成内存压力
  • 文件系统缓存
0

评论 (0)

取消