Oppo r11原初首选网络信号放大器是什么,我是4g移动的。

帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:1&分页:部落发信人: lokta (部落), 信区: Database
标&&题: mongodb不自动回收内存,如此奈何?
发信站: 水木社区 (Thu Apr 13 10:30:05 2017), 站内 && 不知道大家如和解决mongo吃太多内存的问题。
刚启动的时候还行,后面连接数一多,内存吃紧
后面又不自动释放。搞得内存不够用。
目前是写个定时任务来定时清理
求达人指点有没有更好的方法。 && -- && ※ 来源:·水木社区 newsmth.net·[FROM: 111.85.171.*]
文章数:1&分页:MongoDB 这么吃内存,怎么救。
我最近用爬虫在抓数据,一开始java,mysql,发现mysql的插入速度有点慢,就换成了mongodb,速度提升好多,但是问题出来了,mongodb也太他妈坑了吧,内存怎么控制啊,完全被吃光,就不能配置一个最大使用内存么,我的数据量很大,每天都需要抓取新的数据。
试过多线程并行插入,上亿的记录,MongoDB不刷新MMAP时,多线程速度也最多10W/s。最早用NodeJS,感觉不行,脚本型的,系统级优化,根本实现不了,MEMORY COPY之类太难做。换成C++的驱动,重新测试,无需bulk,bulk有1000条限制。但多并发,有一个致命缺限,MongoDB不会清理他自己的内存,而Client端,可以自行清理,就会造成MongoDB占用了系统 90%的内存,后来看Windows端,360能清理,就想到一个办法,自己写了一个清理进程内存的程序,实现了MongoDB的内存清理,反而加快了MongoDB向磁盘IO的写入速度。从此,MongoDB在本地Client大规模插入时,自动清理,MongoDB服务器内存占用不再超过1G。在极限测试时,用Bulk将文档内嵌,多线程MongoDB也通达到100W/s插入的Oracle极限速度。对于分布式对象数据库来讲,不管你怎么分布,或者说分片,都有一个极限速度要求,目前还没有人能达到1000W/s的并发写入速度,超大规模分布式集群,能达到10亿记录,3秒内存入,那就算是通过了测试。
--- 共有 3 条评论 ---
: 你好,求你的清理内存的程序啊、????求帮忙
: 其实,MongoDB的概念可以,只是他没有处理内存这部分,后来发觉很简单,他运行服务,有SYSTEM权限,清理内存并非难事。当然,还发现另外一个需要优化的问题,大文件,那种超过10G的,并非他们所说,换另外的系统存储,一个健康的数据库,应当有一定普适性。
使用MongoDB的环境,内存 & (索引 + 数据)
这样最完美,前不久58同城将用了4年多的MongoDB架构,迁移到了mysql,MongoDB的坑太多。
做大数据的公司...不差这点内存...机器多啊...
--- 共有 1 条评论 ---
MongoDB设计缺限,他的内存预测,可不是以应用真实环境为基础的。我们有可能应用,在一段时间内,需要近10G的内存,但使用后,马上释放,关键是MongoDB就一直不释放。后来想到,在服务端跑一个内存监控线程,自行清理MongoDB内存占用,就好多了,不再担心内存问题。
--- 共有 2 条评论 ---
TokuMX 对内存和ACID上的改进很好,大多数抱怨 MongoDB 内存和数据文件太占空间的问题都可以解决。
缺点是官方MongoDB已经2.6.1,加入类很多新的东西和修复的一些bug没跟上,然后兼容的2.4没有Text search和2d索引的内建支持。
看起来不错哦
自己写的爬虫?我最近也在采集数据 想从mysql转到mongodb ,mysql的结构太的单一了
--- 共有 1 条评论 ---
没有自己写爬虫,用开源的,还是用mysql算了,大数据抓取可以用Hbase,因为每天都需要新的数据。
亲,这是MongoDB的“特性”噢
mysql 插入慢,可以修改配置解决的.请查看my.cnf的innodb_flush_log_at_trx_commit配置.每秒钟插入1000条数据没有问题的,如果需要更高性能请采用事务提交.
--- 共有 1 条评论 ---
innodb_flush_log_at_trx_commit 配置了2,这样IO高的问题出现了。
本來mongodb就是靠占內存提高效率的。而且服務器內存小,就別用mongodb了。而且mongodb整個內存管理的完全依賴於操作系統,所以他會把所有的物理內存儘可能的沾滿。
對你這種場景,采用第二台机器,或者划分虚拟机是最好的办法。
--- 共有 1 条评论 ---
这么说的话,mongodb就不太适合应用大数据环境中,难道用来做缓存,做缓存就不选mongo了。
引用来自“ipenglei”的评论要么在抓取数据之后不要直接插入到mongodb 先缓存到一个文件 等达到一个量或一定时间了 再一次写入mongodb。。。楼主按楼上的方法,先缓存数据,再批量写入mongodb。一条一条写入,估计容易把mongodb拖垮。
要么在抓取数据之后不要直接插入到mongodb 先缓存到一个文件 等达到一个量或一定时间了 再一次写入mongodb。。。
推荐你看这篇博文.
稳定运行就爽了!
--- 共有 1 条评论 ---
这篇文章,没写之前已经看过了,没什么帮助mongodb 对内存的严重占用以及解决方法
刚开始使用mongodb的时候,不太注意mongodb的 内存 使用,但通过查资料发现mongodb 对内 存的 占用 是巨大的,在本地测试服务器中,8G的 内存 居然被 占用 了45%。汗呀。 本文就来剖析一下mongodb 对内 存的具体使用 方法 , 以及 生产环境针对mongodb占大量
  刚开始使用mongodb的时候,不太注意mongodb的内存使用,但通过查资料发现mongodb对内存的占用是巨大的,在本地测试服务器中,8G的内存居然被占用了45%。汗呀。
  本文就来剖析一下mongodb对内存的具体使用方法,以及生产环境针对mongodb占大量内存的问题的解决。
  先看一个MongoDB服务器的top命令结果
  shell& top -p $(pidof mongod)
  Mem: k total, k used, 2806804k free,
