日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Bw树:新硬件平台的B树(内存数据库中的b树索引)

發(fā)布時(shí)間:2024/4/15 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Bw树:新硬件平台的B树(内存数据库中的b树索引) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Bw樹:新硬件平臺(tái)的B

Bw樹:新硬件平臺(tái)的B... 1

1. 概述... 2

1.1 原子記錄存儲(chǔ)(Atomic Record Stores... 2

1.2 新的環(huán)境... 2

1.3 實(shí)現(xiàn)... 3

2 Bwtree的體系結(jié)構(gòu)... 3

2.1 現(xiàn)代的硬件敏感性... 3

2.2 Mapping Table. 4

2.3 增量更新... 4

2.4 bwtree結(jié)構(gòu)修改... 4

2.5 日志結(jié)構(gòu)化存儲(chǔ)(LSS). 4

2.6 管理事務(wù)日志... 4

3 內(nèi)存中Latch Free Page. 4

3.1 靈活的虛擬頁(yè)... 5

3.1.1 更新... 5

3.1.2 葉子級(jí)別的更新... 5

3.1.3 page查詢... 5

3.2 頁(yè)固化... 6

3.3 區(qū)間掃描(Range Scans). 6

3.4 回收... 6

4 bwtree的結(jié)構(gòu)修改... 6

4.1 節(jié)點(diǎn)分裂(Node Split). 6

4.1.1 子節(jié)點(diǎn)分裂(Child Split). 6

4.1.2 更新父節(jié)點(diǎn)... 6

4.1.3 固化... 7

4.2 節(jié)點(diǎn)合并(Node Merge). 7

4.3串行結(jié)構(gòu)修改和更新... 8

5 緩存管理... 8

5.1 提前寫日志協(xié)議LSN.. 8

5.2 Flush頁(yè)到LSS. 9

5.2.1 page 排列... 9

5.2.2 增量flush. 9

5.2.3 Flush活動(dòng)... 9

6 性能評(píng)估... 9

6.1 實(shí)現(xiàn)和安裝... 9

6.2 Bw-tree調(diào)整和屬性... 9

6.3 bw-tree和傳統(tǒng)btree對(duì)比... 11

6.4 BwtreeSkip list比較... 11

6.5 Cache的效率... 12

參考:... 12

?

1. 概述

1.1 原子記錄存儲(chǔ)(Atomic Record Stores

很多現(xiàn)在討論的NO-SQL本質(zhì)上是原子記錄存儲(chǔ),很多都是獨(dú)立的產(chǎn)品,但是也可以使完整事務(wù)系統(tǒng)的一個(gè)組件。

ARS支持每個(gè)獨(dú)立的記錄的讀寫,記錄都是以key來識(shí)別。基于樹的ARS可以提供更快的key range 掃描。ARS不單單是訪問方法,也包含了固態(tài)存儲(chǔ)的管理,并且要求在系統(tǒng)奔潰之后可以恢復(fù)。Bw樹就是利用ARS形成新的b樹。

1.2 新的環(huán)境

處理器已經(jīng)被修改,不再提高單個(gè)內(nèi)核性能。已經(jīng)有了以下一些修改:
1.
針對(duì)多核的設(shè)計(jì):現(xiàn)在大多數(shù)的處理器都是高性能多核處理器。單核速度提升變慢,因此為了更好的內(nèi)核,需要注意以下兩點(diǎn):
??????????????? a.
多核cpu提高了高并發(fā),并發(fā)的增加會(huì)導(dǎo)致latchblock,限制了可擴(kuò)展性。
??????????????? b.
好的多核處理器依賴于高cpu cachehit率。
對(duì)于第一點(diǎn),bwtreelatch-free,這樣thread在碰到?jīng)_突的時(shí)候,不會(huì)被yield或者重定向。對(duì)于第二點(diǎn),bwtree使用增量更新,避免page中的更新,保護(hù)之前cache line的地址。
2.
針對(duì)現(xiàn)代存儲(chǔ)的設(shè)計(jì):磁盤的延遲是主要的問題,flash存儲(chǔ)有很快的隨機(jī)和順序讀取性能,但是因?yàn)樵趯懭胫靶枰炔脸?#xff0c;所以隨機(jī)寫會(huì)比順序?qū)懰俣纫?/span>Bwtree會(huì)生產(chǎn)日志結(jié)構(gòu),這種方法可以避免FTL保證寫入性能盡量的高。

