內(nèi)存是很大程度上確定數(shù)據(jù)庫(kù)性能和穩(wěn)定性的關(guān)鍵系統(tǒng)資源。在本說(shuō)明書(shū)中,術(shù)語(yǔ)“內(nèi)存(memory)”,除非修改,指的是隨機(jī)存取存儲(chǔ)器。在沒(méi)有足夠內(nèi)存存在的情況下,因?yàn)橐绯龌蚝?jiǎn)單地出錯(cuò),查詢(xún)會(huì)緩慢,而導(dǎo)致不期望的行為。由于內(nèi)存是無(wú)限的,適當(dāng)內(nèi)存管理是確保公平和可接受的使用以及最佳的可能用戶(hù)體驗(yàn)的關(guān)鍵。
在大規(guī)模并行處理(MPP)數(shù)據(jù)庫(kù)中,以下高級(jí)步驟描述了查詢(xún)處理:
1.用戶(hù)提交查詢(xún)。
2.解析器解析查詢(xún)。
3.計(jì)劃器對(duì)查詢(xún)進(jìn)行計(jì)劃并產(chǎn)生查詢(xún)計(jì)劃樹(shù),其由不同進(jìn)程構(gòu)成;進(jìn)程可以在該樹(shù)上多次發(fā)生。
4.內(nèi)存配額進(jìn)程向每個(gè)操作器指派限定該操作器能夠使用的最大內(nèi)存的一定內(nèi)存配額,以限制其運(yùn)行時(shí)內(nèi)存分配。
5.計(jì)劃被調(diào)度給多個(gè)工作者節(jié)點(diǎn)來(lái)以分布式方式執(zhí)行。
6.每個(gè)工作者節(jié)點(diǎn)接收它的計(jì)劃樹(shù)的副本,其指示被指派給該進(jìn)程的內(nèi)存配額。
7.查詢(xún)執(zhí)行引擎執(zhí)行計(jì)劃。
8.通過(guò)服務(wù)器,向用戶(hù)返回結(jié)果。
貫穿此過(guò)程,內(nèi)存由多個(gè)查詢(xún)分配。為了確保內(nèi)存的公平使用和適當(dāng)利用以及確保系統(tǒng)穩(wěn)定性,系統(tǒng)必須進(jìn)行下述操作:
1.測(cè)量每個(gè)查詢(xún)的內(nèi)存使用。
2.檢查以了解內(nèi)存使用是否在配額內(nèi)。
3.對(duì)于不同查詢(xún)施行(enforce)內(nèi)存配額。
每個(gè)主要數(shù)據(jù)庫(kù)具有內(nèi)存管理器來(lái)有效率地分配和釋放內(nèi)存。此外,主要的數(shù)據(jù)庫(kù)具有算法來(lái)在對(duì)查詢(xún)的計(jì)劃期間向SQL(結(jié)構(gòu)查詢(xún)語(yǔ)言)語(yǔ)句指派內(nèi)存配額。在執(zhí)行期間,內(nèi)存管理器通常使用內(nèi)存區(qū)域來(lái)將內(nèi)存分配給SQL操作器,其主要為了效率以及為了跟蹤分配。
技術(shù)實(shí)現(xiàn)要素:
本說(shuō)明書(shū)描述了用于在計(jì)算環(huán)境中跟蹤內(nèi)存使用的技術(shù)。這些技術(shù)大體上涉及在計(jì)算機(jī)系統(tǒng)的節(jié)點(diǎn)中運(yùn)行的多個(gè)進(jìn)程中的每一個(gè)中實(shí)現(xiàn)內(nèi)存使用跟蹤器(MUT)的實(shí)例。每個(gè)MUT對(duì)于運(yùn)行在與該MUT相關(guān)聯(lián)的相應(yīng)進(jìn)程上的多個(gè)擁有者中的每一個(gè)維持內(nèi)存使用的賬戶(hù)。每個(gè)擁有者是與公共功能相關(guān)聯(lián)的代碼的一個(gè)或多個(gè)區(qū)域的集合的邏輯擁有者。MUT能夠確定每個(gè)擁有者的實(shí)際內(nèi)存配額。MUT通過(guò)以下操作來(lái)施行每個(gè)擁有者的實(shí)際內(nèi)存配額:接收每個(gè)擁有者所作出的對(duì)于內(nèi)存的分配請(qǐng)求,相對(duì)該擁有者的實(shí)際配額來(lái)檢查每個(gè)分配請(qǐng)求和該擁有者的賬戶(hù)的當(dāng)前狀態(tài),批準(zhǔn)或拒絕每個(gè)分配請(qǐng)求,將所述批準(zhǔn)或拒絕傳輸?shù)降讓觾?nèi)存管理器,以及對(duì)于每個(gè)所批準(zhǔn)的分配請(qǐng)求,更新該擁有者的賬戶(hù)。
附圖說(shuō)明
圖1A是用于跟蹤內(nèi)存使用的示例系統(tǒng)的圖。
圖1B是多進(jìn)程計(jì)算系統(tǒng)中的示例內(nèi)存使用跟蹤器(MUT)的圖。
圖2是在多進(jìn)程計(jì)算系統(tǒng)中執(zhí)行內(nèi)存分配的流程圖。
圖3是在多進(jìn)程計(jì)算系統(tǒng)中釋放所分配的內(nèi)存的流程圖。
圖4是在多進(jìn)程計(jì)算系統(tǒng)中執(zhí)行邏輯內(nèi)存仲裁的流程圖。
圖5是確定賬戶(hù)和/或子賬戶(hù)的共享報(bào)頭是否存在并且為賬戶(hù)和/或子賬戶(hù)分配新的共享報(bào)頭的流程圖。
圖6是在多進(jìn)程計(jì)算系統(tǒng)中釋放內(nèi)存塊(memory chunk)的流程圖。
圖7是在多進(jìn)程計(jì)算系統(tǒng)中執(zhí)行對(duì)內(nèi)存的成批釋放的流程圖。
圖8描繪了示例數(shù)據(jù)庫(kù)管理系統(tǒng)。
具體實(shí)施方式
1.1內(nèi)存管理器系統(tǒng)
任何內(nèi)存管理器的可用性依賴(lài)于測(cè)量每個(gè)查詢(xún)的內(nèi)存使用的精確度。如果測(cè)量錯(cuò)誤或不精確,則不可能確保公平的內(nèi)存使用或者確保系統(tǒng)穩(wěn)定性。本說(shuō)明書(shū)描述了內(nèi)存管理器系統(tǒng),其能夠跟蹤不同查詢(xún)的精確內(nèi)存使用并且提供了這些功能。內(nèi)存管理器系統(tǒng)能夠確保公平的內(nèi)存使用和適當(dāng)?shù)膬?nèi)存利用,并且最重要的是,其能夠改善系統(tǒng)穩(wěn)定性。
因?yàn)閮?nèi)存管理器系統(tǒng)通過(guò)不同組件提供了對(duì)內(nèi)存使用的精確跟蹤,所以其不需要作出這三個(gè)通常的假設(shè):
1.存在已知的內(nèi)存密集型查詢(xún)的集合
2.對(duì)內(nèi)存密集型查詢(xún)的內(nèi)存使用的跟蹤足夠好,以確保公平使用和適當(dāng)內(nèi)存利用
3.內(nèi)存密集型查詢(xún)?cè)讵?dú)占(exclusive)內(nèi)存區(qū)域的集合中分配并且存在對(duì)內(nèi)存區(qū)域和內(nèi)存密集型操作器的一對(duì)一映射
在示例實(shí)施方式中將在數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中描述內(nèi)存管理器系統(tǒng)。DBMS實(shí)現(xiàn)并行處理并且能夠是MPP數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)操作于多個(gè)物理計(jì)算機(jī)節(jié)點(diǎn)上。在一些實(shí)施方式中,在每個(gè)節(jié)點(diǎn)上,一個(gè)或多個(gè)段——即段實(shí)例——被實(shí)例化。每個(gè)段是邏輯節(jié)點(diǎn),并且可以被認(rèn)為是虛擬機(jī)。每個(gè)段通常將運(yùn)行許多進(jìn)程;每個(gè)進(jìn)程是個(gè)體可執(zhí)行單元。每個(gè)進(jìn)程具有其本身的內(nèi)存配額及其本身的內(nèi)存管理器系統(tǒng)的實(shí)例。特定進(jìn)程的內(nèi)存管理器系統(tǒng)具有一些能力來(lái)與節(jié)點(diǎn)上其他進(jìn)程的內(nèi)存管理器系統(tǒng)交互,稍后將對(duì)其描述。DBMS將復(fù)雜查詢(xún)分成小任務(wù)且將它們分發(fā)以供執(zhí)行。節(jié)點(diǎn)一起工作以形成單個(gè)并行查詢(xún)處理系統(tǒng)。
內(nèi)存管理器系統(tǒng)能夠監(jiān)視使用,施行配額以確保公平,以及基于系統(tǒng)負(fù)載來(lái)調(diào)整以確保適當(dāng)?shù)膬?nèi)存利用。內(nèi)存管理器系統(tǒng)具有以下特征:
1.其跟蹤不同查詢(xún)的精確內(nèi)存使用。
2.其提供可擴(kuò)展框架以靈活地限定跟蹤哪些查詢(xún);使用該框架,能夠跟蹤任何數(shù)目的SQL進(jìn)程,以及非進(jìn)程組件。
3.其能夠基于分配地點(diǎn)(諸如代碼區(qū)域的功能或文件)來(lái)測(cè)量在任意代碼區(qū)域處的內(nèi)存使用。這樣的任意代碼區(qū)域被稱(chēng)為內(nèi)存擁有代碼類(lèi)型或簡(jiǎn)單被稱(chēng)為擁有者類(lèi)型。使用代碼區(qū)域的實(shí)例被稱(chēng)為內(nèi)存擁有代碼或簡(jiǎn)稱(chēng)為擁有者。
4.作為代碼區(qū)段的內(nèi)存擁有者類(lèi)型均能夠被指派任何數(shù)目的不同角色中的一個(gè),例如與SQL進(jìn)程相對(duì)應(yīng)的表掃描、排序或匯總,或者甚至與非SQL進(jìn)程組件相對(duì)應(yīng)的角色,例如查詢(xún)計(jì)劃器。
5.內(nèi)存管理器系統(tǒng)能夠?qū)γ繐碛姓邅?lái)從不同內(nèi)存區(qū)域收集分配且能夠區(qū)分單個(gè)內(nèi)存區(qū)域內(nèi)的對(duì)不同擁有者的分配。在跟蹤分配以作為內(nèi)存賬戶(hù)的場(chǎng)境(context)中,對(duì)擁有者分配和擁有者賬戶(hù)的引用應(yīng)當(dāng)總是被理解為是對(duì)擁有者的分配和賬戶(hù)的引用。
6.內(nèi)存管理器系統(tǒng)能夠跟蹤丟失的利用。
7.內(nèi)存管理器系統(tǒng)能夠檢測(cè)低系統(tǒng)內(nèi)存并暫停或終止一個(gè)或多個(gè)查詢(xún)以確保系統(tǒng)穩(wěn)定性。
內(nèi)存管理器系統(tǒng)基于分配地點(diǎn)——即作出內(nèi)存分配請(qǐng)求的代碼中的地點(diǎn),來(lái)跟蹤分配所有權(quán)——即哪個(gè)代碼實(shí)例負(fù)責(zé)內(nèi)存分配。每個(gè)分配地點(diǎn)與標(biāo)識(shí)擁有者類(lèi)型的信息相關(guān)聯(lián),在缺乏對(duì)所有權(quán)的特定指派時(shí)其可以是全方位(catch-all)的。此外,內(nèi)存管理器系統(tǒng)框架支持多態(tài)分配地點(diǎn),使得從共享庫(kù)所作出的分配能夠基于分配共享庫(kù)進(jìn)程、對(duì)庫(kù)的調(diào)用的擁有者、以及進(jìn)程在查詢(xún)計(jì)劃樹(shù)的何處執(zhí)行來(lái)假設(shè)多個(gè)所有權(quán)。這允許獲得精確的所有權(quán)跟蹤。
1.2擁有者和內(nèi)存賬戶(hù)
內(nèi)存的擁有者類(lèi)型是基于代碼基的邏輯劃分來(lái)定義的,例如MPP DBMS的代碼基。與數(shù)據(jù)庫(kù)進(jìn)程——例如SQL進(jìn)程——相關(guān)的代碼的區(qū)域或者與解析器、計(jì)劃器、優(yōu)化器、調(diào)度器、查詢(xún)串行器和解串器、執(zhí)行器或其他操作器、或者視需要的其他非進(jìn)程組件相關(guān)的代碼的區(qū)域,能夠被識(shí)別為相異的擁有者類(lèi)型。在劃分被決定后,其能夠以多種方式來(lái)實(shí)現(xiàn),只要凈效果是內(nèi)存管理器系統(tǒng)能夠?qū)τ诿總€(gè)內(nèi)存分配確定劃分的哪個(gè)實(shí)例——即哪個(gè)擁有者——應(yīng)當(dāng)是分配的起因。例如,利用向內(nèi)存管理器系統(tǒng)API的調(diào)用可以將代碼儀表化,所述呼叫在任何時(shí)候通知內(nèi)存管理器系統(tǒng)哪個(gè)擁有者代碼正被執(zhí)行。替選地,內(nèi)存管理器系統(tǒng)能夠包括網(wǎng)關(guān),通過(guò)該網(wǎng)關(guān)能夠作出對(duì)與擁有者相對(duì)應(yīng)的進(jìn)程——例如數(shù)據(jù)庫(kù)進(jìn)程——的調(diào)用,并且網(wǎng)關(guān)能夠提供或維持切換所有權(quán)所需的信息。然后,內(nèi)存管理器系統(tǒng)能夠在相應(yīng)內(nèi)存賬戶(hù)中記錄擁有者的內(nèi)存使用,所述內(nèi)存賬戶(hù)是記錄擁有者的內(nèi)存使用的計(jì)數(shù)器。擁有者中的每一個(gè)能夠進(jìn)一步通過(guò)使用子內(nèi)存賬戶(hù)來(lái)將其內(nèi)存使用與底層子系統(tǒng)——諸如存儲(chǔ)、互連、目錄訪問(wèn)等——的內(nèi)存使用分離。
擁有者具有擁有者類(lèi)型。擁有者僅具有一個(gè)擁有者類(lèi)型,其對(duì)應(yīng)于與擁有者類(lèi)型的進(jìn)程或非進(jìn)程組件相關(guān)聯(lián)的代碼的區(qū)域。每個(gè)擁有者——即該擁有者類(lèi)型的實(shí)例,具有一個(gè)內(nèi)存賬戶(hù),其將被用于通過(guò)代碼的該實(shí)例(擁有者類(lèi)型)或者通過(guò)被擁有者類(lèi)型的代碼區(qū)域所調(diào)用的代碼來(lái)記錄對(duì)內(nèi)存的分配,將在下面對(duì)其描述。
1.3子內(nèi)存賬戶(hù)
子內(nèi)存賬戶(hù)是擁有者的內(nèi)存消耗的更精細(xì)的子劃分。進(jìn)程——例如排序(Sort)進(jìn)程——可以取決于復(fù)雜子系統(tǒng)——諸如數(shù)據(jù)提供者、網(wǎng)絡(luò)傳輸層、子計(jì)劃、或者用戶(hù)功能,該進(jìn)程不直接負(fù)責(zé)其內(nèi)存使用。內(nèi)存管理器系統(tǒng)能夠跟蹤這樣的子賬戶(hù)并且同時(shí)能夠確保對(duì)所有子賬戶(hù)和擁有者賬戶(hù)的匯總?cè)耘f在所定義的內(nèi)存配額內(nèi)。這在精確的每擁有者內(nèi)存使用的基礎(chǔ)上提供了內(nèi)存使用的精確分離。
1.4短壽命和長(zhǎng)壽命內(nèi)存賬戶(hù)
內(nèi)存管理器系統(tǒng)還提供對(duì)于賬戶(hù)壽命的支持,以檢測(cè)執(zhí)行的不同階段。一些賬戶(hù)能夠被標(biāo)記為超出單個(gè)執(zhí)行階段而存活,其被稱(chēng)為長(zhǎng)壽命內(nèi)存賬戶(hù),而其他能夠被標(biāo)記為在一個(gè)執(zhí)行階段內(nèi)存活。執(zhí)行階段是抽象時(shí)間概念,其能夠被用于驗(yàn)證內(nèi)存泄漏且檢查長(zhǎng)壽命分配。對(duì)于查詢(xún)執(zhí)行,長(zhǎng)壽命賬戶(hù)可以在整個(gè)查詢(xún)或多個(gè)查詢(xún)期間存活,而短壽命賬戶(hù)可能只在單個(gè)SQL進(jìn)程中存活。
1.5內(nèi)存管理器系統(tǒng)組件
內(nèi)存管理器(MM)
內(nèi)存管理器(MM)負(fù)責(zé)執(zhí)行分配請(qǐng)求和解除分配請(qǐng)求。在一些實(shí)施方式中,MM是基于區(qū)域的內(nèi)存管理器。每個(gè)進(jìn)程可以與MM的實(shí)例相關(guān)聯(lián)。對(duì)于基于區(qū)域的MM,MM以塊來(lái)分配內(nèi)存;一個(gè)塊是單個(gè)內(nèi)存分配。每個(gè)塊屬于特定內(nèi)存區(qū)域。例如,如圖1中所示,內(nèi)存管理器能夠管理內(nèi)存的區(qū)域,示出為框的行,每個(gè)行包括多個(gè)內(nèi)存的塊,其由每個(gè)行中的各個(gè)框來(lái)表示。
內(nèi)存使用跟蹤器(MUT)
內(nèi)存使用跟蹤器(MUT)負(fù)責(zé)在當(dāng)前擁有者的內(nèi)存賬戶(hù)——即擁有者類(lèi)型的當(dāng)前實(shí)例——中記錄分配。其還負(fù)責(zé)在初始分配了被解除分配的內(nèi)存的擁有者賬戶(hù)中記錄解除分配。注意:對(duì)一個(gè)擁有者的內(nèi)存的解除分配能夠在一個(gè)不同的擁有者活動(dòng)時(shí)發(fā)生。MUT與MM交互以識(shí)別分配和解除分配活動(dòng)。MUT還提供應(yīng)用程序接口(API),進(jìn)程代碼或非進(jìn)程代碼能夠調(diào)用該API來(lái)創(chuàng)建內(nèi)存賬戶(hù)。MUT在內(nèi)存賬戶(hù)樹(shù)(memory accounting tree)中維持新創(chuàng)建的內(nèi)存賬戶(hù)。其還具有API來(lái)激活和停用賬戶(hù)。當(dāng)賬戶(hù)處于活動(dòng)時(shí),其擁有者是活動(dòng)的分配者,這意味著只要該賬戶(hù)處于活動(dòng),任何新內(nèi)存分配就都計(jì)入該擁有者和該擁有者的內(nèi)存賬戶(hù)。除了提供基本賬戶(hù)創(chuàng)建、切換、和使用跟蹤API,MUT還具有各種報(bào)告API以報(bào)告內(nèi)存使用。
MUT能夠附加地監(jiān)視系統(tǒng)的可用內(nèi)存以檢查該系統(tǒng)是否內(nèi)存低。如果系統(tǒng)進(jìn)到臨界低內(nèi)存狀況或者內(nèi)存不足(OOM)事件,MUT能夠基于預(yù)先定義的策略來(lái)暫?;蚪K止查詢(xún)。MUT還能夠識(shí)別和記錄消耗過(guò)度內(nèi)存的查詢(xún)以幫助診斷內(nèi)存問(wèn)題。具體的,MUT可以保存當(dāng)進(jìn)程的當(dāng)前內(nèi)存消耗的快照并向其他進(jìn)程中的MUT通知該OOM事件。MUT還通過(guò)周期性檢查在其他處理中是否發(fā)生任何新的OOM事件來(lái)在其他運(yùn)行的進(jìn)程中跟蹤OOM事件。如果其檢測(cè)到任何這樣的進(jìn)程外OOM,其還將當(dāng)前進(jìn)程的內(nèi)存使用記入日志,使得我們得到跨系統(tǒng)中所有進(jìn)程的內(nèi)存消耗的整體局面。
MUT還使用系統(tǒng)內(nèi)存中的共享內(nèi)存以在中央監(jiān)視跨節(jié)點(diǎn)上運(yùn)行的所有查詢(xún)(以及由此所有數(shù)據(jù)庫(kù)進(jìn)程)的內(nèi)存使用。MUT能夠使用共享的內(nèi)存來(lái)在低內(nèi)存事件或OOM事件期間確定哪個(gè)特定查詢(xún)或哪些特定查詢(xún)應(yīng)當(dāng)被終止,并且能夠更新共享內(nèi)存中的信息以指令一個(gè)或多個(gè)特定查詢(xún)終止。
1.6內(nèi)存的分配中的內(nèi)存管理器系統(tǒng)部分的交互
內(nèi)存管理器系統(tǒng)執(zhí)行以下序列以在對(duì)內(nèi)存的分配中啟用適當(dāng)內(nèi)存監(jiān)視。
1.擁有者的賬戶(hù)的創(chuàng)建:如果擁有者的代碼區(qū)域開(kāi)始執(zhí)行,則其在合適的賬戶(hù)不存在的情況下將首先請(qǐng)求MUT創(chuàng)建適當(dāng)內(nèi)存賬戶(hù)。例如,如果進(jìn)程——排序正在執(zhí)行,則在合適的賬戶(hù)不存在的情況下,排序?qū)⒁驧UT為排序進(jìn)程創(chuàng)建內(nèi)存賬戶(hù)。MUT將在內(nèi)存賬戶(hù)樹(shù)中創(chuàng)建內(nèi)存賬戶(hù),并且將其返回給排序。
類(lèi)似于排序操作器,其他擁有者也能夠創(chuàng)建它們的對(duì)應(yīng)的內(nèi)存賬戶(hù),其能夠表示擁有者的身份并保存內(nèi)存使用信息。在擁有者的內(nèi)存賬戶(hù)被創(chuàng)建之后,擁有者取回所有權(quán)令牌,該所有權(quán)令牌僅是指向其內(nèi)存賬戶(hù)的指針。當(dāng)需要時(shí),擁有者能夠隨后使用該令牌來(lái)將其內(nèi)存賬戶(hù)設(shè)置為活動(dòng),這指令MUT在該賬戶(hù)中記錄內(nèi)存分配。
2.內(nèi)存賬戶(hù)切換或?qū)?nèi)存賬戶(hù)的激活:一旦內(nèi)存賬戶(hù)被創(chuàng)建,例如排序就將在其正執(zhí)行時(shí)請(qǐng)求MUT將其設(shè)置為活動(dòng)的擁有者。然后,MUT將排序內(nèi)存賬戶(hù)設(shè)置為活動(dòng)的內(nèi)存賬戶(hù)。
3.請(qǐng)求新內(nèi)存:如果必要,排序能夠從MUT請(qǐng)求新內(nèi)存。
4.分配內(nèi)存:MUT與MM交互以從系統(tǒng)分配信息內(nèi)存。
在這個(gè)過(guò)程期間,如果MUT檢測(cè)到低系統(tǒng)內(nèi)存水平,則MUT識(shí)別具有高內(nèi)存消耗的查詢(xún)。MUT還可以向其他進(jìn)程中的對(duì)等MUT通知此低內(nèi)存狀況。從一個(gè)MUT到其他MUT的直接通知機(jī)制使得所有MUT能夠快速行動(dòng)以減緩低內(nèi)存狀況。MUT可以使用如先前所述的共享的內(nèi)存來(lái)與其對(duì)等MUT交互。在通知后,MUT中的每一個(gè)能夠通過(guò)以下方式?jīng)Q定暫?;蚪K止它們各自的進(jìn)程:基于預(yù)先定義的釋放內(nèi)存的策略,基于接收終止它們相應(yīng)的進(jìn)程的指令,基于訪問(wèn)在共享內(nèi)存處指示MUT應(yīng)當(dāng)終止其相應(yīng)進(jìn)程的數(shù)據(jù),或者通過(guò)另一方法。
5.更新內(nèi)存賬戶(hù):如果分配成功,則MUT在當(dāng)前活動(dòng)的內(nèi)存賬戶(hù)中記錄分配。如果子組件負(fù)責(zé)分配,該該分配被記錄在對(duì)應(yīng)的子賬戶(hù)中以及活動(dòng)的擁有者的內(nèi)存賬戶(hù)中。在該進(jìn)程期間,MUT能夠檢測(cè)配額違規(guī)(violation),并且在該情況下能夠拒絕分配請(qǐng)求。此外,MUT能夠在多個(gè)擁有者之間仲裁內(nèi)存以將一個(gè)擁有者的未使用的配額重新分發(fā)給另一擁有者。MUT還能夠向另一進(jìn)程的MUT或其他進(jìn)程的MUT通話以仲裁跨進(jìn)程的內(nèi)存重新分發(fā)。
當(dāng)系統(tǒng)內(nèi)存以塊來(lái)分配時(shí),每個(gè)塊將其自身與不超過(guò)一個(gè)內(nèi)存賬戶(hù)相關(guān)聯(lián),如活動(dòng)的內(nèi)存賬戶(hù)在對(duì)該塊的分配期間所確定的。分配的塊包括報(bào)頭,該報(bào)頭包括支持與該塊相關(guān)聯(lián)的擁有者和內(nèi)存賬戶(hù)的識(shí)別的信息,稍后將對(duì)其描述。
1.7內(nèi)存的解除分配中的內(nèi)存管理器系統(tǒng)組件的交互
內(nèi)存管理器系統(tǒng)能夠以若干方式來(lái)對(duì)內(nèi)存解除分配,列舉如下:
1.來(lái)自擁有者的顯式解除分配請(qǐng)求:如果擁有者請(qǐng)求對(duì)內(nèi)存塊的解除分配,則通知MUT該解除分配。MUT從該塊中的報(bào)頭識(shí)別分配該塊的原始擁有者,并且定位對(duì)應(yīng)的內(nèi)存賬戶(hù)。然后,MUT調(diào)整原始擁有者的賬戶(hù)余額(account balance)以反映解除分配,例如通過(guò)從原始擁有者的賬戶(hù)余額中扣除等于該塊的內(nèi)存量。
2.基于銷(xiāo)亡或重置的場(chǎng)境的成批釋放:內(nèi)存管理器系統(tǒng)在內(nèi)存區(qū)域上提供成批釋放操作以釋放該區(qū)域中的所有分配。MUT提供API以處置該成批釋放操作。如果作出成批釋放內(nèi)存場(chǎng)境的決定,則MUT識(shí)別在該區(qū)域中分配內(nèi)存的所有內(nèi)存賬戶(hù),并且根據(jù)它們對(duì)該區(qū)域的匯總分配來(lái)調(diào)整它們的余額。
3.銷(xiāo)亡內(nèi)存賬戶(hù):MUT還支持重置或擦除內(nèi)存賬戶(hù)樹(shù),其后僅長(zhǎng)壽命賬戶(hù)會(huì)存活。具有短壽命擁有者的任何塊將由滾轉(zhuǎn)賬戶(hù)(rollover account)擁有,滾轉(zhuǎn)賬戶(hù)是目的在于跟蹤長(zhǎng)壽命分配的長(zhǎng)壽命賬戶(hù)。滾轉(zhuǎn)賬戶(hù)的子賬戶(hù)承擔(dān)短壽命賬戶(hù)中的對(duì)應(yīng)子賬戶(hù)中的分配的所有權(quán)。結(jié)果,所有塊將具有相同滾轉(zhuǎn)擁有者,而不管它們的之前的擁有者如何。在跟蹤合法長(zhǎng)壽命分配外,滾轉(zhuǎn)賬戶(hù)還能夠被用于幫助診斷非預(yù)期的長(zhǎng)壽命分配或內(nèi)存泄漏。
1.8新穎特征
內(nèi)存管理器系統(tǒng)具有以下新穎特征:
1.跟蹤每擁有者的使用
內(nèi)存管理器系統(tǒng)根據(jù)靈活定義的擁有者來(lái)定義內(nèi)存分配。任何擁有者能夠在多個(gè)內(nèi)存區(qū)域中分配內(nèi)存,并且內(nèi)存管理器系統(tǒng)跨所有分配來(lái)自動(dòng)跟蹤擁有者的匯總內(nèi)存足跡。因此,系統(tǒng)能夠輕易處置內(nèi)存分配,其中一個(gè)擁有者的分配橫跨多個(gè)代碼區(qū)域且一個(gè)代碼區(qū)域能夠包含歸因于多個(gè)擁有者的分配。
2.靈活的所有權(quán)框架
內(nèi)存管理器系統(tǒng)在靈活定義的擁有者類(lèi)型集合上工作。擁有者類(lèi)型能夠是良好定義的進(jìn)程、模塊、子模塊或甚至是一個(gè)或多個(gè)任意代碼區(qū)域。代碼區(qū)域能夠被標(biāo)注有多個(gè)不同擁有者類(lèi)型,并且根據(jù)該標(biāo)注,該代碼區(qū)域中的任何內(nèi)存分配自動(dòng)被視為由該擁有者類(lèi)型的擁有者來(lái)使用。這樣的靈活性允許內(nèi)存管理器系統(tǒng)測(cè)量不同進(jìn)程的精確內(nèi)存消耗。
3.多態(tài)所有權(quán)框架
每個(gè)代碼區(qū)域能夠在執(zhí)行時(shí)基于邏輯角色來(lái)承擔(dān)多個(gè)所有權(quán)角色。因此,公共數(shù)據(jù)結(jié)構(gòu)——諸如API和共享組件,能夠在運(yùn)行時(shí)承擔(dān)不同的所有權(quán)角色。
上面的三個(gè)新穎特征消除了對(duì)內(nèi)存密集型進(jìn)程的基于區(qū)域的內(nèi)存使用跟蹤的限制。
4.層級(jí)起源管理
SQL查詢(xún)計(jì)劃固有地呈樹(shù)狀。利用SQL計(jì)劃的類(lèi)樹(shù)形狀,內(nèi)存管理器系統(tǒng)保持跟蹤樹(shù)中的所有擁有者。這允許相同擁有者類(lèi)型的不同擁有者的邏輯起源分離。例如,如果在相同SQL計(jì)劃中找到兩個(gè)排序進(jìn)程,則內(nèi)存管理器系統(tǒng)能夠通過(guò)使用計(jì)劃結(jié)構(gòu)樹(shù)來(lái)區(qū)分它們。此外,對(duì)于非進(jìn)程組件——諸如計(jì)劃器、查詢(xún)計(jì)劃生成器、或者解析器、SQL解析器,內(nèi)存管理器系統(tǒng)基于執(zhí)行路徑和調(diào)用堆棧來(lái)提供類(lèi)樹(shù)表示。
5.MPP數(shù)據(jù)庫(kù)支持
由基于所有權(quán)模型來(lái)實(shí)現(xiàn)所標(biāo)注代碼區(qū)域而產(chǎn)生的靈活性允許內(nèi)存管理器系統(tǒng)不僅支持內(nèi)存密集型SQL進(jìn)程——諸如散列連接(Hash Join),而且還支持非進(jìn)程組件——諸如查詢(xún)計(jì)劃串行器和解串器以及查詢(xún)計(jì)劃器。即,內(nèi)存管理器系統(tǒng)能夠–
1.跟蹤非進(jìn)程擁有者的內(nèi)存消耗:在MPP數(shù)據(jù)庫(kù)平臺(tái)中,非進(jìn)程組件能夠消耗與內(nèi)存密集型進(jìn)程相同或在某些情況下更多的內(nèi)存。例如,關(guān)于與大量劃分的關(guān)系來(lái)工作的查詢(xún)計(jì)劃器能夠消耗大量的內(nèi)存。類(lèi)似地,大型計(jì)劃可以調(diào)度到MPP數(shù)據(jù)庫(kù)中的多個(gè)節(jié)點(diǎn)的運(yùn)行時(shí)引入顯著內(nèi)存開(kāi)銷(xiāo)。
2.跟蹤傳統(tǒng)上被視為非內(nèi)存密集型的進(jìn)程的內(nèi)存消耗:簡(jiǎn)單掃描處理,其傳統(tǒng)上被視為是非內(nèi)存密集型的,能夠因?yàn)樾麓鎯?chǔ)類(lèi)型——例如HAWQ中的復(fù)合(parquet)操作器——而變?yōu)閮?nèi)存密集型。
3.跟蹤子系統(tǒng)的內(nèi)存消耗:MPP數(shù)據(jù)庫(kù)可以具有除標(biāo)準(zhǔn)SQL進(jìn)程以外的許多進(jìn)程。例如,在網(wǎng)絡(luò)層處的查詢(xún)調(diào)度期間,MPP數(shù)據(jù)庫(kù)可以引入顯著內(nèi)存開(kāi)銷(xiāo)。內(nèi)存管理器系統(tǒng)了解這樣的分配,所以其能夠確保系統(tǒng)穩(wěn)定性和適當(dāng)?shù)膬?nèi)存利用。
6.內(nèi)存分配的本地和全局仲裁
在MPP數(shù)據(jù)庫(kù)中,工作量能夠是多種且復(fù)雜的。內(nèi)存管理器系統(tǒng)支持本地仲裁以從一個(gè)進(jìn)程向另一進(jìn)程重新分配內(nèi)存以在進(jìn)程級(jí)別針對(duì)不同工作量來(lái)調(diào)整。此外,內(nèi)存管理器還支持全局仲裁機(jī)制以利用來(lái)自對(duì)等查詢(xún)的空閑內(nèi)存配額。
7.用于診斷內(nèi)存問(wèn)題的整合的支持
內(nèi)存管理器系統(tǒng)支持不同擁有者對(duì)配額違規(guī)的檢測(cè):這允許內(nèi)存管理器系統(tǒng)調(diào)節(jié)不同擁有者——包括SQL進(jìn)程實(shí)例——的內(nèi)存消耗。
內(nèi)存管理器系統(tǒng)自動(dòng)跟蹤長(zhǎng)壽命內(nèi)存分配并且支持對(duì)內(nèi)存泄漏的檢測(cè):內(nèi)存管理器系統(tǒng)支持對(duì)泄漏內(nèi)存的查詢(xún)的識(shí)別。
在低系統(tǒng)內(nèi)存的事件下,內(nèi)存管理器系統(tǒng)能夠識(shí)別內(nèi)存擁有者和正在消耗大量?jī)?nèi)存的查詢(xún)。
在緊急工作量需要的情況下,內(nèi)存管理器系統(tǒng)支持具有大內(nèi)存足跡的查詢(xún)的暫停和終止。
8.支持實(shí)時(shí)數(shù)據(jù)庫(kù)引擎的優(yōu)化
內(nèi)存管理器系統(tǒng)自動(dòng)跟蹤分配的歷史并且跨多個(gè)分配來(lái)由相同擁有者共享元數(shù)據(jù)以使內(nèi)存開(kāi)銷(xiāo)最小化。
通過(guò)擁有者跟蹤內(nèi)存使用需要擁有者的內(nèi)存使用計(jì)數(shù)器的頻繁更新。內(nèi)存管理器系統(tǒng)通過(guò)合并隨后的更新以最小化更新操作的數(shù)目而使開(kāi)銷(xiāo)最小化。
內(nèi)存分配通??梢源婊疃鄠€(gè)SQL進(jìn)程。后面的SQL進(jìn)程的擁有者僅僅是這樣的長(zhǎng)壽命分配的消費(fèi)者,并且因此不負(fù)責(zé)它們的分配。但是,內(nèi)存管理器系統(tǒng)慮及這樣的分配以跟蹤內(nèi)存可用性。內(nèi)存管理器系統(tǒng)向內(nèi)存管理器系統(tǒng)提供長(zhǎng)壽命分配的快速所有權(quán)切換以保持跟蹤這樣的分配。
2.術(shù)語(yǔ)
2.1公共命名
3.擁有者進(jìn)程概述
3.1非進(jìn)程組件操作器
3.2 MUT組件
3.3特殊內(nèi)存賬戶(hù)
3.4設(shè)計(jì)概述
識(shí)別擁有者:
內(nèi)存以層級(jí)內(nèi)存區(qū)域來(lái)被分配。每個(gè)區(qū)域具有壽命,其控制被分配的內(nèi)存將存活多久。內(nèi)存區(qū)域的所需壽命能夠取決不擁有組件和對(duì)內(nèi)存的所意圖使用而廣泛變化。例如,取決于其是否在非常短時(shí)間——例如每元組內(nèi)、或者在長(zhǎng)持續(xù)時(shí)間——例如每聚合桶(bucket)內(nèi)使用內(nèi)存區(qū)域,聚合擁有者可以維持三個(gè)不同的內(nèi)存區(qū)域的集合。此外,若干不同組件可以分配來(lái)自相同區(qū)域的內(nèi)存。因此,內(nèi)存擁有者和內(nèi)存區(qū)域互相交織。這使得擁有者對(duì)內(nèi)存區(qū)域進(jìn)行邏輯劃分成為必要,該擁有者覆蓋當(dāng)前內(nèi)存區(qū)域并且能夠橫跨多個(gè)區(qū)域以正確記錄每個(gè)擁有者的使用。
內(nèi)存的擁有者基于內(nèi)存消費(fèi)者的邏輯劃分來(lái)定義。與解析器、計(jì)劃器、優(yōu)化器、調(diào)度器、查詢(xún)串行器和解串器、執(zhí)行器和各個(gè)進(jìn)程相關(guān)的代碼段由將相應(yīng)組件的源代碼儀表化的編程者識(shí)別,或者通過(guò)使用實(shí)現(xiàn)進(jìn)程向擁有者的映射的網(wǎng)關(guān)來(lái)識(shí)別,如本說(shuō)明書(shū)中其他處所述,或者由用于指定代碼到擁有者的關(guān)聯(lián)的任何其他便利技術(shù)來(lái)識(shí)別。然后,這些擁有者的內(nèi)存使用能夠被記錄在它們的對(duì)應(yīng)內(nèi)存賬戶(hù)中。擁有者的內(nèi)存使用能夠使用子內(nèi)存賬戶(hù)來(lái)進(jìn)一步與例如存儲(chǔ)、互連等的底層子系統(tǒng)的內(nèi)存使用分離。
跟蹤當(dāng)前擁有者:
一旦代碼基的開(kāi)發(fā)者確定主賬戶(hù)和子賬戶(hù)擁有者,開(kāi)發(fā)者就能夠利用它們相關(guān)聯(lián)的所有權(quán)信息來(lái)注釋不同的代碼區(qū)域。內(nèi)存管理器系統(tǒng)提供簡(jiǎn)單API,內(nèi)存用戶(hù)——即分配內(nèi)存的組件——能夠調(diào)用該API來(lái)標(biāo)注它們的所有權(quán)。例如,解析器在解析查詢(xún)之前能夠調(diào)用適當(dāng)API來(lái)告知內(nèi)存管理器系統(tǒng)解析代碼開(kāi)始。在解析進(jìn)程結(jié)束時(shí),其將調(diào)用另一函數(shù)來(lái)使內(nèi)存管理器系統(tǒng)了解解析所有權(quán)已結(jié)束。在這兩個(gè)調(diào)用之間,MUT將在解析器的內(nèi)存賬戶(hù)下記錄所有內(nèi)存分配和解除分配。注意,在解析期間另一擁有者有可能開(kāi)始分配內(nèi)存。使用層級(jí)內(nèi)存賬戶(hù)——例如計(jì)劃樹(shù)下的各個(gè)擁有者以及交織的所有權(quán)二者來(lái)改變所有權(quán),例如在嵌套循環(huán)——連接期間,兩個(gè)不同子操作器可以是重復(fù)訪問(wèn)內(nèi)存并且切換所有權(quán)。
跟蹤子賬戶(hù):
在子賬戶(hù)級(jí)別也支持內(nèi)存記賬。如果執(zhí)行器節(jié)點(diǎn)依賴(lài)于存儲(chǔ)來(lái)讀取元組,或者依賴(lài)于互連來(lái)發(fā)送元組,則其能夠決定獨(dú)立地記賬那些子系統(tǒng)的消費(fèi)。為了正確執(zhí)行,子系統(tǒng)內(nèi)存操作需要被單獨(dú)標(biāo)注。這么做的一個(gè)方式是調(diào)用內(nèi)存記賬API來(lái)在每個(gè)子系統(tǒng)調(diào)用時(shí)切換到適當(dāng)?shù)淖酉到y(tǒng)賬戶(hù)。但是,這樣的切換實(shí)現(xiàn)以及維持很昂貴。因此,自動(dòng)切換方法是優(yōu)選的。
自動(dòng)切換到適當(dāng)子賬戶(hù)的解決方案是基于文件和宏的子賬戶(hù)標(biāo)注的組合。每個(gè)文件被標(biāo)注有其邏輯擁有者:例如,存儲(chǔ)相關(guān)文件,或者互連相關(guān)文件等。每個(gè)代碼區(qū)域能夠在執(zhí)行時(shí)基于邏輯角色來(lái)承擔(dān)多個(gè)所有權(quán)角色。因此,諸如API和共享組件的公共數(shù)據(jù)結(jié)構(gòu)能夠在運(yùn)行時(shí)承擔(dān)不同所有權(quán)角色。
跟蹤內(nèi)存使用:
隨著擁有者分配內(nèi)存,MUT使用活動(dòng)內(nèi)存賬戶(hù)自動(dòng)檢測(cè)適當(dāng)?shù)膿碛姓卟⒏略摀碛姓哔~戶(hù)或子賬戶(hù)的余額以反映該新分配。對(duì)于解除分配,MUT從塊報(bào)頭識(shí)別塊的擁有者并且更新該擁有者的余額以反映解除分配。注意,分配和解除分配的所有權(quán)識(shí)別是不同的。盡管活動(dòng)內(nèi)存賬戶(hù)或其子賬戶(hù)中的一個(gè)承擔(dān)對(duì)于所有新分配的管控,但是在解除分配期間,其被歸于原始分配者,而不管當(dāng)前活動(dòng)的內(nèi)存賬戶(hù)如何。在分配和解除分配記錄期間,MUT還負(fù)責(zé)記錄全局內(nèi)存配額和全局內(nèi)存使用。
跟蹤違規(guī):
包括活動(dòng)內(nèi)存賬戶(hù)的每個(gè)內(nèi)存賬戶(hù),將具有基于擁有者的配額的內(nèi)存配額。查詢(xún)的內(nèi)存配額能夠由開(kāi)發(fā)者或管理者設(shè)置。操作器配額指派算法跨其操作器來(lái)分發(fā)查詢(xún)配額。使用操作器配額信息,MUT的分配記錄組件在內(nèi)存管理器向MUT通知分配請(qǐng)求時(shí)檢測(cè)任何配額違規(guī)。為了檢測(cè)這樣的違規(guī),MUT將首先使用上述的過(guò)程來(lái)識(shí)別適當(dāng)?shù)膿碛姓呒捌滟~戶(hù)。然后,MUT將通過(guò)該擁有者的總分配與該擁有者的配額進(jìn)行比較來(lái)檢測(cè)違規(guī)。一旦檢測(cè)到違規(guī),MUT將首先嘗試通過(guò)調(diào)用與特定擁有者相關(guān)聯(lián)的MUT的仲裁功能來(lái)解除分配內(nèi)存以回到內(nèi)存配額內(nèi)。MUT能夠使用其缺省仲裁功能來(lái)跨所有擁有者重新分發(fā)配額,或者各個(gè)擁有者能夠提供自定義回調(diào)以實(shí)現(xiàn)它們的配額減少過(guò)程。如果仲裁功能能夠釋放足夠內(nèi)存以回到配額內(nèi),則MUT忽略該違規(guī)。否則,MUT將使的新分配請(qǐng)求無(wú)效。
顯式釋放操作的施行:
基于區(qū)域的內(nèi)存管理器提供便利的對(duì)整個(gè)區(qū)域的成批釋放(即,該區(qū)域內(nèi)的所有分配被一次釋放)。但是,對(duì)于一些內(nèi)存區(qū)域——諸如我們頻繁分配大量?jī)?nèi)存的區(qū)域,對(duì)分配的顯式釋放操作確保及時(shí)釋放內(nèi)存。MUT能夠提供API來(lái)對(duì)需要對(duì)每個(gè)分配進(jìn)行顯式釋放操作的這樣的內(nèi)存區(qū)域進(jìn)行標(biāo)記。一旦被標(biāo)記,MUT就能夠禁用對(duì)這樣的內(nèi)存區(qū)域的分配的滾轉(zhuǎn)機(jī)制。然后,未顯式釋放的任何分配能夠被歸責(zé)于對(duì)其進(jìn)行分配的擁有者以協(xié)助診斷每擁有者的內(nèi)存泄漏。
組件設(shè)計(jì):所有權(quán)跟蹤器
具有包括分配、解除分配或使用的內(nèi)存操作的代碼區(qū)域能夠被劃分為不同的邏輯擁有者。此外,單個(gè)代碼區(qū)域能夠?qū)儆诙鄠€(gè)邏輯擁有者。例如,排序API能夠從排序操作器、排序-合并(Merge)-連接操作器或分組(Group)-聚合操作器使用。取決于擁有的操作器,排序API所作的分配可以承擔(dān)不同的所有權(quán)。
在執(zhí)行期間,我們還可以具有邏輯擁有者的多個(gè)實(shí)例化。例如,排序操作器能夠出現(xiàn)在計(jì)劃樹(shù)中的若干不同地方。排序操作器的這些實(shí)例中的每一個(gè)具有不同所有權(quán),即不同實(shí)例與相同邏輯擁有者類(lèi)型的不同擁有者相關(guān)聯(lián)。因此,精確的所有權(quán)能夠被指派給能夠出現(xiàn)若干次但操作為單獨(dú)實(shí)體的代碼段。相同類(lèi)型的不同擁有者能夠基于它們?cè)谟?jì)劃樹(shù)中的位置來(lái)被區(qū)分。這能夠例如通過(guò)在它們相應(yīng)的操作器狀態(tài)中保存內(nèi)存賬戶(hù)指針來(lái)完成。MUT能夠走查計(jì)劃樹(shù)以基于它們的相關(guān)計(jì)劃操作器來(lái)區(qū)分不同內(nèi)存賬戶(hù)。
在一個(gè)實(shí)施方式中,固定的子賬戶(hù)集合被維持在主賬戶(hù)下的固定大小的陣列中以供快速訪問(wèn)。例如,這在有用子賬戶(hù)的集合能夠被定義用于整個(gè)DBMS時(shí)是適當(dāng)?shù)?。維持子賬戶(hù)的任意集合的靈活的基于散列的實(shí)施方式也是可能的。
為了決定哪些代碼區(qū)域構(gòu)成特定擁有者,開(kāi)發(fā)者可以尋求簡(jiǎn)單文件集合。例如擁有者X構(gòu)成文件{Fi,Fj,Fk}。盡管基于文件集合的所有權(quán)可以為良好設(shè)計(jì)的系統(tǒng)工作,但是基于API的擁有者切換能夠超越其來(lái)定義具有任何代碼區(qū)域的邏輯擁有者。而且,如前所討論的,多態(tài)子賬戶(hù)確定能夠在運(yùn)行時(shí)決定適當(dāng)?shù)淖淤~戶(hù)。
每個(gè)擁有者將被鏈接到其所有權(quán)結(jié)構(gòu)(即內(nèi)存賬戶(hù)),例如通過(guò)指針來(lái)鏈接。指針的使用確保所有權(quán)的快速切換而無(wú)需任何查找延遲,例如在散列表中。所有權(quán)結(jié)構(gòu)的實(shí)際分配能夠位于專(zhuān)用區(qū)域中以確保適當(dāng)壽命以及清理,并且指向所有的所有權(quán)結(jié)構(gòu)的指針能夠使用所有權(quán)賬戶(hù)樹(shù)來(lái)全局地走查。此外,指向每個(gè)所有權(quán)結(jié)構(gòu)的指針能夠被保存在對(duì)應(yīng)的擁有者數(shù)據(jù)結(jié)構(gòu)中。例如,排序操作器將維持指向其關(guān)聯(lián)的內(nèi)存賬戶(hù)的指針。這樣,排序能夠快速切換所有權(quán)而無(wú)需在內(nèi)存賬戶(hù)樹(shù)中尋找其關(guān)聯(lián)的內(nèi)存賬戶(hù)。
4.設(shè)計(jì)細(xì)節(jié)
4.1內(nèi)存系統(tǒng)
圖1A示出實(shí)現(xiàn)所描述的內(nèi)存管理系系統(tǒng)的內(nèi)存系統(tǒng)的概述。內(nèi)存系統(tǒng)能夠包括多個(gè)節(jié)點(diǎn),類(lèi)似于圖1A中所示的節(jié)點(diǎn)。在一些實(shí)施方式中,每個(gè)節(jié)點(diǎn)包括一個(gè)或多個(gè)段,其對(duì)應(yīng)于節(jié)點(diǎn)上的一個(gè)或多個(gè)虛擬機(jī)。內(nèi)存系統(tǒng)能夠包括主節(jié)點(diǎn)和多個(gè)工作者節(jié)點(diǎn),其中主節(jié)點(diǎn)和每個(gè)工作者節(jié)點(diǎn)是在物理計(jì)算機(jī)主機(jī)上或物理計(jì)算機(jī)主機(jī)上的虛擬機(jī)上實(shí)現(xiàn)的。主節(jié)點(diǎn)能夠指派每個(gè)工作者節(jié)點(diǎn)(或者簡(jiǎn)稱(chēng)為“節(jié)點(diǎn)”)對(duì)存儲(chǔ)在內(nèi)存系統(tǒng)中的分值據(jù)中的一部分進(jìn)行操作。每個(gè)節(jié)點(diǎn)能夠包括節(jié)點(diǎn)內(nèi)存,并且節(jié)點(diǎn)內(nèi)存能夠由一個(gè)或多個(gè)查詢(xún)利用,諸如圖1A中所示的查詢(xún)(i)和(j)。每個(gè)查詢(xún)能夠涉及一個(gè)或多個(gè)進(jìn)程。如所述的,執(zhí)行查詢(xún)所需的進(jìn)程能夠基于所述的流程來(lái)確定,其中,解析器解析查詢(xún)并且計(jì)劃器計(jì)劃該查詢(xún)并產(chǎn)生包括與運(yùn)行查詢(xún)所需的進(jìn)程相對(duì)應(yīng)的擁有者的查詢(xún)計(jì)劃樹(shù)。
查詢(xún)中的每個(gè)進(jìn)程包括MM和MUT。MM,如所述的,可以是基于區(qū)域的內(nèi)存管理器或其他內(nèi)存管理器,其能夠處置分配請(qǐng)求和解除分配請(qǐng)求。MUT跟蹤查詢(xún)的進(jìn)程的內(nèi)存分配,其中與查詢(xún)的進(jìn)程相關(guān)聯(lián)的每個(gè)MUT具有查詢(xún)計(jì)劃樹(shù)的副本或者查詢(xún)計(jì)劃樹(shù)的相關(guān)部分的副本,定義執(zhí)行查詢(xún)所需的進(jìn)程。
查詢(xún)的進(jìn)程的MM中的每一個(gè)能夠訪問(wèn)節(jié)點(diǎn)內(nèi)存(圖1A中標(biāo)記為“公共內(nèi)存”),以執(zhí)行分配操作和解除分配操作。此外,節(jié)點(diǎn)內(nèi)存包括不同進(jìn)程的MUT通過(guò)其能夠通信并且能夠跟蹤在該節(jié)點(diǎn)上運(yùn)行的其他查詢(xún)的內(nèi)存使用的機(jī)制或渠道。在一些情況下,此通信機(jī)制或渠道能夠是共享內(nèi)存區(qū)域,其使得不同查詢(xún)的不同進(jìn)程的MUT能夠通信并且評(píng)估在節(jié)點(diǎn)上運(yùn)行的查詢(xún)的內(nèi)存使用狀態(tài)。此共享內(nèi)存區(qū)域能夠是圖1A中所示的條目的陣列,其中每個(gè)條目與特定查詢(xún)相對(duì)應(yīng)并且包括與該特定查詢(xún)相關(guān)的信息。例如,共享內(nèi)存中查詢(xún)細(xì)節(jié)的陣列中的每個(gè)條目能夠包括與查詢(xún)的狀態(tài)相關(guān)的信息,例如查詢(xún)的開(kāi)始時(shí)間、峰值內(nèi)存使用、當(dāng)前內(nèi)存使用、查詢(xún)內(nèi)存配額、查詢(xún)的終止優(yōu)先級(jí)——例如應(yīng)當(dāng)執(zhí)行的終止的順序、以及執(zhí)行查詢(xún)的工作者進(jìn)程的數(shù)目。此外,如果其被執(zhí)行,則共享內(nèi)存陣列中的每個(gè)條目能夠包括與查詢(xún)的終止?fàn)顟B(tài)相關(guān)的信息。例如,終止請(qǐng)求能夠包括:指示查詢(xún)是否應(yīng)當(dāng)終止的數(shù)據(jù)——例如標(biāo)志、指示何時(shí)作出終止查詢(xún)的確定的時(shí)間戳、識(shí)別終止請(qǐng)求進(jìn)程的信息、指示作出終止請(qǐng)求時(shí)的節(jié)點(diǎn)的空余內(nèi)存水平的數(shù)據(jù)、指示在發(fā)起終止之前終止進(jìn)程消費(fèi)了節(jié)點(diǎn)內(nèi)存中的多少等。
在節(jié)點(diǎn)上運(yùn)行的每個(gè)進(jìn)程能夠訪問(wèn)該通信機(jī)制——例如共享內(nèi)存,并且在一些實(shí)施方式中,能夠更新可經(jīng)由該通信機(jī)制訪問(wèn)的與一個(gè)或多個(gè)查詢(xún)相關(guān)聯(lián)的信息。例如,各個(gè)進(jìn)程的MUT能夠訪問(wèn)共享內(nèi)存上的查詢(xún)細(xì)節(jié)的陣列中的一個(gè)或多個(gè)條目并且能夠更新與那些條目相關(guān)聯(lián)的一個(gè)或多個(gè)查詢(xún)的信息。例如,查詢(xún)的特定進(jìn)程中的MUT能夠更新與另一查詢(xún)相關(guān)的陣列條目中的“應(yīng)當(dāng)終止”字段以指示該特定查詢(xún)應(yīng)當(dāng)被終止。在這樣的示例中,當(dāng)與應(yīng)當(dāng)被終止的特定查詢(xún)相關(guān)聯(lián)的特定進(jìn)程正在執(zhí)行時(shí),其能夠使用其MUT來(lái)訪問(wèn)共享內(nèi)存并確定其屬于的查詢(xún)應(yīng)當(dāng)終止。然后,該進(jìn)程能夠執(zhí)行操作,例如,通過(guò)和與查詢(xún)相關(guān)聯(lián)的查詢(xún)計(jì)劃調(diào)度器通信,以向調(diào)度器和/或與該查詢(xún)相關(guān)聯(lián)的其他進(jìn)程通報(bào)該查詢(xún)應(yīng)當(dāng)終止。被指令終止的查詢(xún)的終止進(jìn)程可以利用確定其應(yīng)當(dāng)終止并且執(zhí)行終止流程的其他方法。但是應(yīng)當(dāng)注意,確定查詢(xún)應(yīng)當(dāng)被終止的進(jìn)程和/或查詢(xún)調(diào)度器,不直接終止目標(biāo)查詢(xún)的進(jìn)程,因?yàn)檫@會(huì)阻止能夠干凈地退出進(jìn)程,例如當(dāng)進(jìn)程處于臨界部分時(shí)。
圖1A中所示的內(nèi)存系統(tǒng)形成本文所述的內(nèi)存管理器系統(tǒng)的基礎(chǔ),并且其操作附加地如下所述。圖8提供了對(duì)使用內(nèi)存管理器系統(tǒng)的內(nèi)存系統(tǒng)的其他功能的描述。
4.2分配進(jìn)程
圖1B示出針對(duì)進(jìn)程來(lái)分配內(nèi)存的流程。例如,結(jié)合查詢(xún)來(lái)執(zhí)行的進(jìn)程能夠請(qǐng)求新的內(nèi)存分配。內(nèi)存分配請(qǐng)求能夠由執(zhí)行該進(jìn)程的組件提供,例如需要內(nèi)存(例如進(jìn)程)的特定硬件或軟件組件。內(nèi)存分配能夠在與該進(jìn)程相關(guān)聯(lián)的MM處接收,如圖1B中步驟1所示。
在MM接收內(nèi)存分配請(qǐng)求時(shí),該MM要求來(lái)自MUT的許可來(lái)分配內(nèi)存。這是在圖1B的步驟2所指出的。為了確定分配是否能夠進(jìn)行,MUT首先確定是否存在與活動(dòng)擁有者——即進(jìn)程的內(nèi)存賬戶(hù)和/或子賬戶(hù)——相關(guān)聯(lián)的映射元素,諸如共享報(bào)頭或例如散列表的其他映射設(shè)備。
共享報(bào)頭或其他映射元素包括與特定擁有者相關(guān)聯(lián)的分配信息。因此,映射元素與特定內(nèi)存賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)。在圖1B中所示的實(shí)施方式中,共享報(bào)頭被維持在共享報(bào)頭列表中。每個(gè)共享報(bào)頭列表與特定代相關(guān)聯(lián),其中每一代對(duì)應(yīng)于內(nèi)存系統(tǒng)所處理的查詢(xún)。例如,圖1B中的共享報(bào)頭列表均與代1(“G1”)、代2(“G2”)、或代3(“G3”)相關(guān)聯(lián)。每個(gè)共享報(bào)頭列表包括一個(gè)或多個(gè)共享報(bào)頭,例如SH1到SHn,其中每個(gè)共享報(bào)頭對(duì)應(yīng)于特定內(nèi)存賬戶(hù)和/或子賬戶(hù)。在一些實(shí)施方式中,共享報(bào)頭被維持在二維或三維陣列中,或者諸如散列表的另一結(jié)構(gòu)中,其中共享報(bào)頭能夠根據(jù)代、活動(dòng)內(nèi)存區(qū)域、內(nèi)存賬戶(hù)、和/或內(nèi)存子賬戶(hù)來(lái)存儲(chǔ)。
因此,為了確定活動(dòng)擁有者內(nèi)存賬戶(hù)和/或子賬戶(hù)的共享報(bào)頭或其他映射元素是否存在,MUT確定當(dāng)前活動(dòng)擁有者,例如查詢(xún)計(jì)劃樹(shù)中的活動(dòng)擁有者。這是由圖1B的步驟3指示的。在圖1B的步驟4處,MUT還確定當(dāng)前代。當(dāng)前代可以被存儲(chǔ)在查詢(xún)計(jì)劃樹(shù)中,或者可以由MUT另外確定的。然后,MUT通過(guò)觀察映射——諸如所識(shí)別的代的共享報(bào)頭列表,并試圖在映射中定位映射元素——例如與在該代的共享報(bào)頭列表中的活動(dòng)擁有者的共享報(bào)頭,來(lái)確定活動(dòng)擁有者的映射元素——諸如共享報(bào)頭——是否存在。
如果沒(méi)有定位適當(dāng)映射元素,則MUT從MM中請(qǐng)求映射元素分配,如圖1B的步驟5所示。例如,MUT能夠請(qǐng)求MM分配新的共享報(bào)頭。該分配請(qǐng)求由MM如任何其他分配指令一樣來(lái)處理,使得該MM能夠針對(duì)共享報(bào)頭或其他映射元素來(lái)分配內(nèi)存并且返回新的共享報(bào)頭或?qū)⒃赜成涞組UT。MUT能夠從MM接收標(biāo)識(shí)新的映射元素的信息,并且MUT之后能夠更新該映射元素以包括與該映射元素相關(guān)的信息,例如共享報(bào)頭能夠利用識(shí)別與該共享報(bào)頭相關(guān)聯(lián)的代、與共享報(bào)頭相關(guān)聯(lián)的擁有者、內(nèi)存賬戶(hù)、和/或子賬戶(hù)、當(dāng)前內(nèi)存區(qū)域、和/或其他信息的信息來(lái)被初始化。
在圖1B的步驟6處,通過(guò)在共享報(bào)頭列表中定位適當(dāng)?shù)挠成湓?、或者通過(guò)如所述的定位新的映射元素,MUT已經(jīng)定位了活動(dòng)擁有者內(nèi)存賬戶(hù)和/或子賬戶(hù)的映射元素。
一旦MUT具有活動(dòng)擁有者內(nèi)存賬戶(hù)和/或子賬戶(hù)的映射元素,則MUT能夠確定是否為MM授予許可以處理在步驟1處所接收的分配請(qǐng)求。如果MUT批準(zhǔn)該請(qǐng)求,則MUT在步驟7處發(fā)送信息到MM以向MM授予處理分配請(qǐng)求的許可,并且還提供用于具有關(guān)于映射元素的信息的所分配內(nèi)存塊的映射信息。例如,MUT能夠提供向MM該信息,使得MM更新所分配的內(nèi)存塊報(bào)頭以包括指向適當(dāng)?shù)挠成湓氐闹羔槨?/p>
通過(guò)這樣做,內(nèi)存管理器系統(tǒng)能夠維持在例如映射元素中的對(duì)所分配內(nèi)存塊的映射,其中每個(gè)映射元素與特定擁有者內(nèi)存賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)。這樣的映射提供對(duì)內(nèi)存使用的更精確的跟蹤,還通過(guò)允許更快釋放內(nèi)存而優(yōu)化系統(tǒng),因?yàn)閮?nèi)存能夠通過(guò)識(shí)別與查詢(xún)的進(jìn)程相關(guān)聯(lián)的適當(dāng)映射元素而被釋放,并且在不需要走查每個(gè)內(nèi)存塊的情況下釋放與這些映射元素相關(guān)聯(lián)的所有塊。
如關(guān)于圖1B的步驟7所述,MUT確定是否批準(zhǔn)MM所提供的分配內(nèi)存的許可請(qǐng)求。評(píng)估MM所提供的許可請(qǐng)求的流程在圖2中更詳細(xì)描述。
圖2圖示了評(píng)估分配請(qǐng)求是否應(yīng)當(dāng)被處理的流程。在步驟202處,與圖1B的步驟2相對(duì)應(yīng),MUT從MM接收許可請(qǐng)求。在接收到許可請(qǐng)求后,MUT首先在步驟204處檢查是否存在該節(jié)點(diǎn)的低內(nèi)存狀況。例如,MUT能夠確定內(nèi)存使用是否處于臨界水平,例如80%或更高的可用節(jié)點(diǎn)內(nèi)存,或者節(jié)點(diǎn)是否遇到節(jié)點(diǎn)內(nèi)存被用盡的真OOM事件。如果MUT確定確實(shí)存在低內(nèi)存狀況,則MUT在步驟206處開(kāi)始全局仲裁進(jìn)程。該全局仲裁進(jìn)程在圖3中更詳細(xì)描述。
在步驟208處,MUT確定與分配請(qǐng)求相關(guān)聯(lián)的分配地點(diǎn)。例如,MUT能夠訪問(wèn)指示請(qǐng)求內(nèi)存的函數(shù)、文件、代碼區(qū)域等的信息?;诖_定與分配請(qǐng)求相關(guān)聯(lián)的分配地點(diǎn),MUT在步驟210處確定分配地點(diǎn)是否與已知邏輯擁有者相關(guān)聯(lián)。即,MUT確定在步驟208處確定的特定函數(shù)、文件或代碼區(qū)域是否與特定邏輯擁有者相關(guān)聯(lián)。作為示例,如果分配地點(diǎn)被識(shí)別為與排序進(jìn)程相關(guān)聯(lián),則MUT能夠確定排序進(jìn)程的邏輯擁有者是否已經(jīng)存在。如果MUT確實(shí)識(shí)別出與分配地點(diǎn)相關(guān)聯(lián)的邏輯擁有者,則MUT識(shí)別該邏輯擁有者,如步驟214所示。否則,如果MUT沒(méi)有識(shí)別與分配地點(diǎn)相關(guān)聯(lián)的邏輯擁有者,則MUT在步驟212使用函數(shù)映射、文件映射、或其他映射來(lái)識(shí)別與分配地點(diǎn)相關(guān)聯(lián)的邏輯擁有者。例如,文件“file.c”或者函數(shù)“readFile”可以屬于文件處置子系統(tǒng),并且被指派給該邏輯擁有者。在步驟216處,MUT確定了與分配地點(diǎn)相關(guān)聯(lián)的邏輯擁有者。
在邏輯擁有者被確定之后,MUT隨后在步驟218處檢查所識(shí)別的邏輯擁有者是否匹配活動(dòng)擁有者的邏輯擁有者。如果所確定的邏輯擁有者匹配該活動(dòng)擁有者的邏輯擁有者,則在步驟222處,與該活動(dòng)擁有者相關(guān)聯(lián)的內(nèi)存賬戶(hù)被識(shí)別為分配請(qǐng)求將被計(jì)入其的賬戶(hù)。否則,MUT確定所確定的邏輯擁有者的子賬戶(hù),并且在步驟220處使用該邏輯擁有者的所確定的子賬戶(hù)來(lái)作為分配請(qǐng)求將被計(jì)入的賬戶(hù)。因此,在步驟224處,MUT識(shí)別出分配請(qǐng)求將被計(jì)賬的內(nèi)存賬戶(hù)和/或子賬戶(hù),例如所識(shí)別的賬戶(hù)將具有分配請(qǐng)求,如果被處理則計(jì)入其配額。
在確定內(nèi)存賬戶(hù)和/或子賬戶(hù)后,MUT在步驟226處開(kāi)始配額驗(yàn)證器,其在步驟228處確定所識(shí)別的賬戶(hù)和/或子賬戶(hù)是否在規(guī)定的配額內(nèi)。如果賬戶(hù)和/或子賬戶(hù)不在配額內(nèi),或者在一些實(shí)施方式中接近超出其配額,則MUT能夠在步驟230處開(kāi)始本地仲裁進(jìn)程。該本地仲裁進(jìn)程進(jìn)一步在圖4中描述且能夠確定與所識(shí)別的內(nèi)存賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的查詢(xún)中的其他進(jìn)程中的內(nèi)存是否具有多余配額,使得該配額可以被重新分發(fā)給與所識(shí)別的賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的進(jìn)程。在執(zhí)行本地仲裁進(jìn)程之后,配額驗(yàn)證器能夠再次被用來(lái)確定賬戶(hù)和/或子賬戶(hù)是否在配額內(nèi)(例如通過(guò)返回步驟226)。
如果所識(shí)別的賬戶(hù)或子賬戶(hù)在配額內(nèi),則MUT執(zhí)行在圖5中描述的進(jìn)程以定位與賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的映射元素——例如共享報(bào)頭,并且分配所請(qǐng)求的內(nèi)存。這在圖2的步驟232處示出。
在分配完成之后,MUT執(zhí)行記賬操作以記錄該分配。在步驟234處,MUT在賬戶(hù)和/或子賬戶(hù)中記錄分配,并且還在映射元素例如共享報(bào)頭中記錄分配。例如,通過(guò)將賬戶(hù)和/或子賬戶(hù)中所指示的可用內(nèi)存配額減少所分配的內(nèi)存量,MUT能夠在賬戶(hù)和/或子賬戶(hù)中記錄分配。此外,通過(guò)添加信息以識(shí)別所分配的內(nèi)存塊或通過(guò)調(diào)整與映射元素相關(guān)聯(lián)的余額,MUT能夠在賬戶(hù)和/或子賬戶(hù)的映射元素中記錄分配。在步驟236處,MUT進(jìn)一步確定是否更新與共享內(nèi)存相關(guān)聯(lián)的信息(或者以其他方式可由每個(gè)查詢(xún)的進(jìn)程訪問(wèn)的信息)以記錄該分配,并且可能記錄還未記錄的其他先前的分配。由于訪問(wèn)共享內(nèi)存或使用MUT的其他通信機(jī)制是昂貴的、內(nèi)存密集型的進(jìn)程,在一些實(shí)施方式中,可以設(shè)置分配閾值以使得MUT僅在內(nèi)存的閾值量——例如1MB——被分配和/或解除分配時(shí)更新該信息。因此,共享內(nèi)存不以每個(gè)分配——例如當(dāng)內(nèi)存一次分配1KB時(shí)——來(lái)被更新,而是可以在足夠的內(nèi)存分配出現(xiàn)時(shí)定期更新,例如總計(jì)為1MB的1KB的1000個(gè)分配和/或解除分配。如果確定要更新共享內(nèi)存(或者可經(jīng)由通信機(jī)制訪問(wèn)的其他信息),則其在步驟238處執(zhí)行。
不管該信息是否被更新,圖2的進(jìn)程通過(guò)在步驟240處返回映射元素而結(jié)束。例如,MUT可以向MM返回與賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的共享報(bào)頭,使得分配的內(nèi)存塊報(bào)頭能夠被更新以標(biāo)識(shí)該共享報(bào)頭,例如指向該共享報(bào)頭的指針可以被添加到所分配塊的指針。
5.仲裁
圖2描述了能夠由內(nèi)存管理器系統(tǒng)執(zhí)行的兩種類(lèi)型的仲裁:全局和本地仲裁。全局仲裁被執(zhí)行以在節(jié)點(diǎn)遇到低內(nèi)存狀況或OOM事件時(shí)通過(guò)終止在節(jié)點(diǎn)上運(yùn)行的查詢(xún)來(lái)釋放節(jié)點(diǎn)內(nèi)存。本地仲裁被執(zhí)行以在特定進(jìn)程已經(jīng)或接近超過(guò)其內(nèi)存配額時(shí)在查詢(xún)的進(jìn)程當(dāng)中重新分發(fā)可用配額。如圖2中所示,本地仲裁在全局仲裁之后執(zhí)行,因?yàn)樵谶M(jìn)行檢查特定進(jìn)程有能力分配任何可用內(nèi)存之前,該分配必須首先確定是否有足夠節(jié)點(diǎn)內(nèi)存可用于分配。
5.1全局仲裁
返回到執(zhí)行圖2中所示的流程的全局仲裁的步驟206,圖3以更精細(xì)程度來(lái)圖示全局仲裁進(jìn)程。圖3的流程開(kāi)始于步驟206,其對(duì)應(yīng)于圖2中的全局仲裁進(jìn)程的開(kāi)始。MUT能夠開(kāi)始例如在共享內(nèi)存處對(duì)查詢(xún)逐個(gè)走查與運(yùn)行在節(jié)點(diǎn)上的查詢(xún)中的每一個(gè)相關(guān)聯(lián)的信息以確定查詢(xún)的內(nèi)存使用。如圖3中所示,例如,在步驟302處,MUT能夠訪問(wèn)共享內(nèi)存并開(kāi)始走查與查詢(xún)相對(duì)應(yīng)的條目的陣列。替選地,MUT能夠請(qǐng)求或指令所指定的對(duì)查詢(xún)進(jìn)行走查的進(jìn)程走查查詢(xún)并且返回每個(gè)查詢(xún)的內(nèi)存使用。無(wú)論如何,一次只有一個(gè)進(jìn)程的MUT或一個(gè)指定的走查進(jìn)程能夠走查與查詢(xún)相對(duì)應(yīng)的條目。由于MUT或其他指定的走查進(jìn)程遍歷條目來(lái)對(duì)查詢(xún)逐個(gè)地走查,在步驟304處,MUT或者指定的進(jìn)程確定是否在查詢(xún)信息中——例如在共享內(nèi)存中——識(shí)別更多條目,即查詢(xún)。如果有,則MUT在步驟306處確定或接收下一查詢(xún)的內(nèi)存使用。MUT或指定的走查進(jìn)程通過(guò)讀取查詢(xún)條目——例如共享內(nèi)存中的查詢(xún)狀態(tài)信息,來(lái)這樣做。例如,圖1A中所示的“當(dāng)前內(nèi)存”信息能夠指示查詢(xún)的當(dāng)前內(nèi)存使用。查詢(xún)的內(nèi)存使用等價(jià)于與該查詢(xún)相關(guān)聯(lián)的所有進(jìn)程的總內(nèi)存使用。
然后,MUT確定特定查詢(xún)的查詢(xún)回收因子(eviction factor)。該回收因子能夠被用來(lái)對(duì)節(jié)點(diǎn)上運(yùn)行的查詢(xún)進(jìn)行排序以確定在低內(nèi)存狀況或OOM事件的情況下回收——即終止查詢(xún)——的次序。為了確定特定查詢(xún)的回收因子,MUT能夠在步驟310處從回收策略提供者接收回收策略。回收策略能夠被用于基于在策略中闡述的參數(shù)和與可由MUT訪問(wèn)的查詢(xún)相關(guān)聯(lián)的內(nèi)存使用信息來(lái)確定查詢(xún)的回收因子。例如,回收因子能夠基于查詢(xún)的總內(nèi)存使用、查詢(xún)的壽命(短運(yùn)行或長(zhǎng)運(yùn)行)、查詢(xún)正在使用的內(nèi)存配額的百分比、查詢(xún)是否被識(shí)別為關(guān)鍵查詢(xún)、或者基于任何數(shù)目的其他因素。在確定特定查詢(xún)的回收因子之后,MUT能夠在步驟312處保存該回收因子。例如,特定查詢(xún)的回收因子能夠被保存在獨(dú)立的回收因子陣列中,能夠在與共享內(nèi)存中的特定查詢(xún)相對(duì)應(yīng)的條目上更新,或者能夠以其他方式來(lái)被存檔。然后,圖3中的流程通過(guò)確定任何其他查詢(xún)是否沒(méi)有被評(píng)估以確定其回收因子來(lái)重復(fù)該過(guò)程。
如果所有查詢(xún)已被評(píng)估,則在步驟314處,MUT確定回收的首要候選,例如應(yīng)當(dāng)首先被終止的查詢(xún)。然后,MUT執(zhí)行操作以向該查詢(xún)通報(bào)其應(yīng)當(dāng)終止自己。在一些實(shí)施方式中,這是通過(guò)設(shè)置與待被終止的查詢(xún)相對(duì)應(yīng)的共享內(nèi)存中的條目中的“應(yīng)當(dāng)終止”字段為“真”來(lái)被執(zhí)行的。待被終止的查詢(xún)的進(jìn)程能夠在稍后時(shí)間訪問(wèn)共享內(nèi)存并且基于“應(yīng)當(dāng)終止”字段來(lái)確定其查詢(xún)應(yīng)當(dāng)被終止。然后,進(jìn)程能夠向與查詢(xún)相關(guān)聯(lián)的查詢(xún)計(jì)劃調(diào)度器通報(bào)其進(jìn)程應(yīng)當(dāng)被終止,并且查詢(xún)能夠隨后通報(bào)該查詢(xún)的(在一個(gè)或多個(gè)節(jié)點(diǎn)中)進(jìn)程中的每一個(gè)以終止。然后,所有進(jìn)程隨著它們了解它們意圖要終止而自行終止,由此釋放它們的內(nèi)存以用于進(jìn)一步分配。
5.2本地仲裁
圖4示出用于執(zhí)行本地仲裁的流程,其確定在特定查詢(xún)內(nèi)是否存在可用內(nèi)存配額,并且如果有,則重新分發(fā)所允許的可用配額。重新分發(fā)的配額可能通常是與請(qǐng)求內(nèi)存分配的進(jìn)程相同的查詢(xún)中的一個(gè)或多個(gè)其他擁有者的配額。圖4所圖示的流程基于確定將針對(duì)內(nèi)存分配計(jì)帳的賬戶(hù)和/或子賬戶(hù)在其配額之外或臨界地接近超出其配額來(lái)被執(zhí)行。開(kāi)始于圖2的步驟230,圖4的流程通過(guò)初始化本地仲裁進(jìn)程而開(kāi)始。
在步驟402處,MUT確定與特定查詢(xún)相關(guān)聯(lián)的所有擁有者的總配額。在步驟404處,MUT還確定所有擁有者的總分配,即已經(jīng)與進(jìn)程中的擁有者中的每一個(gè)相關(guān)聯(lián)來(lái)分配的內(nèi)存總量。在一些實(shí)施方式中,這是基于訪問(wèn)擁有者內(nèi)存賬戶(hù)和/或子賬戶(hù)以確定由每個(gè)擁有者分配的總內(nèi)存來(lái)確定的。MUT匯總每個(gè)擁有者的內(nèi)存分配以獲得該擁有者的總內(nèi)存分配。
然后在步驟406處,關(guān)于是否存在任何過(guò)度配額以及是否可用于重新分發(fā)來(lái)作出決定。例如,MUT能夠確定所有擁有者的總內(nèi)存分配是否低于所有擁有者的總內(nèi)存配額。此外,在一些實(shí)施方式中,在步驟408處本地仲裁策略提供者能夠向MUT提供策略,或者M(jìn)UT能夠以其他方式確定策略,所述策略管控過(guò)度配額可以如何被重新分發(fā)用于特定擁有者。基于該策略,關(guān)于過(guò)度配額是否能夠被重新分發(fā)給超出其配額的內(nèi)存賬戶(hù)和/或子賬戶(hù)作出決定。如果過(guò)度配額不存在,或者如果策略阻止過(guò)度配額被重新分發(fā),則分配無(wú)法發(fā)生并且在步驟410處進(jìn)到分配失敗狀況。但是,如果存在過(guò)度配額且能夠被重新分發(fā),則在步驟412處,配額能夠被重新分發(fā)到將負(fù)責(zé)所請(qǐng)求內(nèi)存分配的賬戶(hù)和/或子賬戶(hù)。在一些實(shí)例中,這是通過(guò)更新受到配額重新分發(fā)影響的一個(gè)或多個(gè)擁有者的內(nèi)存賬戶(hù)和/或子賬戶(hù)來(lái)執(zhí)行的,以更新它們的相應(yīng)內(nèi)存配額。配額可以以可以便利于應(yīng)用的其他方式來(lái)被重新分發(fā)到其配額或臨界接近超出其配額的賬戶(hù)和/或子賬戶(hù)。在步驟414處,在配額被重新分發(fā)之后,MUT返回圖2的步驟226以檢查賬戶(hù)和/或子賬戶(hù)是否在配額內(nèi),以例如進(jìn)行內(nèi)存分配。
5.3定位并分配共享報(bào)頭
圖5示出用于確定賬戶(hù)和/或子賬戶(hù)的共享報(bào)頭是否存在,以及如果報(bào)頭不存在則分配賬戶(hù)和/或子賬戶(hù)的新的共享報(bào)頭的流程。圖5的過(guò)程對(duì)應(yīng)于圖2的步驟232。盡管在本文中關(guān)于使用共享報(bào)頭來(lái)映射內(nèi)存塊到特定擁有者的實(shí)施方式來(lái)進(jìn)行描述,將內(nèi)存映射到擁有者的其他方法可以利用相似過(guò)程來(lái)定位和/或分配內(nèi)存以用于映射元素或結(jié)構(gòu)。
在步驟502處,MUT已確定當(dāng)前代、當(dāng)前內(nèi)存區(qū)域(例如當(dāng)前內(nèi)存區(qū)域ID)、以及當(dāng)前內(nèi)存賬戶(hù)和/或子賬戶(hù)。MUT能夠確定該信息,例如在圖1B中所圖示的步驟3和步驟4。使用此信息,MUT能夠在步驟504處確定代、內(nèi)存區(qū)域、賬戶(hù)、和/或子賬戶(hù)的當(dāng)前組合的共享報(bào)頭(或者其他映射)是否存在。例如,MUT能夠通過(guò)訪問(wèn)共享報(bào)頭的散列表、訪問(wèn)特定共享報(bào)頭列表、在共享報(bào)頭的二維或三維陣列中查找特定共享報(bào)頭等,來(lái)試圖識(shí)別與當(dāng)前代、內(nèi)存區(qū)域、賬戶(hù)、和/或子賬戶(hù)相對(duì)應(yīng)的共享報(bào)頭。例如,圖1B示出存儲(chǔ)在共享報(bào)頭列表中的共享報(bào)頭,其由代來(lái)區(qū)分。
如果識(shí)別出與所識(shí)別的代、內(nèi)存區(qū)域、賬戶(hù)、和/或子賬戶(hù)相對(duì)應(yīng)的共享報(bào)頭,則在步驟516處返回該共享報(bào)頭,并且分配進(jìn)程能夠進(jìn)行。例如,內(nèi)存塊能夠由MM來(lái)分配,并且內(nèi)存塊報(bào)頭被更新以包括指向所返回的共享報(bào)頭的指針,而共享報(bào)頭能夠被更新以識(shí)別所分配的內(nèi)存塊。
如果沒(méi)有識(shí)別出與所識(shí)別的代、內(nèi)存區(qū)域、賬戶(hù)、和/或子賬戶(hù)相對(duì)應(yīng)的共享報(bào)頭,則流程前進(jìn)到步驟506,其中創(chuàng)建了新的共享報(bào)頭。例如,新的共享報(bào)頭能夠在共享報(bào)頭散列表、列表、或陣列中的適當(dāng)位置被創(chuàng)建。其他映射元素能夠被創(chuàng)建以記錄被所分配內(nèi)存向擁有者的映射。在步驟508處,用于共享報(bào)頭的內(nèi)存能夠由MM來(lái)分配。例如,MUT能夠請(qǐng)求MM分配用于新創(chuàng)建的共享報(bào)頭的當(dāng)前活動(dòng)內(nèi)存區(qū)域中的內(nèi)存,例如在圖1B的步驟5中。一旦新創(chuàng)建的共享報(bào)頭以及被分配,跟蹤所有共享報(bào)頭和/或塊報(bào)頭的匯總內(nèi)存使用的分配開(kāi)銷(xiāo)賬戶(hù)就能夠被更新以反映針對(duì)新的共享報(bào)頭所分配的內(nèi)存(步驟510)。MUT還能夠在步驟512處初始化新創(chuàng)建的共享報(bào)頭以包括與該共享報(bào)頭和/或其相關(guān)賬戶(hù)和/或子賬戶(hù)相關(guān)的信息。例如,共享報(bào)頭能夠被初始化以包括標(biāo)識(shí)當(dāng)前代、當(dāng)前內(nèi)存區(qū)域、和與共享報(bào)頭相關(guān)聯(lián)的賬戶(hù)和/或子賬戶(hù)的信息。如上所述,在共享報(bào)頭隨后被返回時(shí),在步驟514處,初始化的共享報(bào)頭被保存以用于賬戶(hù)和/或子賬戶(hù)的稍后的重用。盡管這里關(guān)于共享報(bào)頭進(jìn)行了描述,但是其他映射元素可以被類(lèi)似地初始化、在分配開(kāi)銷(xiāo)賬戶(hù)中被存檔、以及被保存以供重用。
6.釋放內(nèi)存
6.1釋放單個(gè)分配
圖6描述了釋放與內(nèi)存賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的內(nèi)存塊內(nèi)存,以及與釋放的內(nèi)存賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的共享報(bào)頭的過(guò)程。圖6的流程開(kāi)始于確定當(dāng)前代以及確定其關(guān)聯(lián)的內(nèi)存被釋放的共享報(bào)頭的代。當(dāng)前代可以使用例如類(lèi)似于圖1B的步驟4處所述的過(guò)程的過(guò)程來(lái)確定。映射元素——例如共享報(bào)頭——的代能夠通過(guò)訪問(wèn)該映射元素中的信息來(lái)被確定。例如,共享報(bào)頭的代能夠使用在圖5的步驟512處所述的初始化進(jìn)程期間被添加到共享報(bào)頭中的信息來(lái)確定。一旦當(dāng)前代和映射元素的代已經(jīng)被確定,在步驟606處MUT確定映射元素的代是否先于當(dāng)前代,例如共享報(bào)頭的代是否較老。如果映射元素的代較老,則MUT將長(zhǎng)壽命滾轉(zhuǎn)賬戶(hù)視為待釋放的內(nèi)存塊的擁有者,如步驟608處所示。但是,如果當(dāng)前代和映射元素的代匹配,則MUT將與映射元素相關(guān)聯(lián)的擁有者視為塊的擁有者,例如,與共享報(bào)頭相關(guān)聯(lián)的賬戶(hù)和/或子賬戶(hù)。這在圖6的步驟610處示出?;谠诓襟E606-610處作出的決定和后續(xù)決定,在步驟612處MUT確定基于內(nèi)存釋放而待調(diào)整的適當(dāng)內(nèi)存賬戶(hù)和/或子賬戶(hù)。
然后,在步驟614和616處,MUT將所確定的內(nèi)存賬戶(hù)和/或子賬戶(hù)的余額以及映射元素的余額調(diào)整所釋放的內(nèi)存量。在步驟618處,MUT確定映射元素的余額——例如共享報(bào)頭的余額——是否已經(jīng)減少到零,即與映射元素的賬戶(hù)和/或子賬戶(hù)相關(guān)聯(lián)的所有內(nèi)存是否已經(jīng)被釋放。如果該余額已經(jīng)被減少到零,則不再存在被分配用于映射元素的關(guān)聯(lián)的賬戶(hù)和/或子賬戶(hù)的任何內(nèi)存,并且在步驟620處,MUT能夠因此指令MM釋放映射元素內(nèi)存?;谠撚成湓亍绻蚕韴?bào)頭——被釋放,開(kāi)銷(xiāo)賬戶(hù)余額能夠在步驟622處被更新以將開(kāi)銷(xiāo)賬戶(hù)余額減少等于所釋放的映射元素的內(nèi)存使用的量。
不管映射元素是否被釋放,在步驟624處,確定是否更新例如共享內(nèi)存的節(jié)點(diǎn)上的進(jìn)程可訪問(wèn)的信息以反映所釋放的內(nèi)存,例如以更新共享內(nèi)存來(lái)指示等于自上一次共享內(nèi)存更新以來(lái)的所釋放內(nèi)存量的內(nèi)存量現(xiàn)在可用。如所述的,該確定能夠基于閾值分配或解除分配閾值量以阻止對(duì)該信息的不必要的訪問(wèn)和更新,所述信息是訪問(wèn)和/或更新的昂貴資源。如果更新節(jié)點(diǎn)上所有進(jìn)程可訪問(wèn)的信息的條件被滿(mǎn)足,則在步驟626處共享內(nèi)存被更新以反映自上次更新起的分配和/或解除分配——包括與內(nèi)存釋放相關(guān)聯(lián)的內(nèi)存解除分配。然后,在628處MUT能夠返回指示釋放進(jìn)程已成功完成的信息。
6.2成批釋放
圖7描述了執(zhí)行在單個(gè)流程中釋放內(nèi)存的特定區(qū)域上的所有內(nèi)存的成批釋放操作的過(guò)程。在整個(gè)內(nèi)存區(qū)域的釋放操作期間,MUT必須調(diào)整待被釋放的每一塊的對(duì)應(yīng)的擁有者的余額。MUT通過(guò)披露成批釋放API來(lái)優(yōu)化該調(diào)整,所述成批釋放API能夠走查與內(nèi)存區(qū)域相關(guān)聯(lián)的共享報(bào)頭的列表以快速調(diào)整在該內(nèi)存區(qū)域中分配內(nèi)存的所有擁有者的余額。這確保了許多擁有者的余額調(diào)整快速發(fā)生,而無(wú)需走查區(qū)域中每個(gè)內(nèi)存塊。
圖7的流程開(kāi)始于在步驟702處初始化成批釋放進(jìn)程并且開(kāi)始走查在正被釋放的內(nèi)存區(qū)域中的映射元素——例如共享報(bào)頭中的每一個(gè),而不管映射元素的代如何。例如,內(nèi)存區(qū)域的共享報(bào)頭能夠具有多個(gè)相關(guān)聯(lián)的代,并且MUT或?qū)S米卟檫M(jìn)程能夠走查這些共享報(bào)頭中的每一個(gè)。此流程在圖7的步驟704和706處示出。在步驟708處,MUT正在分析的——即在走查中的——當(dāng)前映射元素的代與當(dāng)前代進(jìn)行比較。這類(lèi)似于圖6中關(guān)于步驟606所描述的過(guò)程。類(lèi)似于MUT釋放流程,如果被評(píng)估的映射元素的代比當(dāng)前代更老,則在步驟710處,滾轉(zhuǎn)賬戶(hù)被視為是與內(nèi)存釋放相關(guān)聯(lián)的擁有者內(nèi)存賬戶(hù)。如果正在被評(píng)估的映射元素的代匹配當(dāng)前代,則在步驟712處,與該映射元素相關(guān)聯(lián)的賬戶(hù)和/或子賬戶(hù)被確定。因此,在步驟714處,MUT已經(jīng)識(shí)別了內(nèi)存釋放將與其相關(guān)聯(lián)的賬戶(hù)和/或子賬戶(hù)。
在識(shí)別賬戶(hù)和/或子賬戶(hù)后,MUT隨后將該賬戶(hù)和/或子賬戶(hù)的余額調(diào)整該映射元素所指示的全余額。例如,賬戶(hù)和/或子賬戶(hù)的余額能夠被調(diào)整適當(dāng)共享的報(bào)頭所指示的余額。由于特定內(nèi)存區(qū)域上的所有塊都被釋放,并且由于映射元素——例如共享報(bào)頭特定于特定內(nèi)存區(qū)域、代、以及賬戶(hù)和/或子賬戶(hù),因此映射元素的全余額能夠從在步驟714處識(shí)別的賬戶(hù)和/或子賬戶(hù)的內(nèi)存余額扣減。此扣減發(fā)生在圖7的步驟716處。其后,由于映射元素的余額已經(jīng)被有效減少到0,因此在步驟718處MUT能夠請(qǐng)求MM釋放共享報(bào)頭。除了請(qǐng)求映射元素的內(nèi)存被釋放以外,MUT還能夠在步驟720處減少分配開(kāi)銷(xiāo)賬戶(hù)余額以反映映射元素的內(nèi)存的釋放。如所述的,分配開(kāi)銷(xiāo)賬戶(hù)余額能夠被減少等于映射元素——例如共享報(bào)頭的內(nèi)存使用的量。類(lèi)似于圖6的步驟624和626處所述的過(guò)程,然后MUT能夠在步驟722處確定是否更新由節(jié)點(diǎn)上的所有進(jìn)程可訪問(wèn)的信息,例如共享內(nèi)存,以反映映射元素的釋放和/或先前與所釋放的映射元素相關(guān)聯(lián)的所釋放的內(nèi)存塊。如果是,則在步驟724處,MUT更新信息,例如共享內(nèi)存。
然后,步驟726確定在未被釋放的特定內(nèi)存區(qū)域中是否存在剩余映射元素——例如其他共享報(bào)頭,并且如果存在,則返回步驟706以重復(fù)圖7的流程的相關(guān)部分。無(wú)論代以及賬戶(hù)和/或子賬戶(hù)如何,如果內(nèi)存區(qū)域的所有映射元素,已經(jīng)被釋放,則區(qū)域的所有內(nèi)存塊也被釋放,并且過(guò)程能夠在步驟728處通過(guò)返回成批釋放流程成功的指示而結(jié)束。
7.內(nèi)存系統(tǒng)
圖8是示例系統(tǒng)810的圖。系統(tǒng)810圖示了數(shù)據(jù)庫(kù)管理系統(tǒng)810,在其上能夠?qū)崿F(xiàn)本說(shuō)明書(shū)中描述的創(chuàng)新技術(shù)。
在系統(tǒng)810中,數(shù)據(jù)是跨多個(gè)存儲(chǔ)設(shè)備的分布式數(shù)據(jù)。節(jié)點(diǎn)814a到814n能夠通過(guò)與能夠是例如Hadoop文件系統(tǒng)(HDFS)的底層存儲(chǔ)系統(tǒng)通信來(lái)訪問(wèn)數(shù)據(jù),所述節(jié)點(diǎn)在有必要將與主節(jié)點(diǎn)進(jìn)行區(qū)分時(shí)能夠被稱(chēng)作工作者節(jié)點(diǎn)。數(shù)據(jù)能夠被復(fù)制——即數(shù)據(jù)的完全相同的副本能夠被存儲(chǔ)在多個(gè)存儲(chǔ)設(shè)備上,或者被劃分——即數(shù)據(jù)的不同部分能夠被存儲(chǔ)在多個(gè)存儲(chǔ)設(shè)備上。例如,數(shù)據(jù)部分能夠是大規(guī)模并行處理(MPP)數(shù)據(jù)庫(kù)的表劃分。
系統(tǒng)810包括主節(jié)點(diǎn)812和多個(gè)工作者節(jié)點(diǎn)814a、814b、至814n。主節(jié)點(diǎn)812和每個(gè)工作者節(jié)點(diǎn)814a-n被實(shí)現(xiàn)為物理計(jì)算機(jī)主機(jī)或物理計(jì)算機(jī)主機(jī)上的虛擬機(jī)。主節(jié)點(diǎn)812指派每個(gè)工作者節(jié)點(diǎn)以對(duì)存儲(chǔ)在第一系統(tǒng)810中的數(shù)據(jù)的部分進(jìn)行操作。
例如,如所圖示的,系統(tǒng)810包括被指派為對(duì)第一數(shù)據(jù)庫(kù)表的第一分區(qū)816a進(jìn)行操作的第一工作者節(jié)點(diǎn)814a。類(lèi)似地,第二工作者節(jié)點(diǎn)814b被指派對(duì)第一數(shù)據(jù)庫(kù)表格的第二分區(qū)816b進(jìn)行操作。系統(tǒng)810能夠包括任意數(shù)目N的工作者節(jié)點(diǎn),一直到工作者節(jié)點(diǎn)814n——其被指派來(lái)對(duì)第一數(shù)據(jù)庫(kù)表的第N分區(qū)進(jìn)行操作。
多個(gè)用戶(hù)設(shè)備能夠訪問(wèn)系統(tǒng)810。用戶(hù)設(shè)備802的用戶(hù)能夠通過(guò)與主節(jié)點(diǎn)812通信來(lái)訪問(wèn)系統(tǒng)810中存儲(chǔ)的數(shù)據(jù)。主節(jié)點(diǎn)812與工作者節(jié)點(diǎn)814a-814n協(xié)調(diào)以響應(yīng)來(lái)自用戶(hù)設(shè)備802的對(duì)于數(shù)據(jù)的請(qǐng)求。用戶(hù)設(shè)備802能夠向主節(jié)點(diǎn)812發(fā)布查詢(xún),例如以結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL)中或?qū)ο蟛樵?xún)語(yǔ)言(OQL)的查詢(xún)。主節(jié)點(diǎn)812與工作者節(jié)點(diǎn)814a-814n通信以獲得滿(mǎn)足該查詢(xún)的數(shù)據(jù)。主節(jié)點(diǎn)812能夠維持提供數(shù)據(jù)部分與被指派來(lái)對(duì)該數(shù)據(jù)部分進(jìn)行操作的工作者節(jié)點(diǎn)之間的映射的系統(tǒng)目錄。系統(tǒng)810能夠訪問(wèn)其他外部系統(tǒng)上存儲(chǔ)的數(shù)據(jù)。
當(dāng)主節(jié)點(diǎn)812接收查詢(xún)時(shí),主節(jié)點(diǎn)812解析該查詢(xún)并生成查詢(xún)計(jì)劃。查詢(xún)計(jì)劃定義主機(jī)節(jié)點(diǎn)812將向工作者節(jié)點(diǎn)分發(fā)以履行查詢(xún)的操作。主節(jié)點(diǎn)812能夠訪問(wèn)系統(tǒng)目錄并執(zhí)行成本估計(jì)和優(yōu)化算法以確定減少成本的查詢(xún)計(jì)劃,例如履行查詢(xún)的所需處理時(shí)間和網(wǎng)絡(luò)帶寬。主節(jié)點(diǎn)812的功能可以由執(zhí)行不同功能——例如查詢(xún)解析器812a和查詢(xún)計(jì)劃器812b的多個(gè)軟件模塊來(lái)實(shí)現(xiàn)。
除了所附權(quán)利要求書(shū)的實(shí)施例和上述的實(shí)施例,以下的所編號(hào)的實(shí)施例也是創(chuàng)新的:
實(shí)施例1是一種裝置,包括:
計(jì)算機(jī)系統(tǒng),包括一個(gè)或多個(gè)操作地互連的主機(jī),每個(gè)主機(jī)包括計(jì)算機(jī)和一個(gè)或多個(gè)存儲(chǔ)設(shè)備,所述存儲(chǔ)設(shè)備存儲(chǔ)指令,所述指令可操作以在所述一個(gè)或多個(gè)主機(jī)上被執(zhí)行時(shí),使得所述一個(gè)或多個(gè)主機(jī)在計(jì)算機(jī)系統(tǒng)的節(jié)點(diǎn)中運(yùn)行的多個(gè)進(jìn)程中的每一個(gè)中實(shí)現(xiàn)內(nèi)存使用跟蹤器(MUT)的實(shí)例,所述內(nèi)存使用跟蹤器的每個(gè)實(shí)例可操作以對(duì)該實(shí)例在其上運(yùn)行的進(jìn)程執(zhí)行以下操作:
對(duì)于運(yùn)行在該進(jìn)程上的多個(gè)擁有者中的每一個(gè)維持內(nèi)存使用的賬戶(hù),每個(gè)擁有者是邏輯擁有者的實(shí)例,每個(gè)邏輯擁有者是與公共功能相關(guān)聯(lián)的代碼的一個(gè)或多個(gè)區(qū)域的集合;
確定每個(gè)擁有者的實(shí)際內(nèi)存配額;以及
對(duì)于每個(gè)擁有者來(lái)施行該擁有者的實(shí)際內(nèi)存配額,包括:
接收每個(gè)擁有者所作出的對(duì)于內(nèi)存的每個(gè)分配請(qǐng)求;
相對(duì)該擁有者的實(shí)際配額來(lái)檢查每個(gè)分配請(qǐng)求和該擁有者的賬戶(hù)的當(dāng)前狀態(tài);
批準(zhǔn)或拒絕每個(gè)分配請(qǐng)求,并且將所述批準(zhǔn)或拒絕傳輸?shù)降讓觾?nèi)存管理器;以及
對(duì)于每個(gè)所批準(zhǔn)的分配請(qǐng)求,更新該擁有者的賬戶(hù)。
實(shí)施例2是實(shí)施例1所述的介質(zhì),其中,對(duì)于每個(gè)擁有者施行該擁有者的實(shí)際內(nèi)存配額進(jìn)一步包括:
接收一個(gè)或多個(gè)解除分配請(qǐng)求以對(duì)先前由擁有者分配的內(nèi)存解除分配,并且對(duì)于每個(gè)解除分配請(qǐng)求:
識(shí)別先前分配該內(nèi)存的擁有者;以及
更新該擁有者的賬戶(hù)。
實(shí)施例3是實(shí)施例2所述的介質(zhì),其中,所述操作進(jìn)一步包括:
從內(nèi)存使用跟蹤器所維持的、從所分配的內(nèi)存單元映射到進(jìn)行分配的擁有者的映射中識(shí)別先前分配該內(nèi)存的擁有者。
實(shí)施例4是實(shí)施例1-3中任一項(xiàng)所述的介質(zhì),其中,所述操作進(jìn)一步包括:
對(duì)于一個(gè)或多個(gè)多態(tài)擁有者中的每一個(gè)維持內(nèi)存使用的子賬戶(hù),每個(gè)多態(tài)擁有者是多態(tài)邏輯擁有者的實(shí)例,每個(gè)多態(tài)邏輯擁有者是與公共功能相關(guān)聯(lián)的代碼的一個(gè)或多個(gè)區(qū)域的集合,每個(gè)多態(tài)擁有者針對(duì)相應(yīng)的擁有者來(lái)運(yùn)行;以及
將針對(duì)擁有者運(yùn)行的多態(tài)擁有者所作的任何分配請(qǐng)求計(jì)入該擁有者的賬戶(hù)以及該多態(tài)擁有者的子賬戶(hù)。
實(shí)施例5是實(shí)施例1-4中任一項(xiàng)所述的介質(zhì),其中
所述一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì)是非暫時(shí)性的;
所述多個(gè)邏輯擁有者包括作為代碼的多個(gè)非毗連區(qū)域的集合的邏輯擁有者;
初始地確定每個(gè)擁有者的實(shí)際內(nèi)存配額作為該邏輯擁有者的邏輯內(nèi)存配額;以及
所述底層內(nèi)存管理器是基于區(qū)域的內(nèi)存管理器。
實(shí)施例6是實(shí)施例1-5中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
接收表示每個(gè)邏輯擁有者的邏輯內(nèi)存配額的數(shù)據(jù);以及
根據(jù)對(duì)應(yīng)的邏輯擁有者的邏輯內(nèi)存配額,確定每個(gè)擁有者的實(shí)際內(nèi)存配額。
實(shí)施例7是實(shí)施例6中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
在具有長(zhǎng)壽命分配的賬戶(hù)和任何子賬戶(hù)的原始擁有者已經(jīng)終止之后,將所有權(quán)從所述原始擁有者切換至滾轉(zhuǎn)賬戶(hù)。
實(shí)施例8是實(shí)施例1-6中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
當(dāng)包括多個(gè)邏輯擁有者的程序的壽命的新分區(qū)開(kāi)始時(shí),根據(jù)劃分該壽命的邏輯執(zhí)行模型來(lái)將所有權(quán)從賬戶(hù)和任何子賬戶(hù)的原始擁有者切換至滾轉(zhuǎn)賬戶(hù)。
實(shí)施例9是實(shí)施例1-5中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
接收表示查詢(xún)計(jì)劃樹(shù)的數(shù)據(jù),所述查詢(xún)計(jì)劃樹(shù)是SQL查詢(xún)的SQL查詢(xún)計(jì)劃的一部分,所述查詢(xún)計(jì)劃樹(shù)包括表示SQL操作器的操作器節(jié)點(diǎn)元素和表示非SQL操作器的非操作器節(jié)點(diǎn)元素;以及
根據(jù)與所述查詢(xún)計(jì)劃樹(shù)相對(duì)應(yīng)的賬戶(hù)樹(shù)結(jié)構(gòu)來(lái)維持每個(gè)擁有者的內(nèi)存使用的賬戶(hù),其中,每個(gè)擁有者具有邏輯擁有者,該邏輯擁有者具有執(zhí)行所述查詢(xún)計(jì)劃樹(shù)的對(duì)應(yīng)操作器節(jié)點(diǎn)元素的操作的代碼。
實(shí)施例10是實(shí)施例9所述的介質(zhì),其中,所述操作進(jìn)一步包括:
接收表示所述查詢(xún)計(jì)劃樹(shù)中的每個(gè)操作器節(jié)點(diǎn)元素的初始內(nèi)存配額的數(shù)據(jù);以及
根據(jù)所述查詢(xún)計(jì)劃樹(shù)中的對(duì)應(yīng)的操作器節(jié)點(diǎn)元素的初始內(nèi)存配額,確定每個(gè)擁有者的實(shí)際內(nèi)存配額。
實(shí)施例11是實(shí)施例10所述的介質(zhì),其中,所述操作進(jìn)一步包括:
接收針對(duì)相同的SQL操作器具有帶有不同初始內(nèi)存配額的多個(gè)操作器節(jié)點(diǎn)元素的查詢(xún)計(jì)劃樹(shù)。
實(shí)施例12是實(shí)施例9-11中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
在所述查詢(xún)計(jì)劃樹(shù)的操作已經(jīng)終止之后,將所有權(quán)從具有長(zhǎng)壽命分配的賬戶(hù)和任何子賬戶(hù)的原始擁有者切換到滾轉(zhuǎn)賬戶(hù)。
實(shí)施例13是實(shí)施例9-11中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
當(dāng)SQL查詢(xún)終止時(shí),將所有權(quán)從賬戶(hù)和任何子賬戶(hù)的原始擁有者切換到滾轉(zhuǎn)賬戶(hù)。
實(shí)施例14是實(shí)施例1-8中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
從在所述計(jì)算機(jī)系統(tǒng)的與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的節(jié)點(diǎn)中運(yùn)行的一個(gè)或多個(gè)其他內(nèi)存使用跟蹤器實(shí)例獲得內(nèi)存使用數(shù)據(jù);
檢測(cè)影響在所述計(jì)算機(jī)系統(tǒng)的與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的節(jié)點(diǎn)中運(yùn)行的全部的所述多個(gè)進(jìn)程的低內(nèi)存狀況;以及
從由在所述相同的節(jié)點(diǎn)中運(yùn)行的全部的內(nèi)存使用跟蹤器實(shí)例跟蹤的擁有者當(dāng)中識(shí)別特定擁有者作為應(yīng)當(dāng)被終止的擁有者。
實(shí)施例15是實(shí)施例14所述的介質(zhì),所述操作進(jìn)一步包括:
當(dāng)所述特定擁有者運(yùn)行在與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的進(jìn)程中時(shí),終止所述特定擁有者。
實(shí)施例16是實(shí)施例1-8中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
從在所述計(jì)算機(jī)系統(tǒng)的與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的節(jié)點(diǎn)中運(yùn)行的一個(gè)或多個(gè)其他內(nèi)存使用跟蹤器實(shí)例中獲得每任務(wù)內(nèi)存使用數(shù)據(jù);
檢測(cè)影響在所述計(jì)算機(jī)系統(tǒng)的與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的節(jié)點(diǎn)中運(yùn)行的全部的所述多個(gè)進(jìn)程的低內(nèi)存狀況;
確定所述多個(gè)進(jìn)程中執(zhí)行的多個(gè)更高級(jí)別任務(wù)中的每一個(gè)的匯總內(nèi)存使用和匯總配額,其中,所述更高級(jí)別任務(wù)中的每一個(gè)包括一個(gè)或多個(gè)擁有者;
基于所述任務(wù)中的每一個(gè)的所述匯總內(nèi)存使用和所述匯總配額之間的關(guān)系來(lái)確定該任務(wù)的分值;
選擇具有最差分值的特定任務(wù)作為待終止的任務(wù);以及
當(dāng)所述特定任務(wù)在與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的進(jìn)程中運(yùn)行時(shí),終止所述特定任務(wù)。
實(shí)施例17是實(shí)施例16所述的介質(zhì),其中:
獲得內(nèi)存使用數(shù)據(jù)包括獲得每任務(wù)內(nèi)存使用數(shù)據(jù),
實(shí)施例18是實(shí)施例9-17中任何一項(xiàng)的介質(zhì),所述操作進(jìn)一步包括:
從在所述計(jì)算機(jī)系統(tǒng)的與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的節(jié)點(diǎn)中運(yùn)行的一個(gè)或多個(gè)其他內(nèi)存使用跟蹤器實(shí)例中獲得每查詢(xún)內(nèi)存使用數(shù)據(jù);
檢測(cè)影響在所述計(jì)算機(jī)系統(tǒng)的與所述內(nèi)存使用跟蹤器的所述實(shí)例相同的節(jié)點(diǎn)中運(yùn)行的全部的所述多個(gè)進(jìn)程的低內(nèi)存狀況;
確定在所述多個(gè)進(jìn)程中執(zhí)行的多個(gè)SQL查詢(xún)中的每一個(gè)的匯總內(nèi)存使用和匯總配額,其中,所述SQL查詢(xún)中的每一個(gè)包括一個(gè)或多個(gè)擁有者;以及
從由在所述相同的節(jié)點(diǎn)中運(yùn)行的全部的內(nèi)存使用跟蹤器實(shí)例跟蹤的查詢(xún)當(dāng)中識(shí)別特定SQL查詢(xún)作為應(yīng)當(dāng)被終止的特定SQL查詢(xún)。
實(shí)施例19是實(shí)施例18所述的介質(zhì),所述操作進(jìn)一步包括:
確定所述特定SQL查詢(xún)的一部分正運(yùn)行在所述多個(gè)進(jìn)程中所包括的特定進(jìn)程上,以及終止正運(yùn)行在所述特定進(jìn)程上的所述特定SQL查詢(xún)的所述一部分。
實(shí)施例20是實(shí)施例19所述的介質(zhì),所述操作進(jìn)一步包括:
通知運(yùn)行所述特定SQL查詢(xún)的部分的全部的其他進(jìn)程以終止它們相應(yīng)的所述特定SQL查詢(xún)的部分。
實(shí)施例21是實(shí)施例1-20中任一項(xiàng)所述的介質(zhì),所述操作進(jìn)一步包括:
通過(guò)響應(yīng)于擁有者超出其實(shí)際內(nèi)存配額而調(diào)整運(yùn)行在進(jìn)程上的擁有者的實(shí)際內(nèi)存配額,來(lái)在擁有者當(dāng)中進(jìn)行仲裁。
實(shí)施例22是一個(gè)或多個(gè)計(jì)算機(jī)存儲(chǔ)介質(zhì),編碼有計(jì)算機(jī)程序指令,所述計(jì)算機(jī)程序指令在被一個(gè)或多個(gè)計(jì)算機(jī)執(zhí)行時(shí),使得所述一個(gè)或多個(gè)計(jì)算機(jī)在計(jì)算機(jī)系統(tǒng)的節(jié)點(diǎn)中運(yùn)行的多個(gè)進(jìn)程中的每一個(gè)中實(shí)現(xiàn)內(nèi)存使用跟蹤器(MUT)的實(shí)例,所述內(nèi)存使用跟蹤器的每個(gè)實(shí)例可操作以對(duì)該示例在其上運(yùn)行的進(jìn)程執(zhí)行實(shí)施例1-21中任一項(xiàng)所述的操作。
實(shí)施例23是一種方法,其包括執(zhí)行在實(shí)施例1-21中任何一項(xiàng)所述的操作。