Docker kapsayıcıları varsayılan olarak herhangi bir kaynak kısıtlaması olmadan çalışır. Kapsayıcılarda çalışan işlemler, sınırsız miktarda bellek kullanmakta serbesttir, bu da ana bilgisayarınızdaki komşu kapsayıcıları ve diğer iş yüklerini potansiyel olarak etkiler.
Bu, üretim ortamlarında tehlikelidir. Her kapsayıcı, kaçak kaynak tüketimini önlemek için uygun bir bellek sınırıyla yapılandırılmalıdır. Bu, genel sistem kararlılığını en üst düzeye çıkaracak çekişmeyi azaltmaya yardımcı olur.
Docker Bellek Sınırları Nasıl Çalışır?
Docker, tek tek kapsayıcılarda sabit ve yumuşak bellek sınırları belirlemenize olanak tanır. Bunların kullanılabilir bellek miktarı ve sınıra ulaşıldığındaki davranış üzerinde farklı etkileri vardır.
- Sabit bellek sınırları kapsayıcıya sağlanan bellekte mutlak bir sınır ayarlayın. Bu sınırın aşılması, normal olarak çekirdek yetersiz bellek öldürücünün kapsayıcı işlemini sonlandırmasına neden olur.
- Yumuşak bellek sınırları bir kapsayıcının kullanması beklenen bellek miktarını belirtir. Kapasite mevcut olduğunda kapsayıcının daha fazla bellek kullanmasına izin verilir. Düşük bellek durumu sırasında yumuşak bir sınırı aşarsa sonlandırılabilir.
Docker ayrıca takas bellek kısıtlamalarını ayarlamak ve bir bellek sınırına ulaşıldığında ne olacağını değiştirmek için kontroller sağlar. Bunları nasıl kullanacağınızı aşağıdaki bölümlerde göreceksiniz.
Sabit ve Yumuşak Bellek Sınırlarını Ayarlama
tarafından bir sabit bellek sınırı belirlenir. docker run
komutlar -m
veya --memory
bayrak. gibi bir değer alır 512m
(megabayt için) veya 2g
(gigabayt için):
$ docker run --memory=512m my-app:latest
Kapsayıcıların minimum 6MB bellek gereksinimi vardır. kullanmaya çalışıyorum --memory
değerleri daha az 6m
hataya neden olacaktır.
Yumuşak bellek sınırları, --memory-reservation
bayrak. Bu değerin daha düşük olması gerekir --memory
. Sınır, yalnızca kapsayıcı kaynak çekişmesi meydana geldiğinde veya ana bilgisayarın fiziksel belleği düşük olduğunda uygulanır.
$ docker run --memory=512m --memory-reservation=256m my-app:latest
Bu örnek, 256 MB ayrılmış belleğe sahip bir kapsayıcıyı başlatır. 300MB kullanıyorsa ve kapasite tükeniyorsa işlem sonlandırılabilir. Kullanım 512 MB’ı aşarsa her zaman duracaktır.
Değiştirme Belleğini Yönetme
Fiziksel bellek tüketimini etkilemeden yüksek kullanıma uyum sağlamak için kapsayıcılara takas belleği tahsis edilebilir. Takas, kullanılabilir RAM tükendiğinde bellek içeriğinin diske yazılmasına izin verir.
bu --memory-swap
bayrak, kullanılabilir takas alanı miktarını kontrol eder. Sadece ile birlikte çalışır --memory
. ayarladığınızda --memory
ve --memory-swap
takas değeri, takas alanı da dahil olmak üzere kapsayıcının kullanabileceği toplam bellek miktarını kontrol eder. Değeri --memory
miktarın fiziksel bellek olan kısmını belirler.
$ docker run --memory=512m --memory-swap=762m my-app:latest
Bu kapsayıcı, 512 MB’ı fiziksel RAM olan 762 MB belleğe erişime sahiptir. Kalan 250MB diskte depolanan takas alanıdır.
Ayar --memory
olmadan --memory-swap
konteynere fiziksel bellekle aynı miktarda takas alanına erişim sağlar:
$ docker run --memory=512m my-app:latest
Bu kapsayıcı, 512 MB RAM ve 512 MB takas içeren toplam 1024 MB belleğe sahiptir.
Bir kapsayıcı için takas, ayarlanarak devre dışı bırakılabilir. --memory-swap
ile aynı değere işaretle --memory
. Olarak --memory-swap
toplam bellek miktarını ayarlar ve --memory
fiziksel bellek oranını ayırırsa, Docker’a kullanılabilir belleğin %100’ünün RAM olması gerektiğini söylüyorsunuz.
Her durumda takas, yalnızca ana makinenizde etkinleştirildiğinde çalışır. Kapsayıcıların içindeki takas raporlaması güvenilir değildir ve kullanılmamalıdır. gibi komutlar free
bir kapsayıcı içinde yürütülen, kapsayıcı tarafından erişilebilen takası değil, Docker ana makinenizdeki toplam takas alanı miktarını görüntüler.
Yetersiz Bellek İşlem Öldürmelerini Devre Dışı Bırakma
Bir kapsayıcıdaki yetersiz bellek hataları normalde çekirdeğin işlemi sonlandırmasına neden olur. Bu, konteynerin çıkış kodu 137 ile durmasına neden olur.
İsteğe bağlı bayrak dahil --oom-kill-disable
seninki ile docker run
komutu bu davranışı devre dışı bırakır. İşlemi durdurmak yerine, çekirdek yeni bellek tahsislerini engelleyecektir. İşlem, bellek kullanımını azaltana, yeni bellek tahsislerini iptal edene veya kapsayıcıyı manuel olarak yeniden başlatana kadar askıda gibi görünecektir.
Yetersiz bellek koşullarını kendiniz çözmek için mekanizmalar uygulamadığınız sürece bu bayrak kullanılmamalıdır. Çekirdeğin işlemi sonlandırmasına izin vermek, normal bellek tüketimini geri yükleyen bir kapsayıcının yeniden başlatılmasına neden olmak genellikle daha iyidir.
Özet
Docker kapsayıcıları önceden uygulanmış kaynak kısıtlamaları olmadan gelir. Bu, konteynır işlemlerini sınırsız bellek tüketmek için serbest bırakır ve ana makinenizin kararlılığını tehdit eder.
Bu makalede, yetersiz bellek durumuyla karşılaşma şansınızı azaltmak için sabit ve yumuşak kapsayıcı bellek sınırlarının nasıl ayarlanacağını öğrendiniz. Bu sınırları tüm kapsayıcılarınızda ayarlamak, kaynak çekişmesini azaltacak ve ana makinenizin fiziksel bellek kapasitesi dahilinde kalmanıza yardımcı olacaktır. Bellek sınırlarının yanında CPU sınırlarını kullanmayı düşünmelisiniz – bunlar, yüksek CPU talebine sahip bireysel kapsayıcıların komşularını olumsuz yönde etkilemesini önleyecektir.