📃
Tech White Papers
  • 📃White Papers
  • ðŸŠķApache
    • Kafka (EN)
      • Kafka Connect
      • Kafka Streams
      • ksqlDB
    • Ignite (TR)
      • Clustering
        • Baseline Topology
      • Thin Clients
      • Data Modeling
        • Data Partitioning
        • Affinity Colocation
      • Memory Architecture
      • Persistence
        • External Storage
        • Swapping
        • Snapshot
        • Disk Compression
        • Persistence Tuning
        • Change Data Capture
      • Cluster Snapshots
      • Data Rebalancing
      • Data Streaming
      • Using Key-Value API
        • Basic Cache Operations
        • Working With Binary Objects
      • Performing Transactions
      • Working with SQL
        • Understanding Schemas
        • Defining Indexes
        • Distributed Joins
      • Distributed Computing
      • Machine Learning
      • Using Continuous Queries
      • Using Ignite Messaging
      • .NET Specific
        • LINQ
        • Serialization
      • Working With Events
        • Events
      • Performance and Troubleshooting
        • Generic Performance Tips
        • Memory and JVM Tuning
        • Persistence Tuning
        • SQL Performance Tuning
        • Thread Pools Tuning
    • Pulsar (TR)
  • 📜Data
    • ClickHouse (TR)
    • QuestDB (TR)
  • Comparison
    • Pulsar vs Kafka
    • ClickHouse vs QuestDB
  • Architectural
    • Microservices
      • Design Principles
      • Design Patterns
Powered by GitBook
On this page
  • Memory Segments
  • Data Pages
  • Memory Defragmentation
  • Data Regions
  • Cache Warm-up Strategy
  • Eviction Policies
  • Replacement Policies

Was this helpful?

  1. Apache
  2. Ignite (TR)

Memory Architecture

03/02/2023

PreviousAffinity ColocationNextPersistence

Last updated 2 years ago

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.

Memory Segments

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.

Data Pages

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.

Memory Defragmentation

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.

Data Regions

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.

Cache Warm-up Strategy

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.

Eviction Policies

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.

Replacement Policies

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Äą

ðŸŠķ
Daha detaylÄą bilgi için...
Daha detaylÄą bilgi içinâ€Ķ
Daha detaylÄą bilgi içinâ€Ķ