245020k buffers
  Swap: 2097144k total, 100k used, 2097044k free,
  VIRT RES SHR %MEM
  g 69.6
  或者 先top后,然后 shift+m
把当前进场按占用内存的多少排序。看看你的mongodb能占用多少内存。
  先了解一下linux对内存的管理方式:
  在Linux里(别的系统也差不多),内存有物理内存和虚拟内存之说,物理内存是什么自然无需解释,虚拟内存实际是物理内存的抽象,多数情况下,出于方便性的考虑,程序访问的都是虚拟内存地址,然后操作系统会把它翻译成物理内存地址。
  很多人会把虚拟内存和Swap混为一谈,实际上Swap只是虚拟内存引申出的一种技术而已:操作系统一旦物理内存不足,为了腾出内存空间存放新内容,就会把当前物理内存中的内容放到交换分区里,稍后用到的时候再取回来,需要注意的是,Swap的使用可能会带来性能问题,偶尔为之无需紧张,糟糕的是物理内存和交换分区频繁的发生数据交换,这被称之为Swap颠簸,一旦发生这种情况,先要明确是什么原因造成的,如果是内存不足就好办了,加内存就可以解决,不过有的时候即使内存充足也可能会出现这种问题,比如MySQL就有可能出现这样的情况,解决方法是限制使用Swap:
  shell& sysctl -w
vm.swappiness=0
  查看内存情况最常用的是free命令:
  shell& free -m
  total used free shared buffers
  -/+ buffers/cache:
  Swap: 7
  新手看到used一栏数值偏大,free一栏数值偏小,往往会认为内存要用光了。其实并非如此,之所以这样是因为每当我们操作文件的时候,Linux都会尽可能的把文件缓存到内存里,这样下次访问的时候,就可以直接从内存中取结果,所以cached一栏的数值非常的大,不过不用担心,这部分内存是可回收的,操作系统会按照LRU算法淘汰冷数据。除了cached,还有一个buffers,它和cached类似,也是可回收的,不过它的侧重点在于缓解不同设备的操作速度不一致造成的阻塞,这里就不多做解释了。
  知道了原理,我们就可以推算出系统可用的内存是free + buffers + cached:
  shell& echo &2723 + 239 + 25880& | bc
  至于系统实际使用的内存是used & buffers & cached:
  shell& echo &29377 - 239 - 25880& | bc
  除了free命令,还可以使用sar命令:
  shell& sar -r
  kbmemfree kbmemused %memused kbbuffers
   070160
   157372
   316396
   485672
   563540
  shell& sar -W
  pswpin/s pswpout/s
  0.00 0.00
  0.00 0.00
  0.00 0.00
  0.00 0.00
  0.00 0.00
  希望你没有被%memused吓到,如果不幸言中,请参考free命令的解释。
接着咱们分析一下mongodb是怎么使用内存的:
  目前,MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟缓存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。
  有时候,即便MongoDB使用的是64位操作系统,也可能会遭遇臭名昭著的OOM问题,出现这种情况,多半是因为限制了虚拟内存的大小所致,可以这样查看当前值:
  shell& ulimit -a | grep
  多数操作系统缺省都是把它设置成unlimited的,如果你的操作系统不是,可以这样修改:
  shell& ulimit -v unlimited
  不过要注意的是,ulimit的使用是有上下文的,最好放在MongoDB的启动脚本里。
  有时候,出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,所以通常你只能通过重启服务来释放内存,你一定不齿于这样的方法,幸好可以使用MongoDB内置的closeAllDatabases命令达到目的:
  mongo& use admin
  mongo&
