Bellek kullanımı, ApsaraDB for MongoDB örnekleri için kritik bir ölçümdür. Bir ApsaraDB for MongoDB örneğinin bellek kullanımını nasıl kontrol edeceğinizi, yaygın nedenleri nasıl belirleyeceğinizi ve hangi optimizasyon stratejilerini uygulayacağınızı öğrenin.
Genel bilgiler
Bir ApsaraDB for MongoDB işlemi başladığında, ikili dosyaları ve bağımlı sistem kütüphanelerini belleğe yükler; istemci bağlantısı yönetimi, istek işleme ve depolama altyapısı gibi görevler için bellek tahsisi ve serbest bırakma işlemlerini yürütür. Varsayılan olarak ApsaraDB for MongoDB bellek ayırıcısı olarak Google'ın tcmalloc bileşenini kullanır. Bellek tüketiminin büyük bölümü WiredTiger depolama altyapısı ile istemci bağlantıları ve istek işleme süreçlerinden kaynaklanır.
Bellek kullanımını kontrol etme
-
İzleme grafiklerini analiz edin
ApsaraDB for MongoDB konsolu içindeki Monitoring Information sayfasından ApsaraDB for MongoDB bellek kullanımını görüntüleyebilirsiniz. ApsaraDB for MongoDB örneklerinin düğüm yapısı, örnek mimarisine göre değişir. Bellek kullanımını görmek için ilgili düğümü seçin.
Çoğaltma kümesi (Replica Set) mimarisi: Birincil düğüm, bir veya daha fazla ikincil düğüm, gizli bir düğüm ve isteğe bağlı olarak bir veya daha fazla salt okunur düğüm içerir.
Parçalı küme (Sharded Cluster) mimarisi: Her parçanın bellek kullanımı çoğaltma kümesine benzer. Yapılandırma Sunucusu (Config Server) yapılandırma meta verilerini depolar. Mongos yönlendirme düğümünün bellek kullanımı; toplama sonuç kümelerinin boyutu, bağlantı sayısı ve meta veri boyutu ile ilişkilidir.
-
Komut satırını kullanın
Örneğe bağlanın ve mongo kabuğu üzerinden
db.serverStatus().memkomutunu çalıştırarak bellek kullanımını görüntüleyip analiz edin. Aşağıdaki kod örnek bir çıktıyı göstermektedir:
{ "bits" : 64, "resident" : 13116, "virtual" : 20706, "supported" : true }
// resident indicates the physical memory used by the mongod process, in MB.
// virtual indicates the virtual memory used by the mongod process, in MB.
serverStatus komut referansı.
Yaygın nedenler
Altyapı belleği
Bir ApsaraDB for MongoDB örneğindeki belleğin büyük bölümü depolama altyapısı önbelleği tarafından kullanılır. Uyumluluk ve güvenlik gerekçeleriyle ApsaraDB for MongoDB WiredTiger CacheSize değerini örneğin toplam ayrılan belleğinin yaklaşık %60'ı olarak ayarlar. Ürün teknik özellikleri.
Depolama altyapısı önbelleği kullanımı yapılandırılan CacheSize değerinin %95'ine ulaştığında örnek yüksek yük altındadır ve kullanıcı isteklerini işleyen iş parçacıkları temiz sayfaları tahliye etmeye başlar. Depolama altyapısı önbelleğindeki kirli veri miktarı CacheSize değerinin %20'sini aştığında kullanıcı iş parçacıkları kirli sayfaları da tahliye eder. Bu süreçte kullanıcılar belirgin istek engellemeleri yaşayabilir. Tahliye parametre açıklamaları.
Altyapı belleği kullanımını şu yöntemlerle kontrol edin:
-
WiredTiger depolama altyapısının bellek kullanımını kontrol edin
Mongo kabuğunda
db.serverStatus().wiredTiger.cachekomutunu çalıştırın. Çıktıda yer alanbytes currently in the cachealanı önbellek tarafından kullanılan bellek miktarını gösterir. Aşağıdaki kod örnek bir çıktıyı sunar:{ ...... "bytes belonging to page images in the cache":6511653424, "bytes belonging to the cache overflow table in the cache":65289, "bytes currently in the cache":8563140208, "bytes dirty in the cache cumulative":NumberLong("369249096605399"), ...... }
-
WiredTiger altyapısının önbellek kirli oranını kontrol edin
Database Autonomy Service (DAS) konsolu içindeki Real-Time Monitoring Data sayfası WiredTiger altyapısı için gerçek zamanlı önbellek kirli oranını gösterir.
ApsaraDB for MongoDB ile birlikte gelen mongostat aracını kullanarak WiredTiger altyapısının mevcut önbellek kirli oranını kontrol edin. mongostat.
Bağlantı ve istek belleği
Yüksek bağlantı sayısı aşağıdaki nedenlerle önemli miktarda bellek tüketir:
İş parçacığı yığını ek yükü: Her bağlantının isteklerini işlemek için karşılık gelen bir arka uç iş parçacığı bulunur. Her iş parçacığı en fazla 1 MB yığın alanı tüketebilir ancak tipik kullanım onlarca ila yüzlerce kilobayt düzeyindedir.
TCP bağlantısı çekirdek arabellekleri: Çekirdek düzeyinde her TCP bağlantısının okuma ve yazma arabellekleri vardır; bu arabellekler tcp_rmem ve tcp_wmem gibi TCP çekirdek parametreleri tarafından belirlenir. Bu belleği yönetmeniz gerekmez ancak eşzamanlı bağlantı sayısı arttıkça ve varsayılan soket arabelleği büyüdükçe TCP bellek tüketimi yükselir.
tcmalloc bellek yönetimi: Her istek paket işleme ve sıralama için geçici arabellekler ayırır. İşlem tamamlandığında bu arabellekler işletim sistemine hemen dönmek yerine tcmalloc'un dahili önbelleğine geri döner. tcmalloc önbelleğe alınan belleği kademeli olarak serbest bırakır ancak serbest bırakılmayan bellek onlarca gigabayta kadar birikebilir.
İnceleme yöntemleri:
-
Bağlantı kullanımını kontrol edin
ApsaraDB for MongoDB konsolu içindeki Monitoring Information sayfasından ApsaraDB for MongoDB örneğinizin bağlantı kullanımını görüntüleyin.
Mongo kabuğunda bağlantı sayısını sorgulayın.
-
tcmalloc tarafından tutulan bellek miktarını kontrol edin
tcmalloc'un işletim sistemine iade etmediği bellek miktarını kontrol etmek için
db.serverStatus().tcmallockomutunu çalıştırın. tcmalloc önbellek boyutunu şu formülle hesaplayabilirsiniz: tcmalloc önbelleği = pageheap_free_bytes + total_free_byte. Aşağıdaki kod örnek bir çıktıyı gösterir:{ ...... "tcmalloc":{ "pageheap_free_bytes":NumberLong("3048677376"), "pageheap_unmapped_bytes":NumberLong("544994184"), "current_total_thread_cache_bytes":95717224, "total_free_byte":NumberLong(1318185960), ...... } }Nottcmalloc bellek ayırıcı referansı.
Meta veri belleği
Bir ApsaraDB for MongoDB örneğinde çok sayıda veritabanı, koleksiyon ve dizin bulunması ilişkili meta veriler nedeniyle önemli miktarda bellek tüketir. ApsaraDB for MongoDB önceki sürümlerinde aşağıdaki sorunlar görülebilir:
4,0 öncesi ApsaraDB for MongoDB sürümlerinde tam mantıksal yedekleme sırasında çok sayıda dosya tanıtıcısı açılabilir. Bu tanıtıcılar işletim sistemine zamanında iade edilmezse bellek kullanımı hızla artabilir.
4,0 ve önceki ApsaraDB for MongoDB sürümlerinde çok sayıda koleksiyon silindiğinde ilgili dosya tanıtıcıları düzgün şekilde kaldırılmayabilir; bu durum bellek sızıntısına yol açabilir.
Dizin oluşturma belleği
Normal veri yazma işlemleri sırasında ikincil düğüm oplog uygulamak için yaklaşık 256 MB'a kadar bir arabellek tutar. Ancak ikincil düğümde dizin oluşturma işlemlerinin çoğaltılması daha fazla bellek tüketebilir.
4,2 öncesi ApsaraDB for MongoDB sürümlerinde dizin oluşturma
backgroundseçeneğini destekler.{background:true}belirtildiğinde dizin arka planda oluşturulur. Bu işlemin çoğaltılması seri olarak gerçekleşir ve 500 MB'a kadar bellek tüketebilir.ApsaraDB for MongoDB 4,2 ve sonraki sürümlerde
backgroundseçeneği kullanımdan kaldırılmıştır. İkincil düğümler dizin oluşturma işlemlerini paralel olarak çoğaltabilir; bu durum daha fazla bellek tüketimine neden olur. Aynı anda birden fazla dizin oluşturulduğunda bellek yetersizliği (OOM) hatası ortaya çıkabilir.
MongoDB belgeleri: Index Build Impact on Database Performance ve Index Build Process.
Plan önbelleği bellek kullanımı
Bazı senaryolarda tek bir sorgu çok sayıda aday yürütme planı üretebilir; bu durum plan önbelleğinin önemli miktarda bellek tüketmesine neden olabilir.
Plan önbelleği bellek kullanımını kontrol edin: ApsaraDB for MongoDB 4,0 ve sonraki sürümlerde bellek kullanımını kontrol etmek için db.serverStatus().metrics.query.planCacheTotalSizeEstimateBytes komutunu çalıştırabilirsiniz.
Örneğiniz ApsaraDB for MongoDB 4,0 çalıştırıyor ancak komut planCacheTotalSizeEstimateBytes alanını döndürmüyorsa örneğinizin küçük sürümü çok eskidir. Örneğinizin küçük sürümünü yükseltmenizi öneririz.
İlgili: Secondary node memory arise while balancer doing work.
Optimizasyon stratejileri
Bellek optimizasyonu, kaynak kullanımını ve performansı dengelemeyi amaçlar; maliyet ne pahasına olursa olsun kullanımı minimize etmeyi hedeflemez.
ApsaraDB for MongoDB CacheSize değerini belirtir ve bu değer değiştirilemez. Bellek kullanımını şu stratejilerle optimize edin:
Eşzamanlı bağlantıları kontrol altında tutun. Varsayılan MongoDB sürücüsü 100 bağlantılık bir havuz oluşturur. Çok sayıda istemci bağlanıyorsa istemci başına havuz boyutunu azaltın. Aşırı bellek ve bağlam anahtarlama ek yükünü önlemek için toplam kalıcı bağlantı sayısını 1.000'in altında tutun.
Koleksiyon taramalarını ve bellek içi sıralamayı önlemek amacıyla dizinler oluşturarak istek başına bellek ek yükünü azaltın.
Sorgu ve bağlantı optimizasyonundan sonra bellek kullanımı hâlâ yüksekse OOM hatalarını ve aşırı önbellek tahliyesinden kaynaklanan performans düşüşünü önlemek için örneğin bellek teknik özelliklerini yükseltin.
-
tcmalloc tarafından bellek serbest bırakımını hızlandırın. Veritabanı örneğinizin bellek kullanımı %80'i aşıyorsa konsoldaki Parameter Settings sayfasından tcmalloc ile ilgili parametreleri ayarlayabilirsiniz.
tcmallocAggressiveMemoryDecommit parametresini etkinleştirin. Bu ayar bellek tutma sorunlarını etkili şekilde çözer.
Sorun devam ederse tcmallocReleaseRate değerini kademeli olarak artırın (örneğin 1'den 3'e, ardından 5'e).
ÖnemliBu parametreleri yoğun olmayan saatlerde ayarlayın. Söz konusu parametreler veritabanı performansını düşürebilir. İş süreçleriniz etkilenirse değişiklikleri hemen geri alın.
CPU kullanımı, yanıt süresi (RT) ve opCounters değerlerini ayarlama öncesi ve sonrasında izleyerek etkiyi değerlendirin.
Gereksiz koleksiyon ve dizinleri kaldırarak, tabloları birleştirerek, örneği bölerek veya parçalı kümeye geçirerek veritabanı ve koleksiyon sayısını optimize edin. Veritabanı ve tablo sayısının aşırı olması nedeniyle örnek performansının yavaşlaması veya anormal davranması.
ApsaraDB for MongoDB kullanırken ApsaraDB for MongoDB ile ilgili olabilecek diğer senaryolarla karşılaşırsanız Alibaba Cloud teknik desteği ile iletişime geçin.
Referanslar
Tahliye parametreleri
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SSS
S: MongoDB'de toplama işlemleri için bellek sınırını nasıl artırabilirim?
C: ApsaraDB for MongoDB toplama işlemleri için bellek sınırını doğrudan artırmanıza olanak tanımaz. MongoDB toplama işlem hattındaki her aşama için 100 MB bellek sınırı bulunur. Bir aşama bu sınırı aştığında sistem hata döndürür. Toplama işlem hattınızda {allowDiskUse:true} seçeneğini açıkça belirterek bu sorunu çözebilirsiniz. MongoDB 6,0 ve sonraki sürümler genel varsayılan parametre allowDiskUseByDefault öğesini destekler. Bir toplama işlemi aşırı bellek gerektirdiğinde MongoDB yüksek bellek tüketimini önlemek için otomatik olarak geçici disk alanı kullanır. Bellek kullanımını azaltmaya yönelik diğer stratejiler için Optimizasyon stratejileri bölümüne bakın.