Varsayılan olarak, kapsayıcı tarafından kullanılan kaynaklar sınırsızdır. Yani, ana bilgisayar çekirdeği zamanlayıcısının izin verdiği maksimum kaynaklar kullanılabilir. Ancak konteyneri kullanma sürecinde, konteynerin konak kaynaklarını kısıtlama olmaksızın kullanması imkansızdır.Aşağıda Docker konteynerinde mevcut olan hafızanın nasıl sınırlandırılacağı açıklanmaktadır.
Kapsayıcının ana bilgisayarın belleğini aşırı kullanımını sınırlamak çok önemlidir. Linux ana bilgisayarı için, çekirdek ayırmak için yeterli bellek olmadığını tespit ettiğinde, bir OOME (Anı Dışı İstisnası) atacak ve bellek alanını boşaltmak için bazı işlemleri sonlandırmaya başlayacaktır.
Burada, çok sayıda konteynerin ana bilgisayarın belleğini tükettiği daha yaygın bir senaryoyu ele alıyoruz.OOME tetiklendikten sonra, sistem çekirdeği belleği serbest bırakmak için işlemi hemen sonlandırmaya başlar. Ya çekirdek tarafından öldürülen ilk süreç docker daemon ise? Sonuç, tüm kapların çalışmamasıdır!
Bu soruna yanıt olarak docker, docker daemon'un OOM önceliğini ayarlayarak sorunu hafifletmeye çalışır. Çekirdek, öldürülmek üzere işlemi seçtiğinde, tüm süreçleri puanlayacak, doğrudan en yüksek puana sahip süreci ve ardından bir sonrakini öldürecektir. Docker daemon'unun OOM önceliği düşürüldüğünde (konteyner sürecinin OOM önceliğinin ayarlanmadığını unutmayın), docker daemon sürecinin puanı sadece konteyner sürecinin puanından düşük olmayacak, aynı zamanda diğer bazı işlemlerin puanlarından da daha düşük olacaktır. Bu şekilde docker daemon süreci çok daha güvenlidir.
Aşağıdaki komut dosyası aracılığıyla mevcut sistemdeki tüm işlemlerin puanlarına sezgisel olarak bakabilirsiniz:
#! / bin / bash $ (find / proc -maxdepth 1 -regex '/ proc / +') içindeki proc için; printf "% 2d% 5d% s \ n" \ "$ (cat $ proc / oom_score)" \ "$ (taban adı $ proc)" \ "$ (cat $ proc / cmdline | tr '\ 0' '' | head -c 50)" tamamlandı 2 > / dev / null | sırala -nr | kafa -n 40Bu komut dosyası, en yüksek puanlara sahip 40 işlemi çıkarır ve bunları sıralar (ilk sütun işlemlerin puanlarını gösterir)
Kabın bellek kullanımını test etmek için stres testi iş stresini yükledim ve yeni bir u-stresi görüntüsü oluşturdum.
Aşağıda kullanılan tüm kaplar u-stres görüntüleri tarafından oluşturulacaktır (kabı çalıştıran ana makine ubuntu16.04'tür). U-stres görüntüsünü oluşturmak için Dockerfile'ı burada bulabilirsiniz:
Ubuntu'DAN: en yeni RUN apt-get update \ apt-get install stressBir ayna oluşturma komutu şudur:
docker build -t u-stress: en son.Önce basit bir kullanım senaryosunu tamamlayın: kabın kullanabileceği maksimum belleği 300 M ile sınırlayın.
-M (- memory =) seçeneği bu yapılandırmayı tamamlayabilir:
$ docker run -it -m 300M --memory-swap -1 --name con1 u-stress / bin / bashAşağıdaki stres komutu bir işlem oluşturacak ve malloc işlevi aracılığıyla bellek ayıracaktır:
# stres --vm 1 --vm-bayt 500 milyonDocker stats komutuyla gerçek durumu kontrol edin:
Yukarıdaki docker run komutunda, -m seçeneği konteyner tarafından kullanılan belleği 300M ile sınırlar. Aynı zamanda, bellek takas değerini -1 olarak ayarlayın; bu, kapsayıcı programı tarafından kullanılan belleğin sınırlı olduğu ve kullanılabilecek takas alanının sınırlı olmadığı anlamına gelir (ana bilgisayar, olduğu kadar takas kabı kullanabilir).
Aşağıda stres süreci belleğinin gerçek durumunu görüntülemek için top komutunu kullanıyoruz:
Yukarıdaki ekran görüntüsünde, önce stres komutuyla ilgili işlemleri sorgulamak için pgrep komutunu kullanın. İşlem numarası daha büyük olan (9296) hafızayı tüketen işlemdir, bu yüzden hafıza bilgisine bakalım. VIRT, işlem sanal belleğinin boyutudur, bu nedenle 500M olmalıdır. RES, ayrılan gerçek fiziksel bellek miktarıdır.Bu değerin 300M civarında dalgalandığını görüyoruz.
Sonuç: kabın kullanabileceği fiziksel bellek miktarını başarıyla sınırladı.
Vurgulamak --memory-swap İle olmalı --hafıza Birlikte kullanılır.
Normal koşullar altında, --memory-swap değeri konteyner için kullanılabilir bellek ve takas değerini içerir. Yani --memory = "300m" --memory-swap = "1g" şu anlama gelir:
Konteyner 300M fiziksel bellek kullanabilir ve 700M (1G -300M) takas kullanabilir.
--memory-swap, konteynerin kullanabileceği fiziksel bellek ile kullanılabilecek takasın toplamıdır!
--Memory-swap değerini 0 olarak ayarlamak, ayarlamamakla aynıdır.Bu durumda, --memory ayarlanırsa, kabın kullanabileceği takas boyutu --memory değerinin iki katıdır.
--Memory-swap'in değeri --memory ile aynıysa, kapsayıcı swap kullanamaz.
Aşağıda, takas mümkün olmadığında sistemden büyük miktarda bellek isteme senaryosu gösterilmektedir:
$ docker run -it --rm -m 300M --memory-swap = 300M u-stress / bin / bash # stres --vm 1 --vm-bayt 500 milyonKapta bulunan fiziksel belleği sınırlandırarak, kapsayıcıdaki hizmet istisnaları nedeniyle büyük miktarda ana bilgisayar belleğinin tüketildiği bir durumdan kaçınmak mümkündür (bu durumda, kabı yeniden başlatmak daha iyi bir stratejidir), böylece ana bilgisayar belleğinin tükenme riskini azaltır.
Daha sonra daha fazla devop paylaşılacak, ilgilenen arkadaşlar buna dikkat edebilir! !