1.3 實(shí)現(xiàn)

1.Bwtree通過mapping table來組織,page的大小和位置被虛擬化。實(shí)際上是對(duì)latch-free和日志結(jié)構(gòu)的虛擬化。
2.
通過在原來的page前加上一個(gè)增量記錄來更新bwtree
3.
對(duì)pagesplittingmerge做了設(shè)計(jì)。SMOs由多個(gè)原子操作實(shí)現(xiàn),若thread發(fā)現(xiàn)有在處理的SMO操作,并不會(huì)堵塞而是來完成SMO操作。
4.
日志結(jié)構(gòu)存儲(chǔ)(LSS),是名義上的page存儲(chǔ),實(shí)際上是通過post增量的修改來提高存儲(chǔ)的效率。
5.
根據(jù)LSSbwtree來實(shí)現(xiàn)ARS
會(huì)做這些實(shí)現(xiàn)是因?yàn)?#xff0c;認(rèn)為latch free技術(shù)和狀態(tài)修改避免了update-in-place可以再當(dāng)前處理器上得到性能提升。

2 Bwtree的體系結(jié)構(gòu)

Bw-tree是典型的b+樹,提供對(duì)數(shù)級(jí)的訪問,如圖:

Bw-tree
層在最上面,和Cache層交互,cache管理建立在存儲(chǔ)層之上,實(shí)現(xiàn)了LSS。現(xiàn)在LSS是使用flash存儲(chǔ),但也可以支持磁盤。

2.1 現(xiàn)代的硬件敏感性

bwtree中,threads基本不會(huì)block,消除latch是設(shè)計(jì)的目的之一。我們使用原子比較切換指令(CAS)來代替latchBwtree只會(huì)在從固態(tài)存儲(chǔ)中獲取page是才會(huì)block(也就是LSS)。持續(xù)的threads運(yùn)行保障了內(nèi)核指令cache,避免線程的空閑時(shí)間和上下文切換的開銷。甚至使用增量來更新,而不是update-in-place,從來避免cpu cachemiss,提高cpu cachehit率。
數(shù)據(jù)管理系統(tǒng)的瓶頸往往是在IO上,所以我們選用了flash存儲(chǔ),使用SSD掛載,但是還是會(huì)限制性能。LSS存儲(chǔ)啟用了大的寫入buffer來消除寫入瓶頸,flash存儲(chǔ)的高隨機(jī)讀取能力和大緩存組合何以最小化讀取的block。大的多頁(yè)buffer允許我們寫入改變page的大小,不需要填充到一個(gè)統(tǒng)一的偏移大小。

2.2 Mapping Table

Mapping TableCache層維護(hù),mapping table包含了物理頁(yè)到邏輯頁(yè)的映射,每個(gè)邏輯頁(yè)都有一個(gè)PID來識(shí)別。PID可以通過mapping table翻譯成內(nèi)存的物理地址或者flash的偏移地址。Bwtree就是通過PID來構(gòu)建一個(gè)b+樹。
mapping table
隔離了物理地址和bwtree節(jié)點(diǎn),這樣每次修改page或者寫入到固態(tài)存儲(chǔ)不需要把位子的修改傳播到樹的根部,即更新節(jié)點(diǎn)內(nèi)部的連接。這樣的重定向可以支持在內(nèi)存中的增量修改可以支持在固態(tài)存儲(chǔ)的LSS
因?yàn)?/span>bwtree是邏輯的不是固定的物理地址,就可以根據(jù)自己需要制定nodepage

2.3 增量更新

Page的狀態(tài)改變是通過在原來的page前加一個(gè)增量記錄來實(shí)現(xiàn)的。使用CAS指令把增量記錄的物理內(nèi)存地址放到mapping tablepage物理地址欄中。如果成功增量記錄地址會(huì)變成的page 的新物理地址。這個(gè)策略被使用在數(shù)據(jù)修改,也被使用在樹的結(jié)構(gòu)修改。
間歇的來固化page(創(chuàng)建一個(gè)新的page把所有的增量修改合并),減少鏈的長(zhǎng)度,提高查詢的性能。固化的方式也是通過CAS指令實(shí)現(xiàn),之前的page也會(huì)被回收。
在增量更新的同時(shí),可以支持同時(shí)在bwtree中做latch-free的訪問并且能夠防止update-in-place保護(hù)cpu cacheMapping tablebwtree重要的特性,可以隔離直接對(duì)node更新。

2.4 bwtree結(jié)構(gòu)修改

Latch并不會(huì)對(duì)做結(jié)構(gòu)修改的page進(jìn)行保護(hù),如page split
為了解決這個(gè)問題,就把SMO放在一個(gè)順序的原子化操作中,每個(gè)操作都是通過CAS進(jìn)行。為了保證沒有線程等待SMO。如果一個(gè)線程看到一個(gè)未完成的SMO,會(huì)在執(zhí)行自己的線程前先去完成它。

2.5 日志結(jié)構(gòu)化存儲(chǔ)(LSS)

Page批量的順序?qū)懭?#xff0c;大大減少了IO次數(shù)。因?yàn)榛厥諜C(jī)制,日志結(jié)構(gòu)通常會(huì)有額外的寫入來重定位page,用來回收日志的存儲(chǔ)空間。
當(dāng)刷新page的時(shí)候,只需要刷新增量部分,增量的部分表示從上次刷新到當(dāng)前的增量修改。通過增加flush bufferpage數(shù)量來減少IO的消耗。但是這樣會(huì)有讀懲罰,因?yàn)?/span>page中的數(shù)據(jù)不是連續(xù)被存放的。
LSS
會(huì)清理之前的部分flash,這部分flash表示之前的數(shù)據(jù)。通過清理,LSSpage和它的增量連續(xù)的存放,可以提高訪問性能。

2.6 管理事務(wù)日志

和傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)一樣,ARS也要在系統(tǒng)crash時(shí)保持?jǐn)?shù)據(jù)一致性。通過log sequence number(LSN)來表示每個(gè)更新操作。
和傳統(tǒng)系統(tǒng)一樣,page的刷新的懶惰的,并且依賴于 write-ahead log協(xié)議(WAL)。不同的是在WAL之前不會(huì)堵塞pageflush。因?yàn)楝F(xiàn)在的update生成的基于之前page的增量。

3 內(nèi)存中Latch Free Page

這里主要介紹內(nèi)存中的bwtree page,主要討論:
1.
基本的page結(jié)構(gòu)和如何以latch free 方式更新page
2.page
固化是的查詢更加高效。
3.
使用epoch的內(nèi)存回收機(jī)制。

3.1 靈活的虛擬頁(yè)

Bwtree存儲(chǔ)的信息和b樹類似,索引節(jié)點(diǎn)包含了以key排序的keypointer數(shù)據(jù)對(duì)。數(shù)據(jù)節(jié)點(diǎn)包含keyrecord對(duì)。另外還保存了page中保存的最小的key和最大的key,和一個(gè)可以指向右邊兄弟節(jié)點(diǎn)的指針。
bwtree
page是邏輯的,不是固定物理地址,大小也不是固定的,有了兩個(gè)重要的特性讓bwtree比較特殊:
1.
使用PID來識(shí)別一個(gè)page,使用pid轉(zhuǎn)化為物理地址來訪問page
2.page
的大小是靈活的,沒有限制page的大小。Page的增長(zhǎng)通過增量記錄來實(shí)現(xiàn)。

