1. LevelDB源碼剖析之關(guān)于LevelDB

LevelDB是google開(kāi)發(fā)的盯拱、高效的鍵值存儲(chǔ)程序庫(kù)放典。之所以稱之為程序庫(kù)而非代碼庫(kù)是因?yàn)樗鼉H僅是一個(gè)library文件豆瘫,無(wú)法單獨(dú)運(yùn)行,宿主為leveldb使用者油宜。

1.1 特性

  • key扛或、value可以是任意的byte數(shù)組
  • 數(shù)據(jù)按key排序后存儲(chǔ)
  • 使用者可提供自定義比較器以決定key的排序方式
  • 基本操作包括Put(key,value), Get(key), Delete(key)
  • 支持原子的批量修改操作
  • 支持創(chuàng)建快照(用后需及時(shí)釋放)瘫析,獲取當(dāng)前的一致性數(shù)據(jù)
  • 數(shù)據(jù)支持向前江醇、向后的迭代器
  • 數(shù)據(jù)自動(dòng)壓縮,采用 Snappy compression library.
  • 外部依賴(文件系統(tǒng)操作等)通過(guò)接口完成幌墓,用戶可定制實(shí)現(xiàn)但壮。

1.2 限制

  • LevelDB不是SQL數(shù)據(jù)庫(kù)冀泻,不支持關(guān)系數(shù)據(jù)模型,不支持SQL查詢蜡饵,也不支持創(chuàng)建索引弹渔。
  • 同時(shí)只能有一個(gè)進(jìn)程(允許多線程)訪問(wèn)數(shù)據(jù)庫(kù)。
  • 不支持client-server模式溯祸,使用者可以基于該library構(gòu)建自己的服務(wù)器肢专。

1.3 性能

下面的性能測(cè)試報(bào)告基于db_bench程序,結(jié)果存在一定干擾焦辅,但做為性能評(píng)估是足夠的博杖。

1.3.1 驗(yàn)證場(chǎng)景

我們使用一個(gè)數(shù)百萬(wàn)記錄的數(shù)據(jù)庫(kù),每條記錄的key大小為16字節(jié)氨鹏,value大小為100字節(jié)欧募⊙棺矗基準(zhǔn)測(cè)試的Value大小壓縮為原始大小的一半仆抵。

LevelDB: version 1.1
Date: Sun May 1 12:11:26 2011
CPU: 4 x Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
CPUCache: 4096 KB
Keys: 16 bytes each
Values: 100 bytes each (50 bytes after compression)
Entries: 1000000
Raw Size: 110.6 MB (estimated)
File Size: 62.9 MB (estimated)

1.3.2 寫(xiě)性能

“填充”基準(zhǔn)測(cè)試以順序或隨機(jī)順序創(chuàng)建一個(gè)全新的數(shù)據(jù)庫(kù)。 每次操作后种冬,“fillsync”基準(zhǔn)將數(shù)據(jù)從操作系統(tǒng)刷新到磁盤(pán)(順序操作); 其他寫(xiě)入操作則利用操作系統(tǒng)緩沖區(qū)高速緩存中一段時(shí)間镣丑。 “覆蓋”基準(zhǔn)做隨機(jī)寫(xiě)入,更新數(shù)據(jù)庫(kù)中的現(xiàn)有key值記錄娱两。

fillseq : 1.765 micros/op; 62.7 MB/s; 56.6W+ OP/S
fillsync : 268.409 micros/op; 0.4 MB/s (10000 ops); 0.37W OP/S
fillrandom : 2.460 micros/op; 45.0 MB/s; 40W+ OP/S
overwrite : 2.380 micros/op; 46.5 MB/s; 42W+ OP/S

"op"是指一次寫(xiě)入一個(gè)key/value對(duì)莺匠。隨機(jī)寫(xiě)性能大約在40W op/s,“fillsync”操作時(shí)間(0.3 millisecond)甚至少于磁盤(pán)seek時(shí)間(典型時(shí)間為10millisecond)十兢。我們懷疑這可能是因?yàn)橛脖P(pán)自身存在緩存(memory)趣竣,并在數(shù)據(jù)真正落盤(pán)前進(jìn)行響應(yīng)。這樣做是否安全取決于出現(xiàn)電力故障時(shí)旱物,是否來(lái)得及將緩存中的數(shù)據(jù)寫(xiě)入磁盤(pán)遥缕。

1.3.3 讀性能

我們列出了正向和反向方向上順序讀取的性能,以及隨機(jī)查找的性能宵呛。 請(qǐng)注意单匣,基準(zhǔn)數(shù)據(jù)庫(kù)創(chuàng)建的數(shù)據(jù)庫(kù)相當(dāng)小, 報(bào)告中的leveldb性能數(shù)據(jù)基本是基于內(nèi)存操作的宝穗。 讀取操作系統(tǒng)高速緩沖區(qū)中不存在的數(shù)據(jù)時(shí)户秤,將額外執(zhí)行1-2次磁盤(pán)查找動(dòng)作。 寫(xiě)性能基本不受數(shù)據(jù)是否在內(nèi)存中的影響逮矛。

readrandom : 16.677 micros/op; (approximately 60,000 reads per second)
readseq : 0.476 micros/op; 232.3 MB/s; 210W+ op/s
readreverse : 0.724 micros/op; 152.9 MB/s; 138W+ op/s

LevelDB在后臺(tái)壓縮其底層存儲(chǔ)數(shù)據(jù)鸡号,以提高讀取性能。 上面列出的結(jié)果是在大量隨機(jī)寫(xiě)作之后立即進(jìn)行的须鼎。 壓縮后的結(jié)果(通常自動(dòng)觸發(fā))更好鲸伴。

readrandom : 11.602 micros/op; (approximately 85,000 reads per second)
readseq : 0.423 micros/op; 261.8 MB/s; 236W+ op/s
readreverse : 0.663 micros/op; 166.9 MB/s; 150W+ op/s

其中堪藐,某些讀操作由于重復(fù)讀取磁盤(pán)并解壓縮以致耗時(shí)較長(zhǎng)。我們?yōu)閘eveldb提供足夠的緩存挑围,以便可以將未壓縮的塊保存在內(nèi)存中礁竞,則讀取性能再次提高:

readrandom : 9.775 micros/op; (approximately 100,000 reads per second before compaction)
readrandom : 5.215 micros/op; (approximately 190,000 reads per second after compaction)

對(duì)于典型的數(shù)據(jù)庫(kù)操作,基本為隨機(jī)讀杉辙、寫(xiě)模捂,整理下上述關(guān)鍵性能數(shù)據(jù):

fillrandom : 2.460 micros/op; 45.0 MB/s; 40W+ OP/S
readrandom : 9.775 micros/op; (approximately 100,000 reads per second before compaction)
readrandom : 5.215 micros/op; (approximately 190,000 reads per second after compaction)

隨機(jī)寫(xiě)的性能大致為40W+ op/s,讀在數(shù)據(jù)壓縮完成后性能最佳為19W+ op/s蜘矢,運(yùn)行時(shí)的實(shí)時(shí)讀性能大約為10W+ op/s狂男。

1.4 總結(jié)

leveldb是一個(gè)鍵值數(shù)據(jù)庫(kù),app嵌入該程序庫(kù)后可完成基于key的讀品腹、寫(xiě)操作岖食,其寫(xiě)操作性能極佳,甚至遠(yuǎn)高于讀性能舞吭。

leveldb總代碼9.6k泡垃,其中還包含了大量的測(cè)試程序,做為一個(gè)小巧的羡鸥,功能完備的鍵值數(shù)據(jù)庫(kù)蔑穴,非常具有研究?jī)r(jià)值。

leveldb內(nèi)部并未使用MVCC惧浴,而是使用了一種古老的LSM數(shù)據(jù)結(jié)構(gòu)存和。除此之外,還使用了skiplist簡(jiǎn)化處理邏輯衷旅,創(chuàng)建定制的內(nèi)存池提高程序性能捐腿,精巧的分層布局等等。

本系列文章將剖析leveldb設(shè)計(jì)柿顶、實(shí)現(xiàn)的各個(gè)細(xì)節(jié)茄袖,對(duì)其支持的各種特性、特別是性能優(yōu)化上做詳細(xì)分析九串。

本文基于leveldb 1.2版本分析绞佩。


注:本節(jié)大部分內(nèi)容來(lái)自leveldb git主頁(yè)(https://github.com/google/leveldb)。


轉(zhuǎn)載請(qǐng)注明:[隨安居士]http://www.reibang.com/p/9b5945cb6e70

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猪钮,一起剝皮案震驚了整個(gè)濱河市品山,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烤低,老刑警劉巖肘交,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扑馁,居然都是意外死亡涯呻,警方通過(guò)查閱死者的電腦和手機(jī)凉驻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)复罐,“玉大人涝登,你說(shuō)我怎么就攤上這事⌒ё纾” “怎么了胀滚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乱投。 經(jīng)常有香客問(wèn)我咽笼,道長(zhǎng),這世上最難降的妖魔是什么戚炫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任剑刑,我火速辦了婚禮,結(jié)果婚禮上双肤,老公的妹妹穿的比我還像新娘施掏。我一直安慰自己,他們只是感情好杨伙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布其监。 她就那樣靜靜地躺著萌腿,像睡著了一般限匣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毁菱,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天米死,我揣著相機(jī)與錄音,去河邊找鬼贮庞。 笑死峦筒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窗慎。 我是一名探鬼主播物喷,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遮斥!你這毒婦竟也來(lái)了峦失?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤术吗,失蹤者是張志新(化名)和其女友劉穎尉辑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體较屿,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隧魄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年卓练,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片购啄。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡襟企,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狮含,到底是詐尸還是另有隱情整吆,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布辉川,位于F島的核電站表蝙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏乓旗。R本人自食惡果不足惜府蛇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屿愚。 院中可真熱鬧汇跨,春花似錦、人聲如沸妆距。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娱据。三九已至蚪黑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間中剩,已是汗流浹背忌穿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留结啼,地道東北人掠剑。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像郊愧,于是被迫代替她去往敵國(guó)和親朴译。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容