影响MongoDB数据库性能的几个重要因素

1.锁
MongoDB用一个锁确保数据的一致性。但如果某种操作长时间运行,其他请求和操作不得不等待这个锁,导致系统性能降低。
为了验证是否由于锁降低了性能,我们可以检查serverStatus输出的globalLock部分数据。如果参数lobalLock.currentQueue.total
的值一直比较大,说明系统中有许多请求在等待锁,同时表明并发问题影响了系统的性能。
  如果globalLock.totalTime的值与uptime的值接近,说明数据库在锁状态占用了系统大量时间。如果globalLock.ratio的值
也高,说明数据库处理了大量的长查询,引起长查询的因素主要有:
  •   1).索引使用不恰当甚至低效
  •   2).数据库的设计没有优化
  •   3).查询语句本身结构性能低下
  •   4).系统架构有问题


2.内存
MongoDB通过内存映射数据文件,如果数据集很大,MongoDB将占用所有可用的系统内存。正是由于内存映射机制将内存的管理交给操作
系统来完成,简化了MongoDB的内存管理,提高了数据库系统的性能,但是由于不能确定数据集的大小,需要多少内存也是个未知之数。
通过serverStatus()输出的关于内存使用的状态方面的数据,我们能够深入的了解内存使用情况。
  •       1).检查参数mem.resident的值,如果超过了系统内存量并且还有大量的数据文件在磁盘上,表明系统内存过小;
  •       2).检查参数mem.mapped的值,如果这个值大于系统内存量,那么针对数据库的一些读操作将会引起操作系统的缺页错误,内存的换入换出将会降低系统的性能。


3.缺页错误
当MongoDB请求的数据不在物理内存中,必须从虚拟内存中读取时,就会引起缺页错误。为了检查缺页错误,我们可以检查serverStatus()
输出项中extra_info.page_faults的值。单次的缺页错误对系统来说并不是问题,它表明MongoDB要读取的数据很多都不在内存中,需要从
磁盘中读取。增加系统内存量可以降低缺页错误的次数,但是单台机器的物理内存毕竟是有限的,而我们的数据文件通常都比内存要大,为了
解决这个问题,我们可以部署分片集群。


4.连接数
有时候客户端的连接数超过了MongoDB数据库服务器处理请求的能力,这也会降低系统的性能,我们可以通过serverStatus()输出的关于连接数
方面的参数进行进一步分析。参数globalLock,activeClients表示当前正在进行读写操作客户端连接数,current表示当前客户端到数据库实例
的连接数,available表示可用连接数。对于读操作大的应用程序,我们可以增加复制集成员数,将读操作分发到secondary节点上,对于写操作
大的应用程序,我们可以通过部署分片集群来分发写操作。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15498/viewspace-2118236/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15498/viewspace-2118236/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值