db.runCommand({closeAllDatabases:1})
  另外,通过调整内核参数drop_caches也可以释放缓存:
  shell& sysctl -w
vm.drop_caches=1
  平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示:
  mongo& db.serverStatus().mem:
  &resident& : 22346,
  &virtual& : 1938524,
  &mapped& : 962283
  还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示:
  shell& mongostat
  mapped vsize res faults
  940g g 0
  940g g 0
  940g g 0
  940g g 0
  940g g 0
  其中内存相关字段的含义是:
  mapped:映射到内存的数据大小
  visze:占用的虚拟内存大小
  res:实际使用的内存大小
  注:如果操作不能再内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。
  在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,则vsize和mapped大致相当。
  如果想验证这一点,可以在开启或关闭journal后,通过pmap命令来观察文件映射情况:
  shell& pmap $(pidof mongod)
  到底MongoDB配备多大内存合适?宽泛点来说,多多益善,如果要确切点来说,这实际取决于你的数据及索引的大小,内存如果能够装下全部数据加索引是最佳情况,不过很多时候,数据都会比内存大,比如本文说涉及的MongoDB实例:
  mongo& db.stats()
  &dataSize& : 0,
  &indexSize& :
  本例中索引只有1G多,内存完全能装下,而数据文件则达到了1T,估计很难找到这么大内存,此时保证内存能装下热数据即可,至于热数据有多少,这就是个比例问题了,取决于具体的应用。如此一来内存大小就明确了:内存
& 索引 + 热数据。
  根据以上的分析我们可以得出几点结论:
  1. mongodb
直接用操作系统的内存管理器来管理内存。而操作系统采用的是LRU算法淘汰冷数据。
mongodb可以用重启服务、调整内核参数以及mongodb内部的语法去清理mongodb对内存的缓存。可能存在的问题是:这几种清理方式都是全部清理,这样的话mongodb的内存缓存就失效了。
  3. mongodb
对内存的使用是可以被监控的,在生产环境中要定时的去监控这些数据。
  4. mongodb
对内存这种占用方式使其尽量的和其他占用内存的业务分开部署,例如memcahe,sphinx,mysql等。
  5. 操作系统中的交换分区swap
如果操作频繁的话,会严重降低系统效率。要解决可以禁用交换分区,以及增加内存以及做分布式。
  6. 生产环境中mongodb所在的主机应该尽量的大内存。本文出自 “洪荒听雨” 博客,请务必保留此出处http://tingyu521./429
你最喜欢的8942人阅读
MongoDB(2)
最近一直跑得好好的项目总是会莫名其妙的停了服务,最初的时候没有在意这个情况,觉得可能只是一个意外而已,可连着发生了好几次,就觉得有点怪异了,然后查看tomcat的log文件,就发现了问题所在了,内存不足
当时还觉得有点不理解,应该这台服务器的配置还是很高的,然后服务器上也只是跑了两个tomcat和一个mongo数据库,觉得不应该有这种问题的,然后就去查了一下资料,原来是mongo数据库在作祟,然后自己也用命令去查看了一下
真是不看不知道,一看吓一跳,一个mongo数据库占了服务器超过一半的内存,厉害的时候可以到70多,这时候才知道mongo吃内存的严重了。
MongoDB如何使用内存
&&&&&&& 目前,MongoDB使用的是内存映射存储引擎,它会把磁盘IO操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用,如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。MongoDB并不干涉内存管理工作,而是把这些工作留给操作系统的虚拟缓存管理器去处理,这样的好处是简化了MongoDB的工作,但坏处是你没有方法很方便的控制MongoDB占多大内存,事实上MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起。
有时候,即便MongoDB使用的是64位操作系统,也可能会遭遇臭名昭著的OOM问题,出现这种情况,多半是因为限制了虚拟内存的大小所致,可以这样查看当前值:
大部分人都会和我一样,那就很好,如果不是的,可以自己修改过来:
不过要注意的是,ulimit的使用是有上下文的,最好放在MongoDB的启动脚本下。
&&&&&& 有时候,出于某些原因,你可能想释放掉MongoDB占用的内存,不过前面说了,内存管理工作是由虚拟内存管理器控制的,所以通常你只能通过重启服务来释放内存,你一定不齿于这样的方法,幸好可以使用MongoDB内置的closeAllDatabases命令达到目的:
当然,通过调整内核参数drop_caches也是可以释放缓存的:
平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示:
还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示:
其中内存相关字段的含义是:
mapped:映射到内存的数据大小&
仅以该文让自己以后再遇该类问题可以有据可依,也让他人不再困惑于这个问题上



&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:54365次
排名:千里之外
原创:31篇
转载:29篇
评论:13条
(2)(1)(1)(1)(6)(9)(6)(20)(13)(1)(2)(1)(1)(1)}

我要回帖

更多关于 网络信号大师 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信