3.1.1 更新

更新不會(huì)是in-place更新,而是通過創(chuàng)建一個(gè)增量記錄來描述更新,并放置在當(dāng)前page之前:
1.
創(chuàng)建一個(gè)增量記錄,指向當(dāng)前page
2.
獲取pagemapping table上的項(xiàng)。
3.
增量記錄的物理地址作為page新物理地址,使用CAS指令來實(shí)現(xiàn)install

如圖,多更新幾次之后會(huì)形成增量記錄鏈。

3.1.2 葉子級(jí)別的更新

在葉子級(jí)別,增量分為3種:isnertupdatedelete。所有的增量都包含LSN。使用LSN來做還原機(jī)制涉及到日志的管理方式必須是WALInsertupdate增量包含了新的記錄,但是delete只要含了要?jiǎng)h除的key

3.1.3 page查詢

葉子級(jí)別的page查詢涉及到增量鏈的遍歷。查詢會(huì)在第一個(gè)查詢到的地方停止,若key出現(xiàn)在updateinsert就返回,如果是delete那么就查詢失敗。如果增量鏈不包含key,查詢執(zhí)行在base page 上的binary查詢。

3.2 頁(yè)固化

隨著增量鏈變成,查詢性能會(huì)降低,為了避免這種情況,會(huì)間歇的執(zhí)行頁(yè)固化。會(huì)根據(jù)增量記錄和base page重組生成新的page。頁(yè)固化會(huì)在增量鏈長(zhǎng)度超過閥值是觸發(fā)。
當(dāng)固化是線程會(huì)做以下操作:
1.
創(chuàng)建一個(gè)新的page,然后把最新的記錄版本寫入到page
2.
使用CAS指令install新的page。若成功請(qǐng)求回收老的page,若失敗釋放新的page。失敗并不會(huì)重試,后面的線程會(huì)繼續(xù)執(zhí)行直到完成。

3.3 區(qū)間掃描(Range Scans)

區(qū)間掃描是對(duì)一個(gè)指定key區(qū)間進(jìn)行掃描。掃描可以指定順序還是倒序來獲取記錄。
掃描維護(hù)了一個(gè)游標(biāo)標(biāo)記掃描的進(jìn)度。對(duì)于新的掃描記錄的是lowkey。當(dāng)掃描碰到第一個(gè)在區(qū)間內(nèi)的記錄會(huì)構(gòu)建一個(gè)向量,并放入向量?jī)?nèi)。向量用來保存掃描的結(jié)果。獲取下一行有原子性,但是整個(gè)掃描沒有。
事務(wù)鎖會(huì)阻止能夠看到的記錄,但是我們并不知道沒有傳輸?shù)挠涗洝K栽趥鬏斨拔覀儠?huì)檢查是否有修改。如果有修改,我們會(huì)重新構(gòu)建一個(gè)記錄向量。

3.4 回收

Latch-free環(huán)境不允許排它的訪問一個(gè)共享數(shù)據(jù)結(jié)構(gòu),也就是說即使page在被修改,也可以被訪問。我們并不想釋放一個(gè)任然被訪問的內(nèi)存。比如在固化的時(shí)候,線程交換老的page和新的page狀態(tài),并回收新狀態(tài),但是不能再有線程訪問老的page的時(shí)候釋放。
epoch
機(jī)制就是為了保護(hù)之前有訪問的又要釋放的對(duì)象。

4 bwtree的結(jié)構(gòu)修改

4.1 節(jié)點(diǎn)分裂(Node Split)

分裂是由一個(gè)后臺(tái)線程在page的大小超過系統(tǒng)設(shè)置的閥值的時(shí)候就進(jìn)行分裂。整個(gè)過程分為2個(gè)階段:
1.
現(xiàn)在葉子上做split.
2.
然后更新父的節(jié)點(diǎn).
如果有必要可以一直向上遞歸。因?yàn)橛辛?/span>blink指向兄弟節(jié)點(diǎn),就可以把split分為2個(gè)獨(dú)立的操作。

