问题现象:外服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)