Docker Container’lar için Bellek ve CPU Nasıl Sınırlandırılır?

Merhaba arkadaşlar, günümüzde Docker teknolojisi aktif bir şekilde kullanılmaktadır ve bu yaygın kullanımdan dolayı ister istemez uygulama yöneticileri optimizasyon konusunda geliştirmeye yönlendirmiştir. Bu da beraberinde birçok çözüm üretmeye itmiştir. Bende bu alanda araştırmam sonucunda temelde bir çözüm getirdim ve bunu da sizlere paylaşmak istedim. Umarım bu yolda uğraşanlar için rehberlik etmesi dileğiyle. Sınırları olmayan bir konteyner, potansiyel olarak diğer hizmetleri veya kapsayıcıları aç bırakarak tüm sistem kaynaklarına erişebilir. Bununla mücadele etmek için, tüm kapların eşit muamele görmesini veya bazılarının diğerlerinden daha eşit olmasını sağlamak için bazı sınırlamalar uygulamak isteyebilirsiniz. Bu eğitim, Docker kapsayıcıları için belleği ve CPU’yu nasıl sınırlayacağınızı gösterecektir.

Web uygulamalarınızı Docker konteynerlerinde çalıştırmayı düşünüyorsanız veya teknolojiye zaten adapte olmuşsanız, en önemli yönlerden birine, yani konteynerlerinizin ana makinenin kaynaklarının ne kadarını kullandığına dikkat etmeniz gerekir.

Varsayılan olarak, bir konteynerin ne kadar bellek veya CPU kullanabileceği konusunda bir sınır yoktur. Ana bilgisayarın çekirdek zamanlayıcısının izin verdiği kadar kullanabilir. Çalışan bir kabın ana makine belleğinin veya CPU’nun çok fazlasını tüketmesine izin verilmemesi önemlidir. Çekirdek, çok az miktarda boş bellek kaldığını algılarsa, bir Out of Memory Exception atar  ve işlemleri sonlandırmaya başlar ve bu, bazı durumlarda tüm sistemin kapanmasına neden olabilir.

Bu durumlardan kaçınmak için her zaman uygulamanızda testler çalıştırmalı ve gerekli kaynak miktarını bulmalı ve ardından kapsayıcıları yeterli miktarda kaynak kullanacak şekilde sınırlamalısınız.

Ubuntu 20.0.04’te Sınırları Ayarlama

Kutunun dışında, Ubuntu 20.0.04 üzerinde bir Docker kurulumu sınır belirleyemiyoruz. Bunun nedeni, grup takaslarının varsayılan olarak devre dışı bırakılmış olmasıdır. Sınırları belirlemeye çalışırken size aşağıdaki hata verilecektir.

 

WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.

Bu hatayı gidermek için aşağıdakileri yaparak cgroup takasını etkinleştirebiliriz.

 

  • Grup yapılandırma dosyasını bir metin düzenleyicide açın.
vi /etc/default/grub
  • Aşağıdaki satırı ekleyin. Eğer GRUB_CMDLINE_LINUX zaten var İsteğe bağlı, aşağıdaki değerleri içerecek şekilde değiştirmek.
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

Değişikliklerinizi kaydedin ve metin düzenleyiciden çıkın.

  • Grup yapılandırmasını güncelleyin.
sudo update-grub

Değişiklikler uygulanmadan önce docker ana makinenizi yeniden başlatmanız gerekecektir.

Sınırsız Koşu

Kapsayıcılar, ana bilgisayarının tüm RAM ve CPU işlem gücüne otomatik olarak erişebilir. Tek bir kapsayıcı çalıştırıyorsanız, bu bir sorun olmayabilir. Birden fazla kapsayıcı barındırmaya başladığınızda, her biri birbirinin üzerine adım atmaya başlayacaktır.

Bellek kullanımının bir göstergesi olarak bir NGINX konteyneri başlattık. Aşağıdaki ekran görüntüsünden de görebileceğiniz gibi, konteynerin limiti 4GB.

Örneğin, konteynerin hiçbir zaman 256 MB’den fazla RAM kullanmamasını sağlamak için bellek sınırları uygulayabiliriz. İlk kapsayıcıyı çalışır durumda tutacağız ve sınırlar uygulanarak yeni bir tane başlatacağız.

Hafızayı Sınırlama

