(转)mongdb性能优化收集

一、数据库最大连接数问题
当你在后台日志中,发现大量“connection refused because too many open connections: 819”信息时,一般跟你没有设置合适的最大连接数值有关。
默认情况下,在LINUX系统中,MONGODB默认连接数为819,你可以适当调大这个值,但注意这个值不是无限大,最多可设置成20000, 参见MONGODB的官方说明。

我们可以在数据库启动时加--maxConns 10000参数来指定最大连接数
也可以修改mongodb.conf配置文件,在其中加一句maxConns = 10000保存退出后再启动MONGODB就好了。
当然这个问题也跟ulimit限制有关, 可以手动修改ulimit -n 来改动open file 的数目.
如果想使open file的值永久生效的话,请在/etc/security/limits.conf中添加以下四行, 数目根据系统情况具体修改.
*    soft nofile 102400       (*针对所有用户)
*    hard nofile 102400
root soft nofile 102400        (针对ROOT用户)
root hard nofile 102400

然后在/etc/pam.d/login中添加
session    required     /lib64/security/pam_limits.so
....
reboot后即可永久生效.

二、虚拟内存限制问题
MongoDB主从配置后, 启动时报错“ERROR: mmap failed with out of memory”。  这是因为mongodb在设置为主从关系时,会创建“creating replication oplog of size: 944MB”,这个OPLOG日志应该是放在内存中的.
解决方法:
(1)设置oplog的大小,用参数--oplogSize来指定,不默认创建944M
(2)放开虚拟内存的限制(虚拟机默认设定512M ),编辑/etc/profile文件加入ulimit -v unlimited,使用source /etc/profile让设置生效。
再执行主从的启动命令就ok了
mongodb比较吃内存,也可以限制mongodb的内存使用量,操作如下
vi  mongodb.conf
增加 ulimit -m 2560000 (约2.5G 内存)

需要注意的几点:
1. MongoDB在32位操作系统出现“mmap failed with out of memory”错误,这是因为在32位平台中MongoDB不允许数据库文件(累计总和)超过2G,而64位平台没有这个限制。如果在64位平台中也报这个错,一般是虚拟内存不足所致。可以编辑/etc/profile文件加入ulimit -v unlimited,使用source /etc/profile让设置生效或重启生效。

2. oplog的大小和内存没有太大关系,oplogSize相当于mysql数据库的binlog,从库复制的数据都是从oplog也就是local这个库读取的。
--oplopgSize,指定了slave同步时,更新日志保存的最大大小,最新版本的mongodb如果不指定参数的话默认是硬盘空间的5%,如果设置太小,slave同步和主库相差远超过了oplog的大小的话,有可能会数据不一致。

参看官方文档说明:
http://www.mongodb.org/display/DOCS/Replication+Oplog+Length

3、使用mongoDB建议使用高性能sas硬盘,追求性能可以考虑使用raid10硬盘。

三、mongodb占用空间过大的问题

1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。
2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用空间就小了,但这就要求在易读性与空间占用上作权衡了。建议把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长了。但这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。
3、删除记录不释放空间:这个很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。

可以定期运行db.repairDatabase()来整理记录释放空间,但这个过程会比较缓慢。

--------------------------
优化系统配置,提升MongoDB性能

许多系统配置都会影响MongoDB运行时的性能,通过优化这些配置,能有效提升MongoDB性能。本文的优化针对Linux系统,实际操作在CentOS 6下完成。文章内容主要来源于MongoDB官方文档,http://docs.mongodb.org/manual/administration/production-notes/,同时结合了笔者的一些实际操作经验。

1、推荐使用2.6.36或以上版本的Linux kernel
笔者使用的CentOS 6.3,默认内核版本仅是2.6.32。由于升级内核影响比较大,此项优化未进行。

2、使用Ext4或XFS文件系统
MongoDB会预分配数据文件,并且这些文件都非常大,因此最好使用Ext4或XFS文件系统。使用Ext4要求内核版本至少为2.6.23,使用XFS要求内核版本至少为2.6.25。

3、关闭数据文件所在磁盘分区上的atime
Linux下用到文件atime的软件不多,常见的只有mutt。如果你没有使用mutt这样的依赖文件atime时间的软件,建议关闭掉atime。为了减少关闭atime带来的影响,可以只关闭MongoDB 数据文件所在磁盘分区上的atime。
具体操作步骤如下:
1、切换到root身份
su
2、备份当前的fstab文件
cp /etc/fstab /etc/fstab.bak
3、修改fstab文件里数据文件所在分区的挂载属性
修改数据文件所在分区那一行的第四节,在后面附加“noatime,nodiratime”。如果原来是defaults,直接替换掉。
修改前:/dev/mapper/VolGroup-lv_data /data ext4 defaults 1 2
修改后:/dev/mapper/VolGroup-lv_data /data ext4 noatime,nodiratime 1 2
remount该分区,mount -o remount /data/。

4、修改系统限制参数文件描述符数和用户进程数到20000以上。
ulimit -n 64000
ulimit -u 32000
该修改仅在当前会话期内有效,为了在下次登录或重启后仍然有效,添加如下内容到“/etc/security/limits.conf”文件。
* soft nofile 64000
* hard nofile 64000
* soft nproc 32000
* hard nproc 32000
同时,如果你的系统里存在“/etc/security/limits.d/90-nproc.conf”这个文件,注释掉文件里的下面这一行。
#* soft nproc 1024