4.1.1 子節(jié)點(diǎn)分裂(Child Split)

為了分裂節(jié)點(diǎn)P,大概分為2步:
1.btree
層先分配一個(gè)節(jié)點(diǎn)Q,然后找到合適的key的位置Kp,把大于Kpkey復(fù)制到Q,然后Qside link指向R
2.
P之前加入一個(gè)Split delta記錄,記錄包含了2個(gè)信息,a.Pkey大于Kp的都不可用。Side link指向Q。這個(gè)時(shí)候索引還是可用的,盡管父節(jié)點(diǎn)O中沒有指向Q。所有包含在Qkey都會(huì)被指引到P上。到了Split Delta發(fā)現(xiàn)key大于Kp那么就會(huì)從 side link被指引到Q上。

4.1.2 更新父節(jié)點(diǎn)

為了能夠直接從父節(jié)點(diǎn)O指向到Q,需要在O上加一個(gè)delta record,這個(gè)delta record包含3個(gè)信息:
1.Kp,P
Q的分隔key
2.
一個(gè)指向Q的指針
3.Kq,Q
的分隔key,原來是P的分隔key
delta record出現(xiàn)邊界key KpKq是一種優(yōu)化可以提高查詢速度,因?yàn)椴樵儽仨毐闅vindex節(jié)點(diǎn)上的delta chain,若發(fā)現(xiàn)要查詢的keyKpKq之間就可以馬上指向Q沒必要在去遍歷整個(gè)index節(jié)點(diǎn)了。

4.1.3 固化

相對(duì)于增加delta來說,使用新的base pagesplit的時(shí)候延遲會(huì)加大。減少延遲也減少了split的錯(cuò)誤。

4.2 節(jié)點(diǎn)合并(Node Merge)

和分裂類似,節(jié)點(diǎn)合并是當(dāng)node低于一個(gè)值的時(shí)候就會(huì)發(fā)生。

1.刪除節(jié)點(diǎn),如要合并R,先在R上標(biāo)記刪除,添加一個(gè)delta record,表示R已經(jīng)被刪除。如果一個(gè)線程要讀取R中的數(shù)據(jù)碰到Remove Node Delta Record,就會(huì)應(yīng)用在左邊的兄弟上。
2.
合并孩子節(jié)點(diǎn),在L上添加一個(gè)node merge delta物理的指向R(使用內(nèi)存地址),這樣就表示R中的數(shù)據(jù)是在節(jié)點(diǎn)L中。R的存儲(chǔ)狀態(tài)被傳換成了L,只有當(dāng)L固化的時(shí)候page R才會(huì)被回收。當(dāng)對(duì)L查詢時(shí),變成對(duì)樹的查詢,可以再L中訪問L中和R中的key。為了讓這個(gè)可用正常,merge delta上會(huì)有key的分隔,用于訪問正確的節(jié)點(diǎn)。
3.
更新父節(jié)點(diǎn),通過使用delete delta刪除父節(jié)點(diǎn)上關(guān)于R的索引信息和LKey信息。
一旦在父節(jié)點(diǎn)加上了delta,所有到R的路徑就全部被堵塞了。就可以啟動(dòng)機(jī)制來回收R了,因?yàn)?/span>epoch的保護(hù)機(jī)制,所有直到所有的線程訪問完之后才會(huì)被回收。

4.3串行結(jié)構(gòu)修改和更新

為了正確的序列化SMOs和數(shù)據(jù)修改,SMOsSMOs,我們需要構(gòu)建一個(gè)在bwtree上的序列化調(diào)度。我們想要把SMO當(dāng)成一個(gè)原子化操作,并且沒有Latch。為了滿足這個(gè)需求,所以線程必須在更新數(shù)據(jù),或者執(zhí)行自己的SMO之前完成之前的SMO操作。

