Memory Architecture
03/02/2023
Last updated
Was this helpful?
03/02/2023
Last updated
Was this helpful?
Ignite bellek mimarisi, verilerin ve indexlerin hem bellekte hem de diskte depolanmasÄąna ve iÅlenmesine olanak tanÄąr ve diskin dayanÄąklÄąlÄąÄÄą(durability) ile bellek içi performans elde edilmesine yardÄąmcÄą olur.
Ãok katmanlÄą(multi-tiered) depolama, Linux gibi iÅletim sistemlerinin sanal belleÄine benzer Åekilde çalÄąÅÄąr. Bu iki mimari tÞrÞ arasÄąndaki Ãķnemli bir fark, çok katmanlÄą depolama, diski her zaman verilerin Þst kÞmesi olarak ele alÄąr (persistence etkinse), yani çÃķkmelere ve yeniden baÅlatmalara karÅÄą hayatta kalabilir. Sanal bellek ise diski, process durduÄunda silinen bir swap olarak kullanÄąr.
Ãok katmanlÄą mimari, sabit boyutlu sayfalara(page) bÃķlÞnmÞÅ, sayfa tabanlÄą bir bellek mimarisidir. Sayfalar, RAM'de (Java heap dÄąÅÄąnda) yÃķnetilen off-heap bÃķlgelerde depolanÄąr ve diskte Ãķzel bir hiyerarÅide dÞzenlenir.
Ignite, hem bellekte hem de diskte aynÄą binary veri yapÄąsÄąnÄą korur. Bu, verileri bellek ve disk arasÄąnda taÅÄąrken maliyetli bir iÅlem olan serialization iÅlemi ihtiyacÄąnÄą ortadan kaldÄąrÄąr.
AÅaÄÄądaki resim, çok katmanlÄą depolamanÄąn mimarisini gÃķstermektedir.
Her data region(veri bÃķlgesi) bir baÅlangÄąÃ§ boyutuyla baÅlar ve bÞyÞyebileceÄi maksimum bir boyuta sahiptir. Region, sÞrekli bellek bÃķlÞmleri tahsis ederek maksimum boyutuna geniÅler.
Bellek segmenti, iÅletim sisteminden ayrÄąlan sÞrekli bir bayt dizisi veya fiziksel bellektir. Dizi, sabit boyutlu sayfalara bÃķlÞnmÞÅtÞr. AÅaÄÄądaki resimde gÃķsterildiÄi gibi, segmentte yer alabilen birkaç sayfa tÞrÞ vardÄąr.
Bir veri sayfasÄą, uygulama tarafÄąndan cachelere koyulan giriÅleri saklar. Genellikle tek bir veri sayfasÄą, belleÄi olabildiÄince verimli kullanmak ve bellek parçalanmasÄąnÄą Ãķnlemek için birden çok key/value giriÅi içerir. Cacheâe yeni bir giriÅ eklendiÄinde, Ignite tÞm key/value giriÅinin sÄąÄabileceÄi en uygun sayfayÄą arar. Ancak, bir giriÅin toplam boyutu DataStorageConfiguration.setPageSize(..)
ÃķzelliÄi aracÄąlÄąÄÄąyla yapÄąlandÄąrÄąlan sayfa boyutunu aÅarsa, giriÅ birden fazla veri sayfasÄąnÄą kaplar.
Tek bir sayfaya sÄąÄmayan birçok cache giriÅi varsa, sayfa boyutu yapÄąlandÄąrma parametresini artÄąrmak mantÄąklÄądÄąr.
Bir gÞncelleme sÄąrasÄąnda bir giriÅ boyutu, veri sayfasÄąnda bulunan boÅ alanÄąn Ãķtesine geniÅlerse, Ignite, gÞncellenmiÅ giriÅi almak için yeterli alana sahip yeni bir veri sayfasÄą arar ve giriÅi oraya taÅÄąr.
Ignite, otomatik olarak bellek birleÅtirme(memory defragmentation) gerçekleÅtirir. Zaman içinde, tek bir veri sayfasÄą farklÄą CRUD iÅlemleriyle birden çok kez gÞncellenebilir. Bu, sayfanÄąn ve tÞm belleÄin parçalanmasÄąna(fragmantation) yol açabilir. Bellek parçalanmasÄąnÄą en aza indirmek için Ignite, bir sayfa çok parçalÄą hale geldiÄinde sayfa sÄąkÄąÅtÄąrmayÄą(page compaction) kullanÄąr.
SÄąkÄąÅtÄąrÄąlmÄąÅ bir veri sayfasÄą aÅaÄÄądaki resimdeki gibi gÃķrÞnÞr:
Sayfa, internal kullanÄąm için gerekli bilgileri depolayan bir header
âa sahiptir. TÞm key/value giriÅleri her zaman saÄdan sola eklenir. Resimde, sayfada saklanan Þç giriÅ (sÄąrasÄąyla 1, 2 ve 3) vardÄąr. Bu giriÅlerin farklÄą boyutlarÄą olabilir.
Girdilerin sayfa içindeki konumlarÄąna yapÄąlan offset
'ler (veya referanslar) soldan saÄa saklanÄąr ve her zaman sabit boyuttadÄąr. Offsetler, bir sayfadaki key/value giriÅlerini aramak için iÅaretçiler olarak kullanÄąlÄąr.
Ortadaki boÅluk boÅ bir alandÄąr(free space) ve kÞmeye daha fazla veri gÃķnderildiÄinde doldurulur.
Zamanla 2. giriÅin kaldÄąrÄąldÄąÄÄąnÄą ve bunun da sayfada sÞrekli olmayan bir boÅ alana neden olduÄunu varsayalÄąm:
ParçalanmÄąÅ(fragmanted) bir sayfa bÃķyle gÃķrÞnÞr. Bununla birlikte, sayfada bulunan tÞm boÅ alana ihtiyaç duyulduÄunda veya bir miktar parçalanma eÅiÄine(fragmentation threshold) ulaÅÄąldÄąÄÄąnda, sÄąkÄąÅtÄąrma(compaction) iÅlemi sayfayÄą birleÅtirerek yukarÄądaki ilk resimde gÃķsterilen, boÅ alanÄąn sÞrekli olduÄu duruma getirir. Bu iÅlem otomatiktir ve kullanÄącÄą tarafÄąndan herhangi bir iÅlem yapÄąlmasÄąnÄą gerektirmez.
Ignite, bir cache veya cache grubu için kullanÄąlabilen RAM miktarÄąnÄą kontrol etmek için veri bÃķlgeleri(data region) kavramÄąnÄą kullanÄąr. Veri bÃķlgesi, RAM'de cacheâe alÄąnmÄąÅ verilerin bulunduÄu mantÄąksal geniÅletilebilir bir alandÄąr. BÃķlgenin baÅlangÄąÃ§ boyutunu ve kaplayabileceÄi maksimum boyutu kontrol edebilirsiniz. Veri bÃķlgeleri, boyuta ek olarak cacheler için persistence(kalÄącÄąlÄąk) ayarlarÄąnÄą denetler.
VarsayÄąlan olarak, nodeâun kullanabileceÄi RAM'in %20'sini alabilen bir veri bÃķlgesi vardÄąr ve oluÅturulan tÞm cacheler bu bÃķlgeye yerleÅtirilir; ancak n kadar veri bÃķlgesi eklenebilir. Birden çok veri bÃķlgesine sahip olmak istenilebilecek birkaç neden vardÄąr:
Veri bÃķlgeleri, bir cache için kullanÄąlabilir RAM miktarÄąnÄą veya cache sayÄąsÄąnÄą yapÄąlandÄąrmaya olanak tanÄąr.
Persistence parametreleri veri bÃķlgesi baÅÄąna yapÄąlandÄąrÄąlÄąr. Hem yalnÄązca bellek içi(in-memory) cacheâlere hem de içeriklerini diskte depolayan cachelere sahip olmak isteniyorsa, farklÄą persistence ayarlarÄąna sahip iki (veya daha fazla) veri bÃķlgesi yapÄąlandÄąrÄąlmasÄą gerekir: biri in-memory cacheler ve diÄeri persist cacheler için.
Eviction policy(tahliye ilkeleri) gibi bazÄą bellek parametreleri, veri bÃķlgesi baÅÄąna yapÄąlandÄąrÄąlÄąr.
Ignite, yeniden baÅlatmalarda memoryâdisk warm-up iÅlemine tabi tutmak gerektirmez. Bir clusterâa baÄlanÄąr baÄlanmaz, harici uygulama onu sorgulayabilir ve Þzerinde iÅlem yapabilir. AynÄą zamanda bellek warm-up ÃķzelliÄi, verilerin sorgulanmadan Ãķnce belleÄe yÞklenmesini tercih eden dÞÅÞk gecikmeli uygulamalar için tasarlanmÄąÅtÄąr.
Åu anda, Ignite warm-up stratejisi, indexlerden baÅlayarak, boÅ alan bitene kadar Ignite'Äąn tÞm veya belirli veri bÃķlgelerine veri yÞklenmesini içerir. Hem tÞm bÃķlgeler için (varsayÄąlan olarak) hem de her bÃķlge için ayrÄą ayrÄą yapÄąlandÄąrÄąlabilir.
Peristence kapalÄąyken, Ignite tÞm cache veri giriÅlerini off-heap bellekte tutar ve yeni veriler geldikçe sayfalarÄą ayÄąrÄąr. Bir bellek sÄąnÄąrÄąna ulaÅÄąldÄąÄÄąnda ve Ignite bir sayfa ayÄąramadÄąÄÄąnda, OutOfMemory hatalarÄąnÄą Ãķnlemek için verilerin bir kÄąsmÄąnÄąn bellekten temizlenmesi gerekir. Bu iÅleme eviction(tahliye) denir. Eviction, sistemin belleÄinin tÞkenmesini Ãķnler, ancak bunu veri kaybÄą ve tekrar ihtiyacÄąnÄąz olduÄunda veriyi yeniden yÞklemek zorunda kalma pahasÄąna yapar.
Eviction aÅaÄÄądaki durumlarda kullanÄąlÄąr:
Persistence kapalÄąyken off-heap bellek için
Ignite harici bir depolama ile kullanÄąldÄąÄÄąnda off-heap bellek için
On-heap cacheler için
EÄer yapÄąlandÄąrÄąlmÄąÅsa near-cacheler için
Persistence aÃ§Äąkken, Ignite yeni bir sayfa ayÄąramadÄąÄÄąnda off-heap belleÄi boÅaltmak için page replacement(sayfa deÄiÅtirme) adÄą verilen benzer bir iÅlem kullanÄąlÄąr. Aradaki fark, verilerin kaybolmamasÄądÄąr(çÞnkÞ kalÄącÄą depolamada saklanÄąr) ve bu nedenle veri kaybÄąndan çok verimlilik kaybÄą yaÅanabilir.
Persistence aÃ§Äąkken ve Ignite'Äąn diskte depoladÄąÄÄą veri miktarÄą, veri bÃķlgesi için ayrÄąlan off-heap bellek miktarÄąndan fazla olduÄunda, bir sayfayÄą diskten tamamen dolu off-heap belleÄine Ãķnceden yÞklemek(preload) için baÅka bir sayfanÄąn diske boÅaltÄąlmasÄą gerekir. Bu iÅleme page rotation(sayfa dÃķndÞrme) veya page replacement(sayfa deÄiÅtirme) denir.
Igniteâa bir sayfa gerektirdiÄinde, bu sayfayÄą off-heap bellekte bulmaya çalÄąÅÄąr. Sayfa Åu anda off-heap bellekte deÄilse (bir sayfa hatasÄą oluÅur), bu sayfa diskten preload iÅlemine tabi tutulur. AynÄą zamanda, off-heap bellek dolduÄunda, deÄiÅtirilmek Þzere baÅka bir sayfa seçilmelidir (diskte saklanmak ve Ã§ÄąkarÄąlmak Þzere).
Ignite, deÄiÅtirilecek sayfalarÄą bulmak için Þç algoritmayÄą destekler:
Random-LRU algoritmasÄą
Segmented-LRU algoritmasÄą
CLOCK algoritmasÄą