論文:TreadMarks
本節(jié)我們以 TreadMarks 為模型聊一聊釋放一致性的是使用場景提针。
所謂釋放一致性,是指在對資源操作前曹傀,先進行 acquire 操作即獲取鎖辐脖,其實是對某個標示位的值進行讀取,若該資源正在被其他進程操作皆愉,該標示位為 0嗜价,當資源操作完成時會向所有副本發(fā)出更新通知艇抠,所有副本更新成功后將改標示位改成1,即釋放鎖(release)久锥,而在此之前家淤,后面的進程只能輪詢該標示位以獲取鎖狀態(tài)∩桑可見這種一致性模型每次只將修改的部分通知大家更新一下絮重,分散了一致性的壓力,數(shù)據(jù)競爭較小的地方會有比較理想的性能提升歹苦。
但是青伤,每次通知大家更新的時候是需要等所有人都回復(fù)OK后才能釋放鎖。如果 A 修改后不通知 B 和 C暂氯,BC 在每次 acquire 之前先把自己的數(shù)據(jù)更新一下潮模,這樣可以將 A 修改同步的負載延遲到各個副本上,這種策略叫 Lazy Release Consistency(LRC)痴施。
TreadMarks 為分布式共享式內(nèi)存而設(shè)計擎厢,采用 LRC 策略保證一致性,比 RC 提高了性能辣吃,但需要將資源的操作分成一個個 interval:acquire 和 release 之間动遭,可理解為邏輯上的時鐘,稱為 vector clock神得,它維護了各個進程的資源競爭的因果關(guān)系厘惦,通過合并操作可以得出每個 interval 結(jié)束時的資源狀態(tài),保證數(shù)據(jù)的一致性哩簿。
在分布式共享內(nèi)存中還有一個性能殺手宵蕉,F(xiàn)alse Sharing。由于內(nèi)存的管理單位是頁节榜,進程 A 修改的頁1的部分1羡玛,而進程 B 讀取頁1的部分2,傳統(tǒng)的方式會先把進程B頁1副本更新后再進行讀取宗苍,而進程 A 的修改對進程 B 的讀取沒有影響稼稿,這顯然是可以優(yōu)化的。TreadMarks 的優(yōu)化策略是在每個 interval 中創(chuàng)建 diff讳窟,也就是說让歼,進程 A 寫入頁1部分1之前先創(chuàng)建頁1的復(fù)制 twin,然后再去頁1中修改丽啡,當進程B讀取頁1時谋右,比較要讀的部分在頁1和twin有沒有區(qū)別,若沒有則直接讀本地頁1副本补箍,如有區(qū)別則創(chuàng)建創(chuàng)建 diff倚评。根據(jù) vector clock 在時間上因果關(guān)系推算出當前進程應(yīng)該讀到那個版本的diff浦徊,如此一來,將單一的數(shù)據(jù)頁同步轉(zhuǎn)化成狀態(tài)的疊加天梧,可以有效降低 False Sharing 的性能損耗,當然需要更多的空間存 diff霞丧,用空間換時間呢岗。
沒有十全十美的解決方案,只有適合不同場景的平衡取舍蛹尝,由于分布式內(nèi)存資源競爭概率遠小于非競爭的情況后豫,所以在在競爭同步,創(chuàng)建 diff 的策略上采取 lazy 的方式突那。反過來說挫酿,如果內(nèi)存競爭的情況高于非競爭的情況,這種處理方式反而會使內(nèi)存的使用效率降低愕难,比如單機早龟。