5 緩存管理

Cache層是負(fù)責(zé)對(duì)讀取,刷新和內(nèi)存與flash之間page交換。維護(hù)mapping table提供抽象的邏輯頁(yè)給bwtree。在mapping table上要不就是內(nèi)存地址,要不就是flash的偏移。如是flash偏移那么就從LSS上讀入到內(nèi)存中。所有涉及到內(nèi)存的操作都是通過CAS來完成。
有很多原因會(huì)導(dǎo)致內(nèi)存被刷入到flash中。如,因?yàn)?/span>bwtree是事務(wù)系統(tǒng)的一部分所以flush update可以在事務(wù)日志上checkpointPage flush也處理page 換出吧flash偏移installmapping table上,并且回收內(nèi)存減少內(nèi)存的使用。
為了跟蹤固態(tài)存儲(chǔ)中page 的版本和位置,我們使用flush delta record,還記錄了那些修改被flush了,之后的flush只對(duì)應(yīng)增量即可,若flush page成功,flush delta就會(huì)包含新的flash offsetpage的狀態(tài)會(huì)被設(shè)置為flushed

5.1 提前寫日志協(xié)議和LSN

BwtreeARS(原子記錄存儲(chǔ)),可以被包含在事務(wù)系統(tǒng)里,若被包含就在事務(wù)方面被強(qiáng)化。LSN:記錄的插入和修改都會(huì)使用LSN來標(biāo)記,而被flush的最大LSN被記錄在flush delta上。事務(wù)日志協(xié)作:不管什么時(shí)候TC(事務(wù)控制器)flush到固態(tài)存儲(chǔ)上,左右一個(gè)LSN被稱為ESL。所有小于ESLLSN都會(huì)被刷新到固態(tài)存儲(chǔ)中。然后TC定期的把ESL發(fā)送到DC,根據(jù)提前寫日志協(xié)議,DC不能刷新大于ESL的數(shù)據(jù)。
DC
中的page flush是由TC根據(jù)redo-scan-start-point(RSSP)來要求的,這樣RSSP之前的日志都可以被截?cái)唷?/span>TC會(huì)等待來自DC的通知,表示LSN<RSSP的數(shù)據(jù)都已經(jīng)被固化了,因?yàn)檫@樣數(shù)據(jù)被固化,在redo 的時(shí)候就沒必要再去redo這些日志了。

5.2 Flush頁(yè)到LSS

LSS提供了一個(gè)很到的buffer,里面存放了bwtree的結(jié)構(gòu)修改和數(shù)據(jù)修改。

5.2.1 page 排列

Cache managerpage中的byte以線性方式寫入flush bufferPage的狀態(tài)在試圖刷新的時(shí)候被獲取。這個(gè)很重要,因?yàn)橹蟮男薷目赡軙?huì)和split或者固化沖突。

5.2.2 增量flush

當(dāng)flushpage,緩沖管理器只排列那些ESL>LSN的增量的記錄。增量flush表示刷新的消耗要比刷新整個(gè)page 小。日志結(jié)構(gòu)存儲(chǔ)有2個(gè)好處:
1.flush buffer
可以包含更多的update
2.
回收不需要很頻繁因?yàn)橄牟皇呛艽蟆?/span>

5.2.3 Flush活動(dòng)

Flush buffer聚合了LSS到達(dá)一個(gè)閥值(1MB)然后寫入,這樣減少了IO的開銷。并且使用雙buffer,這樣當(dāng)前的buffer還在處理時(shí),可以準(zhǔn)備下一個(gè)進(jìn)程了。
flush buffer IO
完成之后,相關(guān)page 的狀態(tài)就會(huì)被修改。Mapping table獲取flush的結(jié)果然后使用flush delta來描述。
緩沖管理監(jiān)控bwtree的內(nèi)存使用,超過配置的閥值,會(huì)視圖把page切換到lss上,一旦page被清空,就會(huì)從緩存中被犧牲。被犧牲的page 通過epoch被回收。

