试图在这里挤出很多的问题 – 请耐心等待。
尽pipeMongoDB手册页提供了一些关于系统设置的有用build议,如ulimit( http://docs.mongodb.org/manual/reference/ulimit/ )和其他生产因素( http://docs.mongodb.org/manual/pipe理/生产笔记/ ),他们似乎神秘沉默的东西,如虚拟内存和交换设置。
最接近的提示是“…操作系统的虚拟内存子系统pipe理MongoDB的内存…”( http://docs.mongodb.org/manual/faq/fundamentals/#does-mongodb-require-很多公羊 )。
运行同样的工作 – 在单个集合中的大约10,000,000个logging中的高写入和高读取 – 在我的4处理器,4GB RAM macbook和具有64GB RAM的8核ubuntu机箱上,我看到了在Linux盒子上显着的WORSE读取性能出厂设置,并可以听到磁盘不断旋转,表明高I / O和大概交换。 是的,盒子上还有其他的东西,但是有足够的可用RAM,磁盘空间等等。 此外,我没有看到有证据表明Mongo正在扩大,以利用所有可用的RAM,因为它被吹捧。
Linux机器的默认设置如下:vm.swappiness = 60 vm.dirty_background_ratio = 10 vm.dirty_ratio = 20 vm.dirty_expire_centisecs = 3000 vm.dirty_writeback_centisecs = 500
我对一些其他types的数据库(Oracle,MYSQL等)的文档和博客进行了一些猜测,并进行了实验,并进行了如下调整。 vm.swappiness = 10 vm.dirty_background_ratio = 5 vm.dirty_ratio = 5 vm.dirty_writeback_centisecs = 250 vm.dirty_expire_centisecs = 500
我看到一些读取时间有了明显的改善。 然而,当我再次进行testing工作时,在繁重的写作过程中,读取性能仍然非常缓慢。
然后,我从一个可用的数据源中重新收集数据 – 在执行写入工作时,突然间我可以以每个logging1ms或更less的速度读取数据!
所以这个问题实际上是双重的:
1) Linux上的MongoDB的适当虚拟机设置是什么? 2)(奖金) Mongo在数据build立的时候是否对操作系统进行一些检查或优化? 换句话说,如果我build立了一个虚拟机或I / O设置不理想的大型数据集,Mongo会在内存映射过程中做出假设,无法利用优化的道路?
显然,我不完全怀念内存映射(我希望我不会)。
任何帮助赞赏…谢谢! -j
我认为你的情况与4 Gig的RAM是相当不错的覆盖这里Neo4j也使用内存映射IO,因此应该适用相同的调整措施:
http://docs.neo4j.org/chunked/stable/linux-performance-guide.html
所以从阅读这个我认为你的
vm.dirty_ratio=5 vm.dirty_background_ratio=5
太低了,比不上高。