張舒燕 王清帥 張蓉
摘要:現(xiàn)代多核主存數(shù)據(jù)庫在高競爭的負載下仍然不能達到理想的性能,獲得高吞吐量的障礙是試圖訪問相同數(shù)據(jù)的并發(fā)沖突事務(wù),這些事務(wù)爭用相同的資源,在傳統(tǒng)數(shù)據(jù)庫中必須串行執(zhí)行,促銷活動中的電子商務(wù)(電商)負載就是這種高沖突的事務(wù),本研究從兩個方面對電商負載的事務(wù)處理方案進行了優(yōu)化,首先,由于產(chǎn)品數(shù)量有限,許多購買請求不會成功,數(shù)據(jù)庫系統(tǒng)可以通過提前過濾掉無效請求來節(jié)省資源、降低鎖競爭,其次,大量的寫操作針對同一商品,故在寫操作之間實現(xiàn)鎖共享,再次降低鎖競爭,基于此想法本文實現(xiàn)了原型系統(tǒng)Filmer,大量的實驗表明,過濾和合并可以提高處理高競爭電商負載的效。
關(guān)鍵詞:事務(wù)處理:并發(fā)控制:高競爭
中圖分類號:TP392 文獻標志碼:A DOI:10.3969/j,issn,100-5641.202091005
0引言
隨著電子商務(wù)(電商)業(yè)務(wù)的發(fā)展,大量的離線交易被在線交易取代,作為事務(wù)處理的關(guān)鍵支柱,數(shù)據(jù)庫管理系統(tǒng)承受的壓力越來越大,不同于傳統(tǒng)的實體店交易,在線交易打破了空間的限制,數(shù)以百萬甚至千萬計的顧客可以在同一時間發(fā)起購買請求,阿里巴巴在購物節(jié)中每秒要處理的交易高達491 000個,這種業(yè)務(wù)需要數(shù)據(jù)庫有能力處理高并發(fā)的負載。
在促銷活動期間,大量的用戶會在同一時間讀或?qū)懴嗤膸齑媲鍐?,?dǎo)致多個事務(wù)爭相訪問相同的數(shù)據(jù)項,造成高競爭,此時,短時間內(nèi)有大量購買請求同時到達數(shù)據(jù)庫,但由于商品數(shù)量有限,只有小部分有效的請求可以成功下單,高競爭的場景會使系統(tǒng)響應(yīng)時間變長,當(dāng)一個請求沒有獲得響應(yīng)時,用戶很可能會重復(fù)發(fā)送請求,進一步增大了無效的負載量,給數(shù)據(jù)庫管理系統(tǒng)帶來了更大的壓力,即使使用具有多核處理器的主存數(shù)據(jù)庫,在高競爭的情況下表現(xiàn)出的性能也并不理想。
當(dāng)前,數(shù)據(jù)庫系統(tǒng)并發(fā)控制模塊的實現(xiàn)中,樂觀的并發(fā)控制(optimistic Concurrency Control,OCC)在調(diào)度事務(wù)的操作時假設(shè)沒有非可串行化行為發(fā)生,并且只在違例很明顯的時候做恢復(fù),在高競爭的負載下,基于樂觀的并發(fā)控制協(xié)議頻繁回滾事務(wù),所以展現(xiàn)出的性能較差;悲觀的并發(fā)控制需要頻繁地加鎖和釋放鎖,當(dāng)負載的沖突率很高時會發(fā)生嚴重的鎖競爭,即使對并發(fā)控制協(xié)議做了優(yōu)化,也無法消除對同一數(shù)據(jù)的大量寫寫沖突,這極大地減少了事務(wù)之間的并行度并限制了數(shù)據(jù)庫的吞吐量,
為了解決這個問題,本文設(shè)計并實現(xiàn)了一個數(shù)據(jù)庫原型系統(tǒng)Filmer,利用工作線程與數(shù)據(jù)綁定,減少中央鎖表上的競爭;通過加入無效操作過濾器以及合并同質(zhì)操作(定義1)來提高整體的事務(wù)處理并發(fā)性,無效操作過濾能降低系統(tǒng)處理的任務(wù)量,同質(zhì)操作合并能降低由于寫寫沖突造成的鎖競爭,F(xiàn)ilmer的實驗證明在數(shù)據(jù)庫內(nèi)部實現(xiàn)無效流量過濾,以及通過寫操作之間共享資源的策略能有效地提高事務(wù)系統(tǒng)的性能。
定義1(同質(zhì)操作)如果Ⅳ個操作滿足以下三個條件,則稱這Ⅳ個操作為同質(zhì)操作,
(1)這Ⅳ個操作都是由相同SQL模板生成的update操作;
(2)這Ⅳ個操作只對屬性值進行增量的修改;
(3)這Ⅳ個操作訪問相同的元組,
本文的內(nèi)容組織如下:第1章介紹處理高競爭負載的相關(guān)工作;第2章簡要介紹本文提出的原型系統(tǒng)Filmer的總體框架;第3章詳細描述過濾器的工作原理;第4章闡述操作合并模塊的設(shè)計與實現(xiàn);第5章通過實驗展示了過濾、合并的效果;第6章總結(jié)全文。
1相關(guān)工作
電商應(yīng)用對一致性的要求通常不高,所以解決讀操作爭用資源的方法有很多,一個具有代表性的方法是采用讀寫分離架構(gòu),即讀和寫由不同的服務(wù)器負責(zé),主服務(wù)器處理寫請求和極小部分的讀請求,從服務(wù)器處理剩余的讀請求,如果想進一步減輕數(shù)據(jù)庫管理系統(tǒng)處理讀操作的壓力,還可以在數(shù)據(jù)庫的上層構(gòu)建緩存,使得只有緩存缺失/過期產(chǎn)生的讀請求才會被發(fā)送到數(shù)據(jù)庫。
寫操作對資源的爭用較難解決,Orthrus提出了兩個原則,一是分配專門的線程負責(zé)并發(fā)控制,每個并發(fā)控制線程負責(zé)數(shù)據(jù)庫對象的一個不相交的子集,以避免數(shù)據(jù)移動和同步開銷,二是以一致的順序為事務(wù)授予鎖,以避免死鎖,競爭感知的鎖調(diào)度算法罔從另一個角度改善了基于鎖的協(xié)議,通過捕獲并發(fā)事務(wù)之間的競爭和依賴,該算法優(yōu)先將鎖授予那些阻塞了較多其他事務(wù)的事務(wù),本文的工作并不關(guān)注鎖調(diào)度,可與此算法互為補充,MOCC(Mostly-Optimistic Concurrency Control)在OCC中引進了鎖機制,當(dāng)一個事務(wù)訪問熱點數(shù)據(jù)時,它需要先獲取數(shù)據(jù)上的鎖,此方法減少了高沖突事務(wù)的回滾率,所有這些工作都沒有針對高競爭電商負載中存在的大量無效操作和相似操作進行優(yōu)化,
負載資源共享也是一個被研究了很久的話題,當(dāng)一個查詢內(nèi)部有多個相似的子查詢時,MQO(Multiple-Query Optimization)支持單個查詢內(nèi)的資源共享,無論子查詢在一個OLAP(on-LineAnallytical Processing)類型的查詢中出現(xiàn)了多少次,都只被執(zhí)行一次,MQJoin和CJOIN使用流水線技術(shù)在join操作之間共享資源,但是join操作并不是OLTP(on-Line Transaction Processing)負載中的常見操作,SharedDB和BatchDB則考慮了OLTP負載,SharedDB將查詢編譯成一個較大的查詢計劃進行批量處理,不同的查詢共享相同的操作符,BatchDB將OLTP副本和OLAP副本分離,資源共享只在OLAP型查詢中發(fā)生,以上研究的焦點都是處理OLAP負載,OLTPShare是最接近本工作的,OLTP負載中的操作被合并執(zhí)行以適應(yīng)高負載量的場景,但是,OLTPShare只合并單點的只讀操作,而本工作關(guān)注的是寫操作,另外,OLTPShare要求被合并的語句是其所在事務(wù)的唯一語句,F(xiàn)ilmer并沒有這樣的限制。
2Filmer系統(tǒng)架構(gòu)
在電商應(yīng)用中,一旦促銷活動開始,減庫存操作會使得短時間內(nèi)有大量用戶訪問極少量數(shù)據(jù),是數(shù)據(jù)庫吞吐受限的主要原因,以面向峰值負載的測試基準PeakBench中的造成高沖突的負載訂單提交事務(wù)為例。
其中,opl是一個讀操作,一般不會阻塞數(shù)據(jù)庫系統(tǒng)的執(zhí)行,op2是一個典型的減庫存操作,它將秒殺商品表SeckillPlan中某個商品的剩余數(shù)量減少一個,當(dāng)負載的競爭程度很高時,參數(shù)p1的分布符合Zipf分布,即集中在少數(shù)幾個值上,大量并發(fā)的訂單提交事務(wù)要想修改相同的商品項,沖突的事務(wù)必須串行執(zhí)行以保證執(zhí)行的正確性,如果可以將這些并發(fā)的更新操作合并執(zhí)行,則會降低鎖沖突,提高事務(wù)處理的效率,例如,可以將兩個不同事務(wù)的op2合并為:UPDATE SeckillPlan SET sl skpcount=sl skpcount-2 WHERE sl skpkey=p1 AND sl skpcount>=2.這樣就可以一起執(zhí)行,共享一把寫鎖,再者,少量商品面對大量訂單的話,商品的數(shù)量決定了大量op2無法成功,但卻還要串行加鎖執(zhí)行,可以嘗試在數(shù)據(jù)庫入口處構(gòu)建過濾器,盡早把這樣的無效操作過濾掉,減少其在數(shù)據(jù)庫內(nèi)的處理,從而減少事務(wù)在相同數(shù)據(jù)上的競爭。
針對這一問題,本文設(shè)計并實現(xiàn)了Filmer基于內(nèi)存的事務(wù)型數(shù)據(jù)管理原型系統(tǒng),系統(tǒng)架構(gòu)圖見圖1.負載的執(zhí)行分布在四個模塊中,其處理流程如下。
客戶端發(fā)送的SQL操作首先到達查詢分析器,查詢分析器由一個過濾器和一個分發(fā)器組成,過濾器判定當(dāng)前操作是否有效,對所有無效的操作,系統(tǒng)將直接向客戶端返回“fail”;否則,操作由分發(fā)器進行進一步的處理,分發(fā)器負責(zé)兩件事:其一,基于要訪問的數(shù)據(jù)將每個CRUD操作(增刪改查)分發(fā)給執(zhí)行器處理;其二,將事務(wù)操作(事務(wù)開始、事務(wù)提交或事務(wù)中止)傳給事務(wù)管理器,
在執(zhí)行器中,數(shù)據(jù)根據(jù)主鍵劃分為不相交的邏輯分區(qū),由于基于樂觀的并發(fā)控制協(xié)議在高競爭的負載下回滾頻繁,F(xiàn)ilmer實現(xiàn)了2PL悲觀協(xié)議(Two-Phase Locking),每個邏輯分區(qū)都由一個不同的工作線程管理,并且每個工作線程都為其負責(zé)的數(shù)據(jù)維護一個本地鎖表,工作線程每次取出一組同質(zhì)操作,在本地鎖表上鎖定要訪問的數(shù)據(jù),無法獲取鎖的操作將置于等待隊列中,并在釋放鎖后重新執(zhí)行,當(dāng)線程執(zhí)行的操作被掛起時,線程不會阻塞,而是直接執(zhí)行下一個操作,如果操作成功鎖定數(shù)據(jù),則工作進程將首先從存儲中讀取所需的數(shù)據(jù),然后在其事務(wù)上下文中記錄更新的結(jié)果和使用的鎖,
事務(wù)管理器為不同的事務(wù)操作選擇不同的執(zhí)行方法,對于一個事務(wù)開始或結(jié)束操作,它只需要創(chuàng)建或刪除相應(yīng)事務(wù)的上下文,對于事務(wù)提交操作,事務(wù)管理器通知日志管理器寫入日志,日志持久化后,日志管理器向事務(wù)管理器發(fā)送提交消息,然后事務(wù)管理器逐個處理消息,將事務(wù)上下文中的更新寫入存儲,此時,事務(wù)實際上已完成,最后,查詢分析器向客戶端答復(fù)事務(wù)已提交。
Filmer架構(gòu)的三個主要部分(查詢分析器、事務(wù)管理器和執(zhí)行器)中的所有線程都是非阻塞的,減少了由內(nèi)核中上下文切換造成的資源浪費。
3查詢分析器
過濾無效操作可以降低系統(tǒng)負載壓力,減少系統(tǒng)資源消耗,過濾后的負載通過分發(fā)器發(fā)送給執(zhí)行器或事務(wù)管理器。
3.1過濾器
先根據(jù)sQL語句的謂詞獲取要訪問元組的主鍵值,如果定位謂詞(那些用來訪問索引的謂詞)基于主鍵,則直接獲得;如果是基于二級索引的,則系統(tǒng)將通過訪問二級索引獲取對應(yīng)的主鍵值。
預(yù)處理之后,任務(wù)便被轉(zhuǎn)交給了過濾器,過濾器中會維護一張過濾表來記錄失敗過的更新,以便確定一個減庫存操作是否有效,過濾表中表項格式為三元組,即<表名,主鍵,列號>,記錄減庫存失敗的對象,其中表名和主鍵指明該更新試圖修改的元組,列號指明該更新修改的具體列,注意,這個列的值域需要被sQL語句中的謂詞要求屬于一個左閉區(qū)間,如果一個失敗的減庫存操作試圖修改多個列,則將在過濾器表中添加多個過濾項。
過濾器處理操作的方式首先取決于操作的類型,如果是減庫存/上貨操作,則其<表名,主鍵,列號>將被提?。赡艹^一項),用于與過濾表中的項進行比較,如果發(fā)現(xiàn)有交集,則分以下兩種情況,
(1)對于減庫存類型的操作,可以確定其是無效的操作,查詢分析器丟棄該操作并直接返回“fail”給客戶;
(2)對于上貨類型的操作,查詢分析器從過濾表中刪除產(chǎn)生交集的項并將操作分發(fā)給執(zhí)行器,
對于所有其他情況,操作將直接被判定為有效操作,并轉(zhuǎn)交給分發(fā)器。
系統(tǒng)設(shè)計的過濾表是一個并發(fā)數(shù)據(jù)結(jié)構(gòu),會被多個線程并發(fā)訪問,查詢分析器需要檢查更新操作的信息是否在過濾器表中,因此過濾表經(jīng)常被讀取,但僅當(dāng)向過濾表中添加或刪除條目時才會寫過濾表,因此,系統(tǒng)實現(xiàn)的過程中采用copy-on_write技術(shù)優(yōu)化過濾表操作,另外,在競爭激烈的情況下,過濾表通常很小,并且僅保存已售罄的熱門商品,因此復(fù)制的成本不高。
3.2分發(fā)器
如果一個操作有多個目標元組,分發(fā)器將對其進行拆分以確保分發(fā)到工作線程的操作不需要訪問其他數(shù)據(jù)分區(qū),每個目標元組對應(yīng)一個子操作,拆分后,所有操作都是基于主鍵的單點訪問。
分發(fā)器根據(jù)操作試圖訪問的數(shù)據(jù)對應(yīng)到工作線程,在分發(fā)任務(wù)之前執(zhí)行同質(zhì)操作合并,系統(tǒng)為每個數(shù)據(jù)分區(qū)定義并維護一個模式操作映射表(PO-Map),如圖2所示,模式是操作中的關(guān)鍵信息縫合成的字符串,也可以是系統(tǒng)為操作直接分配的唯一字符串,具有相同模式的操作才可能同質(zhì),并被放入操作列表。
有機會合并的操作必須滿足以下兩個條件:
(1)是更新操作;
(2)操作只對屬性值進行增量的修改,
模式的構(gòu)成包括:操作訪問的表、操作嘗試修改的屬性和相應(yīng)的運算符、條件謂詞中的關(guān)系運算符和屬性,以及要訪問的元組的主鍵值,模式相同的操作會被放在同一個操作列表中,這個方法確保有相同模式的操作一定由相同的事務(wù)模板產(chǎn)生并且訪問相同的元組,在圖2中,01和02具有相同的模式“R3c-c≥”,這意味著它們都訪問表R中主鍵為3的數(shù)據(jù),都在屬性c上做減法,并且都要求c大于等于某個常數(shù),相對地,如果一個操作不能滿足上述兩個條件,我們不需要計算它的模式,只需給它分配一個唯一的字符串作為它的模式,然后把它和它的模式一起放人PO-Map中(如圖2中的03即可)。
4執(zhí)行器
在執(zhí)行器中,工作線程一次從對應(yīng)的Po-Map中取出一項并檢查列表中的操作數(shù),如果有不止一個操作將進行操作合并,set后表達式的合并相對容易,如圖2中將01的“set c=c-1”和02的“set c=c-2”合并為“set c=c-3”,謂詞通常分為兩類:定位謂詞和條件謂詞,由于同質(zhì)操作訪問相同的元組,它們的定位謂詞一定相同,所以不用再進行合并,除了定位謂詞之外,一個sQL語句中可能還有其他的謂詞,把這些剩余的謂詞稱作條件謂詞,條件謂詞的作用是進一步檢查定位謂詞選出的元組是否符合一些額外的條件,條件謂詞的合并需要根據(jù)應(yīng)用邏輯配置,最簡單的方法是取交集,例如,將01和02中的“c≥1”和“c≥2”合并為“c≥2”,但是,如果這兩個操作的語義是當(dāng)庫存足夠的時候減少庫存,那么這種取交集的合并方法顯然不符合原意,在此場景下,可以將關(guān)系運算符之后的數(shù)字相加,即合并為“c≥3”,目前,F(xiàn)ilmer僅支持這兩種謂詞合并的方式,OLTP負載中的謂詞一般都不復(fù)雜,基于應(yīng)用邏輯指定合并方式是一種可行的方式。
完成操作合并之后,工作線程需要為操作爭取數(shù)據(jù)鎖,就像傳統(tǒng)的寫鎖一樣,合并操作的寫鎖不兼容其他寫鎖和讀鎖,但是,合并寫鎖由多個事務(wù)共享,沒有事務(wù)被允許重新獲得鎖,即使有些事務(wù)已經(jīng)占有了鎖,這是為了保證事務(wù)的可串行化,所以,需要保證參與合并的事務(wù)中除被合并操作之外,沒有其他操作同被合并操作訪問的數(shù)據(jù)相同。
另外,在過濾表中添加新項是執(zhí)行器的責(zé)任,當(dāng)工作線程發(fā)現(xiàn)一個減庫存操作由于違反了約束屬性上的限制而失敗,它會將該操作的信息添加到過濾表,為后續(xù)的過濾做準備。
在此階段,所有數(shù)據(jù)更新都只記錄在事務(wù)上下文中,在事務(wù)提交后更新會被寫入存儲中,當(dāng)事務(wù)被執(zhí)行時,它請求的鎖和更新就被記錄在上下文中,合并操作的更新只需要記錄在一個事務(wù)的上下文中,這種方法減少了事務(wù)操作內(nèi)存的次數(shù),待事務(wù)提交或回滾,事務(wù)管理器釋放事務(wù)上下文中記錄的鎖,通知工作線程,就可以繼續(xù)執(zhí)行被這些鎖阻塞的操作了,但是,如果參與合并的事務(wù)中有一個發(fā)生回滾,則整個合并操作都將被一起回滾,為了保證事務(wù)的原子性,必須回滾與之合并的所有事務(wù),為了保證這一點,所有參與合并操作的事務(wù)號被記錄在同一個合并集合中,只要合并集合中有一個事務(wù)回滾,所有其他的事務(wù)必須一起回滾,除此之外,在同一個合并集合中的事務(wù)還必須同時提交,以避免造成集合中有的事務(wù)已經(jīng)提交了而有的事務(wù)卻要回滾這樣不可恢復(fù)的情況,在高競爭的電商負載中,一個成功修改庫存的事務(wù)被回滾的可能性很小,假設(shè)一個事務(wù)被回滾的概率為p,那么由n個事務(wù)合并而成的一組事務(wù)被回滾的概率為1-(1-p)n,由于p很小,即使將n的大小設(shè)置為商品庫存的數(shù)量,(1-p)”仍舊是個接近1的值,這一組事務(wù)被回滾的概率依舊很小,比商品庫存還大的n是沒有意義的,如果大量事務(wù)被一起回滾的風(fēng)險實在不可接受,我們可以調(diào)整合并的粒度n來保證每次被合并執(zhí)行的操作小于某個閾值,合并粒度n越大,系統(tǒng)的吞吐量越大,合并回滾風(fēng)險也越大,應(yīng)用開發(fā)者需要根據(jù)具體應(yīng)用中事務(wù)回滾的概率p選擇一個最適合的合并粒度n。
5實驗分析
5.1實驗環(huán)境及測試負載
硬件環(huán)境:本系統(tǒng)部署在單個物理節(jié)點上,該節(jié)點含有2個CPU,型號為Intel Xeon Silver 4 110@2.1 GHz CPU;內(nèi)存為120 GB;存儲為4 TB,RAID-5.7200轉(zhuǎn)的HDD磁盤。
測試負載:實驗中的測試負載是PeakBench,PeakBench抽象了秒殺應(yīng)用的業(yè)務(wù)模型,可以模擬秒殺活動發(fā)生時的高并發(fā)事務(wù)負載,并控制負載的沖突粒度,其中的訂單信息處理請求負載包括五個事務(wù),分別是訂單提交、訂單支付、訂單取消、訂單查詢和訂單過期處理,由于造成大規(guī)模高沖突事務(wù)的是訂單提交事務(wù)即減庫存操作,所以本實驗主要測試訂單提交事務(wù)的效率,該事務(wù)共包括四條SQL操作:一個讀操作和三個寫操作。
默認設(shè)置:默認情況下,F(xiàn)ilmer負責(zé)查詢分析器的I/O線程個數(shù)設(shè)為4.負責(zé)執(zhí)行器的工作線程個數(shù)設(shè)為2.負載的Zipf參數(shù)(代表負載的競爭程度)設(shè)為2.商品個數(shù)為1億。
5.2實驗結(jié)果
5.2.1無效操作處理效率
本節(jié)實驗檢驗過濾器處理無效操作的效率,首先,為了直觀展示過濾器對系統(tǒng)處理無效操作效率的影響,本實驗將所有商品的庫存均設(shè)為20萬,觀察成功事務(wù)吞吐和失敗事務(wù)吞吐隨時間的變化,實驗結(jié)果如圖3所示。
從實驗結(jié)果中可以看出,14 s之前,沒有失敗的事務(wù),從第15 s開始,一些比較熱門的商品售罄,大量減庫存操作開始失敗,從而使得失敗事務(wù)吞吐上升,隨著時間的流逝,賣完的商品越來越多,當(dāng)Filmer的過濾功能開啟,系統(tǒng)處理失敗事務(wù)的效率會提升1.5倍左右,同時,由于無效操作的過濾節(jié)省了后續(xù)工作線程的資源,成功事務(wù)的吞吐也略有提高。
過濾器還改善了數(shù)據(jù)庫系統(tǒng)處理高競爭負載時的可擴展性,圖4中的實驗將所有商品個數(shù)都設(shè)為0.此時所有的吞吐都是失敗事務(wù)吞吐,改變I/O線程或工作線程的個數(shù),觀察Filmer的吞吐變化,前4組實驗中,工作線程個數(shù)都是2.I/O線程個數(shù)從1增加到4.可以發(fā)現(xiàn),當(dāng)過濾功能未打開時,由于負載中大量無效操作都是沖突的,必須由工作線程一個個加鎖串行執(zhí)行,使得工作線程成為“瓶頸”,I/O線程個數(shù)到達2之后,再怎么增加系統(tǒng)吞吐也沒有明顯變化,第五組實驗中將工作線程個數(shù)增加了一倍,仍舊無法提高吞吐,這是因為負載沖突較高時,大量SQL請求訪問同一條數(shù)據(jù),同時數(shù)據(jù)分區(qū)和工作線程綁定,增加工作線程的個數(shù)無法消除熱點數(shù)據(jù)上工作線程的“瓶頸”,相對地,當(dāng)過濾功能開啟,不同I/O線程可以并行處理沖突的無效操作,極大地改善了系統(tǒng)的可擴展性,但事務(wù)中有效的沖突操作仍需交由工作線程處理,當(dāng)I/O線程組的吞吐大到一定程度后,工作線程會再次成為“瓶頸”,這也是當(dāng)過濾功能打開時,吞吐無法線性擴展的原因。
5.2.2高競爭更新操作處理效率
高競爭的負載往往具有高并發(fā)、高沖突的特點,在傳統(tǒng)的數(shù)據(jù)庫執(zhí)行模式中,當(dāng)負載的沖突程度很高時,增加并發(fā)的數(shù)據(jù)庫事務(wù)量并不能提高吞吐,因為這些事務(wù)到達數(shù)據(jù)庫后仍舊需要逐個加鎖串行執(zhí)行,F(xiàn)ilmer的合并功能很好地解決了這個問題,圖5所示的實驗中,并發(fā)因子代表事務(wù)的并發(fā)量,并發(fā)因子越大,同一時刻數(shù)據(jù)庫中需要處理的事務(wù)越多,改變并發(fā)因子,觀察系統(tǒng)吞吐和時延的變化,關(guān)閉合并功能時,增大并發(fā)因子并不能使系統(tǒng)吞吐增加,而僅僅使事務(wù)時延變得很高,因為大量更新操作是相互沖突的,一個事務(wù)需要等待前面到達的沖突事務(wù)全部處理完后才能執(zhí)行,打開合并功能后,沖突的操作可以合并執(zhí)行,此時并發(fā)因子越大,操作合并執(zhí)行的機會就越大,系統(tǒng)吞吐最高可達之前的3.6倍,同時,因為事務(wù)處理效率整體提升,時延也相對合并未打開時降低了很多。
圖6所示的實驗數(shù)據(jù)展示了Filmer的合并功能處理高競爭負載的顯著優(yōu)勢,將并發(fā)因子設(shè)為50.改變zipf參數(shù),觀察系統(tǒng)吞吐和時延的變化,合并功能關(guān)閉時,隨著負載沖突程度的增加,吞吐下降明顯,同時時延也受到很大影響,打開合并功能后,沖突最高的情況下(zipf參數(shù)為2.5),競爭程度也最高,此時吞吐可達之前的3.7倍,而時延只是之前的28%,這是因為合并功能使得沖突操作可以并行執(zhí)行,合并在一起的操作所屬的事務(wù)不再需要互相等待,但是合并而成的大事務(wù)如果是沖突的,仍舊需要串行執(zhí)行,所以沖突程度增加后,吞吐仍會下降,時延也略有增加。
6結(jié)語
針對高競爭電商負載,本文從兩個方面優(yōu)化數(shù)據(jù)庫管理系統(tǒng)的內(nèi)核實現(xiàn),其一是在查詢處理的輸入層實現(xiàn)無效操作過濾器,將肯定無法返回有效商品的操作直接過濾掉,以降低系統(tǒng)負載壓力;其二是將高競爭電商負載中大量沖突的減庫存操作合并執(zhí)行,增大事務(wù)的并發(fā)執(zhí)行度,降低鎖競爭,本文實現(xiàn)了一個數(shù)據(jù)庫原型系統(tǒng)Filmer,并通過實驗證明,過濾和合并操作使系統(tǒng)處理高競爭負載的效率得到了極大提升。