mongo 锁的处理和状况查询
mongo 锁的处理流程 mongo数据库突然变的很缓慢,读取速度还可以,其他操作( add,save,delete)尤其缓慢,处理时间平均时间超过30s,一开始发现是mongo集群出现了问题,无法找到主mongo服务器,后来发现服务器的队列命令已经排满了,cpu也是300%左右,说明服务器也已经处于饱和状态,后续的请求命令只能排在队列尾部,无法及时执行, 经过一天的尝试后发现,由于主服务器找不到,从服务器无法使用更新命令,并且更新时会自动锁表,从而导致其他命令不能及时执行, 查看当前操作 db.currentOp() 正常的情况是返回很少的数据或者返回空 “fsyncLock” : 1 同步到磁盘的进程 如果有锁就会造成数据库无法访问或缓慢 解决: 解锁,但尽量不要使用 db.fsyncUnlock(); 杀掉负载高的应用id db.killOp(466404288) 获取服务器状态 db.serverStatus() 哪些操作会对数据库产生锁? Operation Lock Type Issue a query Read lock Get more data from a cursor Read lock Insert data Write lock Remove data Write lock Update data Write lock Map-reduce Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently. Create an index Building an index in the foreground, which is the default, locks the database for extended periods of time. db.eval() Write lock. db.eval() blocks all other JavaScript processes. eval Write lock. If used with the nolock lock option, the eval option does not take a write lock and cannot write data to the database. aggregate() Read lock 哪些数据库管理操作会锁数据库? db.collection.ensureIndex(), reIndex, compact, db.repairDatabase(), db.createCollection(), when creating a very large (i.e. many gigabytes) capped collection, db.collection.validate(), db.copyDatabase().This operation may lock all databases 通过mongo外置命令查看原因 如: mongostat使用命令 --help --verbos --host <hostname><:port>, -h <hostname><:port> --port <port> --ipv6 --ssl --sslCAFile <filename> --sslPEMKeyFile <filename> --sslPEMKeyPassword <value> --sslCRLFile <filename> --sslAllowInvalidCertificates --sslFIPSMode --username <username>, -u <username> --password <password>, -p <password> --authenticationDatabase <dbname> --authenticationMechanism <name> --gssapiServiceName --gssapiHostName --noheaders --rowcount <number>, -n <number> --http --discover --all 输出参数 inserts 每秒插入次数 query 每秒查询次数 update 每秒更新次数 delete 每秒删除次数 getmore 每秒每批次响应返回的文档数量,cursor.batchSize() command 每秒的命令数,比如count,slave或者secondary的命令/秒, flushs/s 每秒执行fsync将数据写入硬盘的次数。 mapped/s 所有的被内存映射的数据量,虚拟内存单位是MB non-mapped 所使用物理内存 size 虚拟内存使用量,单位MB res 物理内存使用量,单位MB faults/s 每秒访问失败数,数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展 locked % 被锁的时间百分比全局锁,尽量控制在50%以下吧 locked db 数据库上细纹锁定时间百分比,这个值有可能大于100% idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了 q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。 qr 队列客户端读等待时间 qw 队列客户端写等待时间 ar 活跃客户段的读操作数 aw 活跃客户端的写操作数 netIn 请求网络流量字节单位 netOut 响应网络流量字节单位 conn 连接总数 set 副本集的 repl 副本集状态 M master MEC secondary REC recovering UNK unknow SLV slave RTR 路由 mongotop 对于数据库内每个表的读写情况,显示每秒的数据情况 --help --verbos -v --quiet --host <hostname><:port>, -h <hostname><:port> --port <port> --ipv6 --ssl --sslCAFile <filename> --sslPEMKeyFile <filename> --sslPEMKeyPassword <value> --sslCRLFile <filename> --sslAllowInvalidCertificates --sslFIPSMode --username <username>, -u <username> --password <password>, -p <password> --authenticationDatabase <dbname> --authenticationMechanism <name> --gssapiServiceName --gssapiHostName --locks 显示结果 mongotop.ns 数据库的命名空间和连接 mongotop.db 数据库名 mongotop.total 数据库花费的总时间 mongotop.read 读操作的总时间 mongotop.write 写操作的总时间 mongotop.<timestamp> 硬盘I/O检测 mongoperf mongoperf.nThreads 多线程 mongoperf.fileSizeMB 文件大小默认1M mongoperf.sleepMicros 分片检测 mongos 对于具体某条查询,可以通过慢查询profile解决 |
|