MongoDB数据缓存刷新机制
最近配合好几个项目测试了MongoDB的写入性能。在内存没有用尽的情况下,虽然MongoDB只有一个更新线程,写入还是非常快的,基本上能达到25000/s以上(索引数据用uuid_generate_randome和uuid_unparse随机产生)。当内存用尽开始往磁盘上刷脏页的时候,性能有非常大的波动,即使调整了syncdelay也没有太大改善。在测试中还出现了一个莫名其妙的情况:MongoDB会间歇性地释放文件系统的cache。除了直接删除表空间之外,很难想到有什么动作可以诱发这个现象。在MongoDB开发者论坛里描述了这个现象,但是 Eliot Horowitz认为MongoDB内部并没有代码会释放文件系统cache。那么,让我们去源码里面看一下MongoDB缓存和刷新数据的机制。
首先找到mongod的入口(db/db.cpp),发现MongoDB的初始化步骤非常简单,概括起来就以下三步:
- int main(int argc, char* argv[], char *envp[] )
- {
- …
- Module::configAll( params );
- dataFileSync.go();
- …
- initAndListen(cmdLine.port, appsrvPath);
- …
- }
显然,dataFileSync就是我们感兴趣的那个类。dataFileSync类派生自BackgroundJob类,而BackgroundJob 主要的功能就是生成一个后台线程并指派任务。数据的刷新是一个不断执行的后台任务,在dataFileSync.run()里面可以找到刷数据的相关代码:
- void run()
- {
- …
- Date_t start = jsTime();
- int numFiles = MemoryMappedFile::flushAll( true );
- time_flushing = (int) (jsTime() – start);
- globalFlushCounters.flushed(time_flushing);
- …
- }
从这一段代码看,MongoDB会在syncdelay设定的周期内,采取同步的形式刷新所有的脏数据。再看一下flushAll是怎么刷新所有数据的:
- int MongoFile::flushAll( bool sync )
- {
- …
- set seen;
- while ( true ){
- auto_ptr f;
- {
- rwlock lk( mmmutex , false );
- for ( set::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ){
- MongoFile * mmf = *i;
- if ( ! mmf )
- continue;
- if ( seen.count( mmf ) )
- continue;
- f.reset( mmf->prepareFlush() );
- seen.insert( mmf );
- break;
- }
- }
- if ( ! f.get() )
- break;
- f->flush();
- }
- return seen.size();
- }
上面这一段代码实现的功能很简单,就是把mmfiles中所有MongoFile指针所引用的对象都flush()一次。不过在执行flush()函数之前,需要先执行prepareFlush()确保这个对象是可以执行flush()函数的。下面是***真正执行刷新操作的代码:
- void MemoryMappedFile::flush(bool sync)
- {
- if ( view == 0 || fd == 0 )
- return;
- if ( msync(view, len, sync ? MS_SYNC : MS_ASYNC) )
- problem() << “msync ” << errnoWithDescription() << endl;
- }
终于刷新到磁盘了,呵呵。不过这篇blog只涉及到了数据刷新的代码,至于如何缓存,且听下回分解。
【编辑推荐】
- 设计实例对比:MySQL vs MongoDB
- MongoDB基于Java、PHP的一般操作和用户安全设置
- 在Windows环境下MongoDB搭建和简单操作
- 教你如何利用MySQL学习MongoDB
- 如何用Java操作MongoDB
相关文章
- 从本体论开始说起——运营商关系图谱的构建及应用
- 如何成为一名数据科学家?
- 从未见过的堂兄杀了人,你的DNA是关键证据
- 20个安全可靠的免费数据源,各领域数据任你挑
- 20个安全可靠的免费数据源,各领域数据任你挑
- 阿里云李飞飞:All in Cloud时代,云原生数据库优势明显
- 基于Hadoop生态系统的一高性能数据存储格式CarbonData(性能篇)
- 大数据告诉你:10年漫威,到底有多少角色
- TigerGraph:实时图数据库助力金融风控升级
- Splunk利用Splunk Connected Experiences和Splunk Business Flow 扩大数据访问
- 大数据开发常见的9种数据分析手段
- 以免在景区看人,我爬了5W条全国景点门票数据...
- 【实战解析】基于HBase的大数据存储在京东的应用场景
- 数据科学家告诉你哪些计算机科学书籍是你应该看的
- Kafka作为大数据的核心技术,你了解多少?
- Spring Boot 整合 Redis 实现缓存操作
- 大数据学习必须掌握的五大核心技术有哪些?
- 基于Antlr在Apache Flink中实现监控规则DSL化的探索实践
- 甲骨文再次被Gartner评为分析型数据管理解决方案魔力象限领导者
- 爬取吴亦凡微博102118条转发数据,扒一扒流量的真假