前几天处理完一个Mongodb大量"serverStatus was very slow"处理记录的问题,这周又遇到同样的日志问题,大量的serverStatus was very slow日志,下面记录一下处理过程:
Mongodb数据服务器相关情况:
Mongodb版本:3.4.0
部署模式:分片(4个分片,每个分片都是1主2从)
数据量:每个分片有15亿数据(记录数)
机器配置:分片都是虚拟机,SSD 硬盘,32G内存,8C
出现的情况:4个分片,有一个分片的主在日志里出现大量的“serverStatus was very slow"日志,但是从没有出现这样的日志,还有一种问题就是:三个节点,无论那个节点为Mongodb的主时,日志才会出现。排除了系统本身的影响。

” serverStatus was very slow: { after basic: 0, after advisoryHostFQDNs: 0, after asserts: 0, after backgroundFlushing: 0, after connections: 0, after dur: 0, after extra_info: 0, after globalLock: 0, after network: 0, after opLatencies: 0, after opcounters: 0, after opcountersRepl: 0, after oplog: 1220, after repl: 1220, after security: 1220, after sharding: 1220, after storageEngine: 1220, after tcmalloc: 1220, after wiredTiger: 1220, at end: 1220 }"

根据以前的经验:问题出在“ after oplog: 1220”上。

先看系统的IO,CPU及LOAD,一切数据表明都很正常,没有让人感觉问题所在!
还看了系统的各种内核参数(主要是Limit),也都有安照官方的说法进行了修改,没有问题!
再看oplog.rs的大小,最大值是50G,现在有近10亿条记录,难道是记录数太多的原因,有点不敢信。好吧测试改下
附:修改oplog.rs的修改(Mongodb3.6已经支持在线修改了,但是3.4还是老实的按步骤修改吧)
#######################
在从上执行:db.shutdownserver(),然后以单实例启动数据库后,shell执行
use local
db.temp.drop()
db.temp.save( db.oplog.rs.find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )
db.oplog.rs.drop()
db.runCommand( { create: "oplog.rs", capped: true, size: (20 * 1024 * 1024 * 1024) } )
db.oplog.rs.save( db.temp.findOne() )
#查看一下是否有条记录了!
db.oplog.rs.find()
确认后以ReplSet重启,重新加入集群
##################
好了,现在oplog.rs的记录清空了,应该没有问题了吧,等整个集群正常后,强制这台成为主。
看日志,一万头马在心里碾过,问题依旧存在。抽支烟后继续研究!

另附一个Mongodb3.4的strace使用,如果直接使用:strace -p mongondPID的话,将不会有任何结果出来,必须加上另一个参数:-f

使用strace命令:strace -cf -p mongondPID 看一下有什么异常没有!()
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 45.89   82.805333        2103     39381      5898 futex
 43.57   78.623487       28580      2751           recvfrom
  3.41    6.153932        8559       719           nanosleep
  3.32    5.999088       88222        68           select
  2.05    3.704592         374      9918           epoll_wait
  1.40    2.528608      126430        20        13 restart_syscall
  0.14    0.252668           4     62720           clock_gettime
  0.10    0.183186         273       671           fdatasync
  0.05    0.086402           4     19708           gettimeofday
  0.02    0.037975          56       681           pread
  0.01    0.023175           4      5927      2221 recvmsg
  0.01    0.015350          21       727           pwrite
  0.01    0.012949           7      1851           sendmsg
  0.01    0.009036           7      1377           sendto

一大堆系统信息,看上去也正常!
真的让人抓狂呀,如何做,如何做
日志还是一样的狂打”very slow"

无奈之重启Mongodb,结果问题一样
XFS格式好像性能会好很多,好吧试一下,先停Mongodb服务(从节点),减少LV的大小,减少文件系统的大小,然后在空出来的空间上新建一个LV,格式化成xfs格式,然后把数据CP过去,重启Mongodb加入集群后,再把从变成主,再看日志,希望有奇迹出现。问题还是一样没有解决。

后来注意到启动命令里有这些参数:--nojournal  会不会跟这个有关呢!
反正已经到这一步,show hands
干掉这个参数,重启
世界突然清净了!
"serverStatus was very slow"字样竟没有出现了!
问题解决!但是如何解释这个问题,请听下回分解!




12-18 09:52