5、不要使用hugepages
cat /proc/sys/vm/nr_hugepages
查看当前hugepages设置,确保其为0。如果不是,执行下面的操作。
echo 0 > /proc/sys/vm/nr_hugepages
为了让设置在下次重启后有效,添加如下内容到“/etc/sysctl.conf”文件里。
# sysctl vm.nr_hugepages
vm.nr_hugepages = 0

6、禁用NUMA
可以在BIOS里禁用NUMA,这种方式需要重启系统。也可以只针对MongoDB进程禁用,推荐使用这种方式。
具体操作步骤如下:
使用numactl来启动mongod

numactl --interleave=all /usr/bin/local/mongod
确保/proc/sys/vm/zone_reclaim_mode为0,否则执行“echo 0 > /proc/sys/vm/zone_reclaim_mode”,该修改不需要重启mongod。

7、设置较小的磁盘readahead参数值,32KB或16KB都比较合适
查看当前值。

blockdev --getra /dev/sda
设置成32KB,单位为扇区大小,一个扇区512字节,64即为32KB。

blockdev --setra 64 /dev/sda
8、设置时钟同步,确保系统时间准确性
时间准确性对Shard集群尤为重要。安装ntpd服务,并设置为成开机启动。
yum install ntp
chkconfig ntpd on

9、磁盘和存储系统
开启Swap。关于Swap空间,内存为4GB时至少需要2GB,4GB~16GB时至少需要4GB,16GB~64GB时至少需要8GB,64GB~256GB时至少需要16GB。
磁盘阵列使用RAID10,RAID5和RAID6不能提供足够的性能,RAID0写性能不错但读性能较差,应避免使用。成本上允许的话,尽量使用SSD磁盘。
不要使用远程文件系统,比如NFS。

时间: 2024-10-14 00:33:17

(转)mongdb性能优化收集的相关文章

Unity3D性能优化--- 收集整理的一堆

Unity3D性能优化--- 收集整理的一堆 官方优化文档--优化图像性能http://docs.unity3d.com/Documentation/Manual/OptimizingGraphicsPerformance.html Unity3D性能优化专题性能优化是一个异常繁琐而又涉及到项目开发的方方面面的一个过程,它的本质是在运行时的一个时间里尽可能完美展现丰富的内容.实现优化可以通过优化资源.渲染.粒子.物理等模式:也可以通过修改模型大小.减少纹理尺寸并结合Unity3D的一些相关特性来

iOS 性能优化收集

iOS 性能调试 instrument Instrument Instrument之Core Animation工具 避免图层混合 ①.确保控件的opaque属性设置为true,确保backgroundColor和父视图颜色一致且不透明: ②.如无特殊需要,不要设置低于1的alpha值: ③.确保UIImage没有alpha通道: 避免临时转换 ①.确保图片大小和frame一致,不要在滑动时缩放图片: ②.确保图片颜色格式被GPU支持,避免劳烦CPU转换: 慎用离屏渲染 ①.绝大多数时候离屏渲染

数据库性能优化、统计信息与对象统计信息概述收集、扩展统计信息、dbms_stats.get_prefs

数据库性能优化 相关书籍: 1.基于成本的Oracle优化法则 2.Oracle性能诊断艺术 3.基于Oracle的SQL优化 ----------------------------------------------------------------------------------------- 两种优化器: CBO  cost-base optimizer 基于cost 更大适应性/灵活性/10g开始 RBO  rule-base optimizer 基于规则 制定了15条/10g以

SqlServer性能优化 自定义动化性能收集(四)

配置数据收集器: 1.创建登录名并映射角色 2.配置管理数据仓库 3.创建收集组.收集项----MSDB数据存储   sp_syscollector_create... 4.自动配置相关job 具体步骤: 创建好之后的图: 配置数据收集: 刷新如下图所示: 创建的方法: use msdb go declare @collectionsetid int --有返回值 exec sp_syscollector_create_collection_set @name='性能收集集合', --收集的模式

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

Mysql数据库性能优化(一)

参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面

Android应用程序性能优化Tips

主要介绍一些小细节的优化技巧,虽然这些小技巧不能较大幅度的提升应用性能,但是恰当的运用这些小技巧并发生累积效应的时候,对于整个App的性能提升还是有不小作用的.通常来说,选择合适的算法与数据结构会是你首要考虑的因素,在这篇文章中不会涉及这方面的知识点.你应该使用这篇文章中的小技巧作为平时写代码的习惯,这样能够提升代码的效率. 通常来说,高效的代码需要满足下面两个原则: 不要做冗余的工作 尽量避免执行过多的内存分配操作 To ensure your app performs well across

iOS性能优化:Instruments使用实战(转)

采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的用户使用Guide,当然如果不习惯官方英文可以在这里找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数据.关于Instrument工具基本使用不在赘述.如

HoloLens开发与性能优化实践

HoloLens中国版终于于5月底在中国上市,同时国内的技术社区经过一年的成长也有了很大的扩张,越来越多的开发者开始进入了HoloLens开发领域,尝试着使用混合现实(Mixed Reality)技术来构建属于未来的创新应用. HoloLens开发回顾 HoloLens于2016年初正式开始发货,笔者有幸能够拿到第一波上市设备,当时大多流入国内的方式还是通过人肉搬运.当时的HoloLens开发在全球范围内都处于起步阶段,可以利用的开发资源只有官方文档等少数内容,然而今天则非常丰富,下面我们来看这