Belleği sınırlamak için bir konteyneri başlatırken bellek işaretini kullanırız. Örneğin, NGINX sunucumuzu yalnızca 256 MB RAM ile sınırlandırmak için aşağıdakileri kullandık.

docker run -d -p 8081: 80 --memory = "256m" nginx

Bu, kesin bir sınır belirler. Bu, konteynerin hiçbir koşulda 256 MB’den fazla RAM kullanmasına izin verilmeyeceği anlamına gelir. Alternatif olarak, yumuşak bir limit belirleyebiliriz. Esnek sınırlar, kapsayıcımızın sınırına ulaştıktan sonra da ek bellek talep edebilmesini sağlayarak hizmet kesintilerini önler.

Esnek bir sınır belirleme işareti bellek ayırmadır. Yumuşak 256 MB veya RAM sınırını ayarlamak için aşağıdaki komutu çalıştırırız.

docker run -d -p 8081: 80 --memory-reservation = "256m" nginx

Bir konteynerin bellek değiştirme kullanımını disk kullanımıyla sınırlandırmak için – memory-swap seçeneği. Ayrıca pozitif bir tamsayı alır ve ardından b, k, m, g son eki gelir . Aşağıdaki durumda konteynerin kullanımına izin verilir

1 gigabayt değiştirilemeyen bellek ve 1 gigabayt takas belleği. Bir konteyner için izin verilen toplam takas belleği miktarı –memory-swap ve –memory (2g – 1g) arasındaki farktır. Konteynırınızın takas belleği kullanmasını istemiyorsanız, hem –memory hem de –memory-swap’ı eşit değerlere ayarlayın.

$ sudo docker run -it --memory = ”1g” --memory-swap = ”2g” ubuntu / bin / bash

 

Docker’ın ana makinede düşük bellek algılaması ve –memory-reservation’ı ayarlamanız durumunda , değeri –memory’den öncelikli olacaktır . Ancak –memory ayarlamadıysanız  , kapsayıcının bellek kullanımını sınırlamaz. Yalnızca düşük bellek algılandığında etkili olur. Bu bir tür yumuşak sınırlama.

CPU’yu sınırlama

Bir konteynerin Docker ana makinenizdeki işlemcileri tekeline almasına izin vermek, diğer servislerinizi ve konteynerlerinizi aç bırakarak servis kesintilerine neden olabilir. Bir konteynerin ne kadar CPU kullanabileceğini sınırlayın. CPU süresinin sınırlandırılması, bir işlemin işlemciyi veya bir dizi çekirdeği ne sıklıkla kesintiye uğratmasını sağlar. Bir konteynerin CPU süresini sınırlamak için –cpus seçeneğini kullanın Bunu “.5” e eşitlemek, 50000 mikrosaniye CPU süresi anlamına gelir.

$ sudo docker run -it --cpus = ".5" ubuntu / bin / bash

Bir konteynerin CPU paylaşımlarını sınırlamak için –cpus-share seçeneğini kullanın . Varsayılan olarak 1024’tür . Bir konteynerin ana makinelerin CPU döngülerinin daha büyük veya daha az bölümünü kullanmasına izin vermek için artırın veya azaltın. Bu, CPU döngüleri ana makine tarafından kısıtlandığında kullanışlıdır. Aksi takdirde, konteynerler ihtiyaç duydukları kadar CPU döngüsü kullanabilir. Bu aynı zamanda bir tür yumuşak sınırdır.

$ sudo docker run -it --cpus-hisseleri = "512" ubuntu / bin / bash

Sonuç

Bir konteynerin kaynaklarını sınırlamak, büyük ölçüde ana makinenin çekirdek yapılandırmasına bağlıdır. Konteynerinizin gereksinimlerini bilmek ve bunları buna göre sınırlandırmak çok önemli olsa da, bu durumda ubuntu 20.0.4 olan ana makine ortamına da aşina olmalısınız. Kaynak gereksinimleri hakkında iyi bir fikir edinmek için uygulamalarınızda her zaman birden fazla test gerçekleştirin. Kaynakları dikkatli kullanmak çok fazla maliyet tasarrufu sağlayabilir.

Kapsayıcı adını veya adlarını belirterek ve koyduğunuz sınırları ve yapılandırmaları doğrulayarak docker stats komutunu çalıştırarak, çalışma durumunda docker kapsayıcılarınızın istatistiklerini görebilirsiniz .

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir