问题
在我现在工作的集群环境上,读取基础表(30.6MB,47106条数据),耗时10秒,在另一个组(叫B组)吧,我的叫A组吧,的集群环境上耗时1毫秒。从mongodb的操作来看,其操作数超过了14000次/s。
问题分析
从后台的IO上来看,两个环境的sdb磁盘使用率都达到了100%。更仔细的话,发现两个环境中的资源写入量不同,我的组写入量在10MB/s~30MB/s,而B组环境写入量在500KB/s~1MB/s。简单的sdb磁盘使用率并不能代表mongodb的性能。所以要从从监控来看。
做一些测试
- 所有统计值是在业务组将其最大流量的业务去掉之后的统计值;
- 数据库数据量从739GB删除到208GB后的统计。
我的组
B组
从平均网络传输来看,网络输入和输出均是我的环境的量更大。同时网络输出量比网络输入量大。而B组环境是因为业务不多,数据更多是流处理的写入数据,用于查询数据的批处理业务较少。因此,从网络传输量角度分析发现,我组存在大批量的文件传输。这些传输主要是表现在mongodb与磁盘交互的操作(查询、插入、更新、删除)。
Granfana监控能够监控当前mongodb的所有操作数量(A组)。
B组
我组环境是B组环境的4倍。其中主要的操作是插入操作。这也解释了我组为什么IO比B组高的原因。但该操作数不能反映实际的操作,例如对于批插入操作,虽然只有1次操作,但是实际上mongodb进行多次操作。
将mongodb的各个分片的操作数进行统计,进行分析。统计方法如下:
比如现在我进入了mongos容器中发现,(以前容器生命周期是由K8S维护)
kubectl exec -it -n a-service mongodb-cdf487ds bash