6 性能評(píng)估

主要介紹 bwtree和其他存儲(chǔ)結(jié)構(gòu)的性能對(duì)比

6.1 實(shí)現(xiàn)和安裝

BWtreebwtree以獨(dú)立的記錄原子存儲(chǔ)實(shí)現(xiàn),借用了win32原生的CAS interlockedCompareExchange64
BerkeleyDB
BerkeleyDBk-v數(shù)據(jù)庫(kù),我們使用c語(yǔ)言實(shí)現(xiàn)了btree模式。
Skip list
:跳表可以實(shí)現(xiàn)latch-free,可以實(shí)現(xiàn)快速插入以及對(duì)數(shù)級(jí)的查詢。
測(cè)試環(huán)境:Intel Xeon W3550,24GB內(nèi)存
測(cè)試數(shù)據(jù)庫(kù):XboxLiveStorage deduplication traceSynthetic
默認(rèn):主要性能的單位是million/sec。為每個(gè)工作負(fù)荷提供8個(gè)工作線程和邏輯內(nèi)核數(shù)一樣。

6.2 Bw-tree調(diào)整和屬性

這節(jié)主要介紹2方面對(duì)bwtree的性能影響:
1.delta chain
的長(zhǎng)度對(duì)性能影響

如圖,bwtree運(yùn)行在SyntheticXbox不同的delta chain對(duì)性能的影響。即consolidation閥值。對(duì)于小的閥值,consolidation會(huì)頻繁出現(xiàn),影響性能。對(duì)于xbox,查詢性能在閥值大于4之后開始惡化。雖然順序掃描,分支預(yù)測(cè)性能良好,因?yàn)?/span>xbox100byte,使得L1的填充率下降。synthetic只有8byte大小,因此delta chain可以更長(zhǎng),性能也不受影響。
2.latch free
使用CASCAS的錯(cuò)誤率bwtree原生latch-free,在某些情況下會(huì)出現(xiàn)更新page狀態(tài)的錯(cuò)誤。

更新錯(cuò)誤率很低大概占用0.02%的工作負(fù)荷。splitconsolidationupdate錯(cuò)誤率大得多,這個(gè)也是在預(yù)料中的,因?yàn)樗麄儠?huì)和update是競(jìng)爭(zhēng)關(guān)系。synthetic是一個(gè)極端場(chǎng)景,因?yàn)?/span>update性能很好,導(dǎo)致splitconsolidation的錯(cuò)誤率很高。

6.3 bw-tree和傳統(tǒng)btree對(duì)比

主要導(dǎo)致性呢過問題的有2個(gè)原因:
1.latch-free
bwtree沒有latch,但是berkelydb確有性能問題。
2.cpu
cache效率,bwtree使用delta record來進(jìn)行更新,base page不變,cpu cache很少出現(xiàn)不可用的情況。但是BerkeleyDBin-place update,會(huì)導(dǎo)致更多的cpu cache不可用的情況。

6.4 BwtreeSkip list比較

Skip list可以提供有序的對(duì)數(shù)查詢,并且很容易實(shí)現(xiàn)latch free

如圖比較了在bwtreeskiplist下的性能,bwtreeskiplist性能要好。是因?yàn)?/span>bwtreecpu cache的效率比skiplist 要搞。

6.5 Cache的效率

為了更深入的測(cè)量和比較bwtreeskiplist,我們使用intel VTune來獲取cpu cachehit

通過如圖,會(huì)發(fā)現(xiàn)bw-treecache hit率比skiplist要高,這個(gè)也就是為什么bwtree性能比skiplist好的原因。

參考:

The Bw-Tree: A B-tree for New Hardware

?

總結(jié)

以上是生活随笔為你收集整理的Bw树:新硬件平台的B树(内存数据库中的b树索引)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。