青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小明思考

高性能服務器端計算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

那些leveldb使用的奇技淫巧1-內存管理

Posted on 2012-03-28 18:00 小明 閱讀(9211) 評論(1)  編輯 收藏 引用 所屬分類: C/C++Cloud computing

leveldb(http://code.google.com/p/leveldb) 是Google一款基于key-value的數據庫,其作者是google大牛jeff dean的作品,功力深厚,有很多細節的處理值得我們去學習。

背景
我們都知道,對于一個高性能的服務器端程序來說,內存的使用非常重要。C++提供了new/delete來管理內存的申請和釋放,但是對于小對象來說,直接使用new/delete代價比較大,要付出額外的空間和時間,性價比不高。
另外,我們也要避免多次的申請和釋放引起的內存碎片。一旦碎片到達一定程度,即使剩余內存總量夠用,但由于缺乏足夠的連續空閑空間,導致內存不夠用的假象。
c++ STL為了避免內存碎片,實現一個復雜的內存池,leveldb中則沒有那么復雜,只是實現了一個"一次性"內存池Arena。
在leveldb里面,并不是所有的地方都使用了這個內存池,主要是memtable使用,主要是用于臨時存放用戶的更新數據,由于更新的數據可能很小,所以這里使用內存池就很合適。

原理
為了避免小對象的頻繁分配,需要減少對new的調用,最簡單的做法就是申請大塊的內存,多次分給客戶。
leveldb用一個vector<char *>來保存所有的內存分配記錄,默認每次申請4k的內存,記錄下剩余指針和剩余內存字節數,每當有新的申請,如果當前剩余的字節能滿足需要,則直接返回給用戶,如果不能,對于超過1k的請求,直接new返回,小于1K的請求,則申請一個新的4k塊,從中分配一部分給用戶。
但是這樣的一個問題就是當前塊剩余的部分就浪費了,改進的方法,針對每個block都記錄剩余字節,這樣就需要遍歷來查找合適的block,要付出一些性能的代價。google的做法是浪費就浪費吧:-)
至于釋放,需要釋放整個內存池來釋放所占內存,這個和leveldb的需求有關,memtable不需要釋放單次內存,flush到硬盤后整個memtable銷毀。





具體實現
讓我們來看看具體實現。

定義:<util/arena.h>
class Arena {
 
public:
  Arena();
  
~Arena();

  
//分配內存
  char* Allocate(size_t bytes);

  
//對齊分配
  char* AllocateAligned(size_t bytes);

  
// 當前的內存使用量
  size_t MemoryUsage() const {
    
return blocks_memory_ + blocks_.capacity() * sizeof(char*);
  }

 
private:
  
//分配內存,不能直接分配
  char* AllocateFallback(size_t bytes);
  
//新生成一個BLOCK
  char* AllocateNewBlock(size_t block_bytes);

  
//當前free指針
  char* alloc_ptr_;
  
//當前BLOCK剩余字節大小
  size_t alloc_bytes_remaining_;

  
//保存所有分配的內存
  std::vector<char*> blocks_;

  
//已經分配的總內存大小
  size_t blocks_memory_;

  
//禁止copy構造
  Arena(const Arena&);
  
void operator=(const Arena&);
};

實現<util/arena..cc>

//默認BLOCK size
static const int kBlockSize = 4096;

inline 
char* Arena::Allocate(size_t bytes) {
  
//如果申請量能滿足需要,直接分配
  if (bytes <= alloc_bytes_remaining_) {
    
char* result = alloc_ptr_;
    alloc_ptr_ 
+= bytes;
    alloc_bytes_remaining_ 
-= bytes;
    
return result;
  }
  
return AllocateFallback(bytes);
}

char* Arena::AllocateFallback(size_t bytes) {
  
//大于1KB,直接分配一個新的BLOCK
  if (bytes > kBlockSize / 4) {
    
char* result = AllocateNewBlock(bytes);
    
return result;
  }

  
//申請一個新的BLOCK,浪費少于當前申請bytes的剩余空間 
  alloc_ptr_ = AllocateNewBlock(kBlockSize);
  alloc_bytes_remaining_ 
= kBlockSize;

  
//設置free指針和剩余大小
  char* result = alloc_ptr_;
  alloc_ptr_ 
+= bytes;
  alloc_bytes_remaining_ 
-= bytes;
  
return result;
}

