亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 6029 | 回復(fù): 1
打印 上一主題 下一主題

[MongoDB] MongoDB數(shù)據(jù)緩存刷新機(jī)制 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-02-22 14:51 |只看該作者 |倒序?yàn)g覽
MongoDB數(shù)據(jù)緩存刷新機(jī)制




本文原文出自淘寶DBA團(tuán)隊(duì)博客,文章對(duì)MongoDB源碼進(jìn)行了分析,跟蹤了其緩存Flush機(jī)制,對(duì)緩存刷新機(jī)制進(jìn)行了清晰的講解。

最近配合好幾個(gè)項(xiàng)目測(cè)試了MongoDB的寫入性能。在內(nèi)存沒有用盡的情況下,雖然MongoDB只有一個(gè)更新線程,寫入還是非?斓,基本上能達(dá)到25000/s以上(索引數(shù)據(jù)用uuid_generate_randome和uuid_unparse隨機(jī)產(chǎn)生)。當(dāng)內(nèi)存用盡開始往磁盤上刷臟頁(yè)的時(shí)候,性能有非常大的波動(dòng),即使調(diào)整了syncdelay也沒有太大改善。在測(cè)試中還出現(xiàn)了一個(gè)莫名其妙的情況:MongoDB會(huì)間歇性地釋放文件系統(tǒng)的cache。除了直接刪除表空間之外,很難想到有什么動(dòng)作可以誘發(fā)這個(gè)現(xiàn)象。在MongoDB開發(fā)者論壇里描述了這個(gè)現(xiàn)象,但是Eliot Horowitz認(rèn)為MongoDB內(nèi)部并沒有代碼會(huì)釋放文件系統(tǒng)cache。那么,讓我們?nèi)ピ创a里面看一下MongoDB緩存和刷新數(shù)據(jù)的機(jī)制。

首先找到mongod的入口(db/db.cpp),發(fā)現(xiàn)MongoDB的初始化步驟非常簡(jiǎn)單,概括起來(lái)就以下三步:
  1. int main(int argc, char* argv[], char *envp[] )
  2. {

  3. Module::configAll( params );
  4. dataFileSync.go();

  5. initAndListen(cmdLine.port, appsrvPath);
復(fù)制代碼
}顯然,dataFileSync就是我們感興趣的那個(gè)類。dataFileSync類派生自BackgroundJob類,而BackgroundJob主要的功能就是生成一個(gè)后臺(tái)線程并指派任務(wù)。數(shù)據(jù)的刷新是一個(gè)不斷執(zhí)行的后臺(tái)任務(wù),在dataFileSync.run()里面可以找到刷數(shù)據(jù)的相關(guān)代碼:
  1. void run()
  2. {

  3. Date_t start = jsTime();
  4. int numFiles = MemoryMappedFile::flushAll( true );
  5. time_flushing = (int) (jsTime() – start);

  6. globalFlushCounters.flushed(time_flushing);
復(fù)制代碼

}從這一段代碼看,MongoDB會(huì)在syncdelay設(shè)定的周期內(nèi),采取同步的形式刷新所有的臟數(shù)據(jù)。再看一下flushAll是怎么刷新所有數(shù)據(jù)的:
  1. int MongoFile::flushAll( bool sync )
  2. {

  3. set seen;
  4. while ( true ){
  5. auto_ptr f;
  6. {
  7. rwlock lk( mmmutex , false );
  8. for ( set::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ){
  9. MongoFile * mmf = *i;
  10. if ( ! mmf )
  11. continue;
  12. if ( seen.count( mmf ) )
  13. continue;
  14. f.reset( mmf->prepareFlush() );
  15. seen.insert( mmf );
  16. break;
  17. }
  18. }
  19. if ( ! f.get() )
  20. break;

  21. f->flush();
  22. }
  23. return seen.size();
復(fù)制代碼
}上面這一段代碼實(shí)現(xiàn)的功能很簡(jiǎn)單,就是把mmfiles中所有MongoFile指針?biāo)玫膶?duì)象都flush()一次。不過在執(zhí)行flush()函數(shù)之前,需要先執(zhí)行prepareFlush()確保這個(gè)對(duì)象是可以執(zhí)行flush()函數(shù)的。下面是最后真正執(zhí)行刷新操作的代碼:

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只涉及到了數(shù)據(jù)刷新的代碼,至于如何緩存,且聽下回分解。

來(lái)源:www.taobaodba.com


論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-02-24 17:38 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP