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

小明思考

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

leveldb(http://code.google.com/p/leveldb) 是Google一款基于key-value的數(shù)據(jù)庫,其作者是google大牛jeff dean的作品,功力深厚,有很多細節(jié)的處理值得我們?nèi)W(xué)習(xí)。

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

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





具體實現(xiàn)
讓我們來看看具體實現(xiàn)。

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

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

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

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

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

  
//當(dāng)前free指針
  char* alloc_ptr_;
  
//當(dāng)前BLOCK剩余字節(jié)大小
  size_t alloc_bytes_remaining_;

  
//保存所有分配的內(nèi)存
  std::vector<char*> blocks_;

  
//已經(jīng)分配的總內(nèi)存大小
  size_t blocks_memory_;

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

實現(xiàn)<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,浪費少于當(dāng)前申請bytes的剩余空間 
  alloc_ptr_ = AllocateNewBlock(kBlockSize);
  alloc_bytes_remaining_ 
= kBlockSize;

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

其他
對于那些不使用arena來分配的內(nèi)存,怎么去優(yōu)化呢?leveldb使用tcmalloc進行優(yōu)化。tcmalloc是google-perftool中的一個工具,用于替代glibc的默認new實現(xiàn)。
看看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>
            欧美日韩亚洲一区二区三区在线观看| 亚洲欧洲综合另类| 国产一区二区在线免费观看 | 国模叶桐国产精品一区| 国产精品免费在线| 国产日韩欧美综合| 国模精品娜娜一二三区| 在线观看日韩av先锋影音电影院| 影音先锋中文字幕一区二区| 亚洲大片在线| 99精品黄色片免费大全| 欧美一级视频精品观看| 欧美在线视频免费| 欧美r片在线| 一本到12不卡视频在线dvd | 欧美成人精品不卡视频在线观看| 欧美成人第一页| 国产精品video| 激情久久综合| 欧美女人交a| 欧美中文字幕| 鲁大师影院一区二区三区| 欧美激情a∨在线视频播放| 最新国产精品拍自在线播放| 亚洲一区影院| 免费欧美电影| 国产精品久久激情| 亚洲欧洲精品一区二区| 香蕉久久a毛片| 亚洲激情欧美| 久久国产欧美精品| 国产精品成人一区二区三区吃奶| 伊人成综合网伊人222| 夜夜嗨av色一区二区不卡| 久久亚洲一区| 午夜激情久久久| 欧美日韩视频一区二区三区| 在线欧美电影| 久久免费精品日本久久中文字幕| 一本色道久久精品| 欧美成人精品在线视频| 黄色日韩在线| 久久er99精品| 国产精品99久久不卡二区| 欧美成人免费小视频| 狠狠操狠狠色综合网| 性18欧美另类| 在线视频免费在线观看一区二区| 欧美gay视频| 精品91在线| 久久免费99精品久久久久久| 亚洲专区在线视频| 国产精品日韩电影| 亚洲欧美电影院| 99精品国产99久久久久久福利| 欧美风情在线观看| 亚洲高清av在线| 美日韩精品视频| 久久久亚洲一区| 亚洲福利免费| 亚洲国产高清一区二区三区| 巨乳诱惑日韩免费av| 一区在线观看视频| 欧美国产日韩一二三区| 裸体女人亚洲精品一区| 亚洲大胆美女视频| 欧美激情a∨在线视频播放| 免费看亚洲片| 99在线热播精品免费99热| 亚洲美女视频在线观看| 欧美日韩一区二区三区| 亚洲欧美日韩一区在线观看| 亚洲欧美日韩在线播放| 黄色亚洲在线| 欧美好吊妞视频| 欧美精品系列| 翔田千里一区二区| 久久久国产精品一区| 亚洲高清色综合| 亚洲国产mv| 欧美日韩精品系列| 亚洲天堂av图片| 亚洲女同性videos| 永久555www成人免费| 亚洲欧洲日韩在线| 国产精品资源在线观看| 久久亚洲图片| 欧美日韩国产小视频在线观看| 午夜视频一区在线观看| 久久久一二三| 亚洲视频在线二区| 欧美在线视频观看免费网站| 亚洲精品久久7777| 一区二区三区日韩欧美| 韩国女主播一区| 亚洲精品久久久久久久久| 国产欧美一区二区三区沐欲| 老司机免费视频一区二区三区| 欧美精选一区| 久久久av毛片精品| 欧美日本一区二区视频在线观看| 性色一区二区三区| 欧美高清不卡在线| 久久激情网站| 国产精品成av人在线视午夜片| 久久亚洲色图| 国产精品二区影院| 91久久精品久久国产性色也91| 国产午夜精品美女毛片视频| 亚洲精品女av网站| 国产午夜精品久久久久久免费视 | 久久精品国产视频| 欧美精品国产精品日韩精品| 久久视频精品在线| 国产精品盗摄一区二区三区| 欧美激情网友自拍| 伊人精品在线| 欧美在线观看www| 亚洲欧美日韩一区二区在线| 欧美日韩高清区| 欧美激情偷拍| 亚洲国产欧洲综合997久久| 午夜久久久久久| 亚洲综合色噜噜狠狠| 欧美连裤袜在线视频| 亚洲电影在线看| 136国产福利精品导航网址应用| 午夜在线成人av| 欧美一区二区三区电影在线观看| 欧美区亚洲区| 亚洲精品久久视频| 亚洲乱码国产乱码精品精天堂 | 国产精品免费小视频| 亚洲精品一区二区三区婷婷月 | 免费在线欧美黄色| 国产精品播放| 亚洲免费电影在线观看| 亚洲国产免费看| 欧美一区日韩一区| 久久久久免费视频| 国产中文一区二区| 久久精品免费看| 久久综合九九| 在线精品在线| 欧美刺激午夜性久久久久久久| 蜜桃精品久久久久久久免费影院| 好看不卡的中文字幕| 久久成人精品电影| 牛牛精品成人免费视频| 亚洲国产高清在线| 欧美高清不卡在线| 99精品免费| 久久高清国产| 在线成人h网| 欧美精品一卡二卡| 亚洲影视中文字幕| 久久久久久穴| 亚洲精品三级| 国产精品美女视频网站| 久久福利精品| 亚洲精品乱码久久久久久日本蜜臀| 正在播放亚洲一区| 国产日韩成人精品| 免费高清在线一区| 一本色道久久综合狠狠躁篇怎么玩 | 欧美一区二区三区在线免费观看| 国产一区二区三区观看| 另类春色校园亚洲| 一本大道久久a久久精二百| 久久狠狠一本精品综合网| 亚洲第一级黄色片| 欧美日韩精品一本二本三本| 欧美亚洲视频一区二区| 亚洲福利电影| 午夜伦欧美伦电影理论片| 精品成人在线观看| 欧美午夜精品电影| 久久亚洲电影| 一区二区高清视频| 欧美chengren| 欧美一区深夜视频| 亚洲美女在线看| 国内精品免费在线观看| 欧美日韩一区二区国产| 久久免费视频在线| 亚洲欧美亚洲| 亚洲精品一区二区三区av| 久久视频在线看| 午夜精品久久久久| 亚洲免费福利视频| 在线观看国产精品网站| 国产农村妇女毛片精品久久麻豆 | 性欧美办公室18xxxxhd| 亚洲精品在线视频观看| 欧美 日韩 国产在线| 久久精品国产99精品国产亚洲性色| 亚洲精品视频免费| 国产综合香蕉五月婷在线| 欧美日韩极品在线观看一区| 久久久久久久999|