成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MongoDB數據緩存刷新機制

數據庫 其他數據庫 MongoDB
在MongoDB開發者論壇里描述了這個現象,但是 Eliot Horowitz認為MongoDB內部并沒有代碼會釋放文件系統cache。那么,讓我們去源碼里面看一下MongoDB緩存和刷新數據的機制。

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

首先找到mongod的入口(db/db.cpp),發現MongoDB的初始化步驟非常簡單,概括起來就以下三步:

  1. int main(int argc, char* argv[], char *envp[] ) 
  2. … 
  3. Module::configAll( params ); 
  4. dataFileSync.go(); 
  5. … 
  6. initAndListen(cmdLine.port, appsrvPath); 
  7. … 

顯然,dataFileSync就是我們感興趣的那個類。dataFileSync類派生自BackgroundJob類,而BackgroundJob 主要的功能就是生成一個后臺線程并指派任務。數據的刷新是一個不斷執行的后臺任務,在dataFileSync.run()里面可以找到刷數據的相關代碼:

  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); 
  7. … 

從這一段代碼看,MongoDB會在syncdelay設定的周期內,采取同步的形式刷新所有的臟數據。再看一下flushAll是怎么刷新所有數據的:

  1. int MongoFile::flushAll( bool sync ) 
  2.  { 
  3.  … 
  4.  set seen; 
  5.  while ( true ){ 
  6.  auto_ptr f; 
  7.  { 
  8.  rwlock lk( mmmutex , false ); 
  9.  for ( set::iterator i = mmfiles.begin(); i != mmfiles.end(); i++ ){ 
  10.  MongoFile * mmf = *i; 
  11.  if ( ! mmf ) 
  12.  continue
  13.  if ( seen.count( mmf ) ) 
  14.  continue
  15.  f.reset( mmf->prepareFlush() ); 
  16.  seen.insert( mmf ); 
  17.  break; 
  18.  } 
  19.  } 
  20.  if ( ! f.get() ) 
  21.  break; 
  22.  f->flush(); 
  23.  } 
  24.  return seen.size(); 
  25.  } 

上面這一段代碼實現的功能很簡單,就是把mmfiles中所有MongoFile指針所引用的對象都flush()一次。不過在執行flush()函數之前,需要先執行prepareFlush()確保這個對象是可以執行flush()函數的。下面是***真正執行刷新操作的代碼:

  1. void MemoryMappedFile::flush(bool sync) 
  2. if ( view == 0 || fd == 0 ) 
  3. return
  4. if ( msync(view, len, sync ? MS_SYNC : MS_ASYNC) ) 
  5. problem() << “msync ” << errnoWithDescription() << endl; 

終于刷新到磁盤了,呵呵。不過這篇blog只涉及到了數據刷新的代碼,至于如何緩存,且聽下回分解。

【編輯推薦】

  1. 設計實例對比:MySQL vs MongoDB
  2. MongoDB基于Java、PHP的一般操作和用戶安全設置
  3. 在Windows環境下MongoDB搭建和簡單操作
  4. 教你如何利用MySQL學習MongoDB
  5. 如何用Java操作MongoDB

 

 

責任編輯:艾婧 來源: 淘寶數據庫技術團隊
相關推薦

2021-12-08 06:53:28

Choreograph屏幕機制

2021-04-21 07:53:13

Android屏幕刷新

2020-10-13 08:36:30

React 架構機制

2025-05-07 08:00:00

刷新令牌自動續簽FastAPI

2010-09-06 08:43:13

.NET 4

2024-01-03 21:50:32

緩存機制請求

2010-06-02 11:33:26

Linux 內存監控

2010-03-10 11:55:30

Mocha BSM運維管理摩卡軟件

2020-09-21 14:35:20

VuenextTick前端

2024-06-17 08:55:52

2025-04-03 00:45:00

2016-10-21 09:29:53

嵌入式Linux更新機制

2021-02-25 11:12:31

人工智能生物技術肺纖維化藥物

2018-08-10 04:40:56

2009-08-03 18:35:51

ASP.NET數據緩存

2024-04-29 08:05:34

NacosJava數據結構

2011-12-15 09:33:19

Java

2009-06-17 15:43:03

Hibernate緩存

2023-02-24 16:46:25

Glide緩存機制

2021-01-19 10:39:03

Redis緩存數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区在线 | 亚洲激情一区二区三区 | 久久久久久电影 | 九九亚洲 | 亚洲欧美一区二区三区1000 | www.精品国产 | 国产精品99久久久久 | 久久久久久免费精品一区二区三区 | 欧美视频成人 | 亚洲国产一区二区三区四区 | 国产精品一区在线观看你懂的 | 97人澡人人添人人爽欧美 | 欧美成人h版在线观看 | 午夜私人影院 | av片在线播放 | 国产精品一区二区av | 久草视频在线播放 | 91爱啪啪| 国产欧美一区二区三区久久手机版 | 日韩国产在线观看 | 日韩av三区 | 国产欧美日韩一区 | 亚洲一区二区三区 | 高清视频一区二区三区 | 精品国产第一区二区三区 | 国产免费一级片 | 麻豆久久精品 | 91精品国产综合久久精品图片 | 综合色影院 | 亚洲永久精品国产 | 国产一区二区欧美 | 久久久人成影片一区二区三区 | 中文字幕日韩一区 | 精品国偷自产在线 | 国产在线视频一区二区 | 久久久久欧美 | 偷拍亚洲色图 | 中文字字幕在线中文乱码范文 | 国产福利一区二区 | 在线观看亚洲精品视频 | 蜜桃av一区二区三区 |