其他
對于那些不使用arena來分配的內存,怎么去優化呢?leveldb使用tcmalloc進行優化。tcmalloc是google-perftool中的一個工具,用于替代glibc的默認new實現。
看看leveldb的Makefile就知道,使用tcmalloc很簡單,只需要加入-ltcmalloc重新編譯就可以了。

# If Google Perf Tools are installed, add compilation and linker flags
# (see http:
//code.google.com/p/google-perftools/)
ifeq ($(GOOGLE_PERFTOOLS), 1)
GOOGLE_PERFTOOLS_LDFLAGS
=-ltcmalloc
else
GOOGLE_PERFTOOLS_LDFLAGS
=
endif

順便提一下,redis使用的是jemalloc來提高malloc的效率

這里有一個性能比較,看起來tcmalloc的性能最好。

Allocator   CPU Time (min)  Commit Memory  Region Support  
MSVC malloc       2:59          543 MB              No
ptmalloc      2:01          480 MB         Yes
ned malloc        2:01          652 MB         Yes
tc malloc         1:39          454 MB         No
je malloc     1:59          496 MB         No

請參考:

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线日韩日本国产亚洲| 欧美激情视频在线播放 | 国产美女扒开尿口久久久| 亚洲一区二区视频| 亚洲一区二区在线观看视频| 国产精品www网站| 久久久精品国产99久久精品芒果| 午夜精品亚洲一区二区三区嫩草| 国产主播一区二区| 欧美国产精品一区| 一区二区国产在线观看| 亚洲美女视频在线免费观看| 国产一区二区三区久久久久久久久| 午夜精品福利在线| 久久久久久久精| 亚洲靠逼com| 亚洲欧洲av一区二区| 伊人色综合久久天天| 日韩亚洲欧美成人一区| 国产欧美视频一区二区| 欧美激情四色| 国产精品女主播在线观看 | 欧美视频第二页| 久久网站热最新地址| 欧美日韩精品一区二区在线播放| 性视频1819p久久| 欧美1区视频| 久久婷婷av| 鲁大师影院一区二区三区| 欧美精品18+| 久久精品一级爱片| 欧美日韩视频专区在线播放 | 中文一区二区| 欧美在线地址| 亚洲一区二区三区成人在线视频精品| 欧美一区二区三区另类 | 亚洲欧美另类在线| 欧美成人一区在线| 久久久噜噜噜| 国产麻豆精品theporn| 91久久精品www人人做人人爽 | 欧美日韩国产成人在线| 久久躁日日躁aaaaxxxx| 国产老女人精品毛片久久| 亚洲美女在线观看| 亚洲精品视频啊美女在线直播| 久久国产夜色精品鲁鲁99| 99在线热播精品免费99热| 欧美日韩精品免费观看| 国产精品理论片| 久久激情五月激情| 久久99在线观看| 欧美午夜精品久久久久久孕妇| 久久婷婷丁香| 国产伦一区二区三区色一情| 一区二区三区蜜桃网| 99成人免费视频| 欧美精品一区在线播放| 亚洲国产成人午夜在线一区| 亚洲第一精品在线| 久久婷婷国产综合精品青草| 久久青草久久| 亚洲国产岛国毛片在线| 久久一区二区三区超碰国产精品| 久久夜色精品亚洲噜噜国产mv| 国产欧美一区二区精品秋霞影院| 亚洲自拍偷拍色片视频| 欧美一区二区三区久久精品| 国产伦精品一区二区三| 99精品欧美一区二区三区综合在线| 噜噜爱69成人精品| 国产欧美一区二区精品性色| 性做久久久久久免费观看欧美| 欧美在线播放一区二区| 激情婷婷久久| 久久久久成人精品| 亚洲大胆美女视频| 一区二区三区回区在观看免费视频| 欧美日韩国产成人在线91| 亚洲视频一二| 久久久久久久999| 亚洲国产美国国产综合一区二区| 欧美成人免费观看| 亚洲日本一区二区| 亚洲欧美亚洲| 精品999久久久| 欧美日韩精品系列| 久久av红桃一区二区小说| 欧美成人dvd在线视频| 中文国产一区| 激情文学综合丁香| 欧美日韩美女| 久久精品30| 亚洲精品三级| 久久精品国产精品亚洲综合| 亚洲黄色一区二区三区| 国产精品成人观看视频国产奇米| 久久er精品视频| 日韩一区二区免费看| 久久精品二区亚洲w码| 亚洲乱码国产乱码精品精可以看| 国产精品免费视频观看| 蜜桃av噜噜一区二区三区| 一本久道久久综合中文字幕| 久久综合亚州| 午夜亚洲福利在线老司机| 亚洲国产一区二区在线| 国产伦精品一区二区三区高清版| 免费在线成人av| 欧美一区二区高清| 一本色道久久综合亚洲精品婷婷| 另类激情亚洲| 欧美中文字幕在线观看| 一本久久a久久精品亚洲| 精品999日本| 国产情人节一区| 性欧美长视频| 一本久久综合亚洲鲁鲁五月天| 亚洲免费一在线| 国产精品久久久久一区| 亚洲免费激情| 亚洲国产三级在线| 久久人人爽爽爽人久久久| 国产欧美日韩激情| 亚洲女ⅴideoshd黑人| 亚洲美女在线观看| 国产精品久久久久久久久久妞妞| 国产专区综合网| 欧美色中文字幕| 亚洲精品自在在线观看| 欧美高清免费| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲女女女同性video| 9国产精品视频| 亚洲免费观看高清完整版在线观看熊| 激情小说另类小说亚洲欧美| 国产欧美日韩精品一区| 国产精品国产一区二区| 欧美性jizz18性欧美| 欧美三级日韩三级国产三级 | 亚洲一区久久久| 中国成人亚色综合网站| 日韩小视频在线观看| 亚洲精品久久久蜜桃| 亚洲欧洲一区二区三区| 亚洲精品一区中文| 一本色道精品久久一区二区三区 | 精品粉嫩aⅴ一区二区三区四区| 狠狠色丁香久久婷婷综合_中| 国产综合色产在线精品| 一区二区三区在线观看视频| 在线观看日韩一区| 最新亚洲电影| 中文欧美字幕免费| 西瓜成人精品人成网站| 久久久亚洲精品一区二区三区| 美女视频黄免费的久久| 欧美大片免费观看| 亚洲人永久免费| 在线中文字幕不卡| 午夜精品久久久| 免费91麻豆精品国产自产在线观看| 欧美精品18| 国产毛片一区二区| 亚洲国产高清在线| 夜夜精品视频| 久久精品国产亚洲一区二区| 美国成人直播| 亚洲伦理精品| 久久国产毛片| 欧美精品在线免费播放| 国产日韩精品在线播放| 亚洲国产日韩一区| 香蕉亚洲视频| 亚洲福利av| 午夜精品福利视频| 欧美大片免费观看在线观看网站推荐| 欧美色视频日本高清在线观看| 国内自拍一区| 亚洲一区免费网站| 欧美wwwwww| 先锋影音国产精品| 欧美成人黑人xx视频免费观看| 一区二区在线观看视频| 国产视频综合在线| 亚洲精品视频免费观看| 久久国产手机看片| 亚洲欧洲在线一区| 久久国产日韩| 老牛嫩草一区二区三区日本| 免费不卡视频| 可以免费看不卡的av网站| 91久久线看在观草草青青| 欧美亚洲免费电影| 欧美私人啪啪vps| 亚洲第一在线综合网站| 久久精品国产99精品国产亚洲性色| 亚洲精品黄色| 欧美大片免费| 亚洲国产精品一区制服丝袜|