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

小明思考

高性能服務器端計算
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>
            免费一级欧美片在线播放| 亚洲伦理中文字幕| 久久久久亚洲综合| 亚洲视频综合在线| 亚洲一区二区精品视频| 国产欧美va欧美va香蕉在| 国产精品青草综合久久久久99| 久久久一二三| 免费在线亚洲欧美| 欧美激情视频一区二区三区在线播放| 久久综合久久综合久久综合| 美女视频黄 久久| 亚洲第一主播视频| 亚洲福利电影| 一区二区冒白浆视频| 亚洲女人天堂成人av在线| 亚洲综合不卡| 免费欧美高清视频| 国产精品美女久久久久久久 | 日韩网站在线看片你懂的| 亚洲深夜福利视频| 亚洲欧美中文在线视频| 久久久久久久久伊人| 欧美精品色一区二区三区| 国产精品第一区| 有坂深雪在线一区| 亚洲欧美日韩一区二区在线| 麻豆久久精品| 亚洲香蕉视频| 欧美11—12娇小xxxx| 国产精品网站在线观看| 亚洲国产精品成人va在线观看| 亚洲午夜精品久久久久久浪潮 | 久久在线免费观看| 国产精品成人观看视频免费| 最新高清无码专区| 亚洲第一色中文字幕| 99综合电影在线视频| 久久精品国产一区二区三区| 欧美人体xx| 久久久夜精品| 一区二区精品在线| 蜜桃av一区二区三区| 欧美日韩一区二区三| 在线不卡a资源高清| 亚洲欧美日韩精品| 亚洲精品一区二区三区蜜桃久 | 欧美一区二区视频观看视频| 欧美人妖另类| 亚洲免费激情| 亚洲电影免费| 欧美成年人视频| 一区二区三区在线免费观看| 欧美一区二区三区视频| 在线视频中文亚洲| 欧美亚州在线观看| 亚洲国产女人aaa毛片在线| 亚洲美女黄网| 狠久久av成人天堂| 国产日韩欧美亚洲| 欧美亚洲视频在线观看| 日韩一级免费| 欧美另类女人| 欧美日韩一级大片网址| 99re热精品| 亚洲毛片av在线| 欧美性片在线观看| 新狼窝色av性久久久久久| 亚洲欧美日韩在线播放| 国产一区二区中文字幕免费看| 欧美影院视频| 久久亚洲综合色| 亚洲欧洲日韩在线| 91久久久国产精品| 久久一区国产| 欧美激情中文不卡| 国产人成一区二区三区影院| 99国产精品99久久久久久粉嫩 | 欧美久久视频| 夜夜爽www精品| 亚洲一区二区三区激情| 亚洲视频一区在线观看| 国产农村妇女精品一区二区| 久久精品二区亚洲w码| 久久久精品一区| 亚洲精品一区二区在线| 亚洲电影毛片| 狠狠色噜噜狠狠狠狠色吗综合| 性伦欧美刺激片在线观看| 亚洲精品美女在线观看播放| 国产一区二区三区久久悠悠色av| 日韩视频一区二区三区在线播放免费观看| 欧美无砖砖区免费| 国产午夜久久久久| 美女主播一区| 欧美精品尤物在线| 欧美在线视频导航| 久久人人爽人人爽| 亚洲欧美另类中文字幕| 久久久久国色av免费看影院| 亚洲毛片av| 欧美影院成人| 亚洲一区二区三区在线视频| 久久久欧美精品| 亚洲一区国产视频| 麻豆精品在线观看| 久久国产直播| 欧美午夜激情在线| 麻豆国产精品777777在线| 夜夜爽夜夜爽精品视频| 久久字幕精品一区| 麻豆精品视频在线| 欧美三区不卡| 欧美成人伊人久久综合网| 欧美天堂亚洲电影院在线播放| 久久偷看各类wc女厕嘘嘘偷窃| 欧美日韩三区| 亚洲激情校园春色| 狠狠久久五月精品中文字幕| 一区二区欧美日韩| 亚洲精品色图| 另类成人小视频在线| 久久久久九九九| 国产伦精品一区二区三区免费| 亚洲国产精品视频一区| 一区二区三区在线观看国产| 亚洲免费视频网站| 亚洲一区二区成人| 亚洲午夜av| 欧美高潮视频| 欧美va日韩va| 国内精品久久久| 欧美一级午夜免费电影| 亚洲欧美一级二级三级| 欧美视频精品一区| 日韩视频一区二区三区在线播放| 亚洲日本一区二区| 欧美国产在线观看| 亚洲欧洲视频| 一二三四社区欧美黄| 欧美激情在线有限公司| 亚洲精品久久7777| 亚洲午夜影视影院在线观看| 欧美日韩大片一区二区三区| 亚洲精品在线免费观看视频| 99国产成+人+综合+亚洲欧美| 欧美精品成人一区二区在线观看| 久久久99爱| 欧美一区二区成人| 欧美网站在线观看| 亚洲一区二区毛片| 久久精品国产在热久久| 国产一区二区三区久久| 久久久久国产一区二区| 亚洲国产精品一区制服丝袜 | 国产精品国产亚洲精品看不卡15| a91a精品视频在线观看| 亚洲一级影院| 国产九区一区在线| 久久视频在线看| 亚洲精品视频免费在线观看| 亚洲亚洲精品三区日韩精品在线视频| 国产精品yjizz| 久久精品女人的天堂av| 亚洲国产精品一区制服丝袜| 亚洲午夜一级| 一区在线观看| 欧美日韩在线一二三| 欧美在线资源| 亚洲欧洲另类国产综合| 欧美一区二区三区婷婷月色 | 激情另类综合| 欧美日韩亚洲视频| 欧美在线啊v| 最新日韩欧美| 久久尤物视频| 亚洲欧美精品一区| 亚洲黄色av| 国产亚洲欧美中文| 欧美日韩国产在线看| 久久久久国内| 亚洲一区二区三区视频| 亚洲福利在线视频| 久久久久综合一区二区三区| 亚洲三级视频在线观看| 国产揄拍国内精品对白| 欧美日韩在线视频一区二区| 久久天堂精品| 欧美中文字幕精品| 亚洲欧美国产日韩天堂区| 91久久精品美女| 欧美a级在线| 久久久久久黄| 香蕉久久夜色精品国产| 亚洲免费观看高清在线观看| 在线观看精品一区| 国产在线精品一区二区中文| 国产精品久久久久久亚洲毛片 | 欧美日韩高清免费| 免费观看亚洲视频大全|