Geçen ay ApacheCon'da bir konuşma yaptım Cgroups hakkında. Görünüşe göre çok az Linux kullanıcısı (yakın zamana kadar bendeniz de dahil olmak üzere) Cgroups'a ve gücüne aşina. Bu çok yazık, çünkü Cgroups çok güçlüdür ve sunucularınızdaki kaynakları Linux araç setindeki diğer tüm araçlardan çok daha ayrıntılı bir şekilde tahsis etmenize olanak tanır. Üstelik doğrudan çekirdeğe entegre edilmiştir ve çoğu Linux dağıtımıyla birlikte hazır olarak gelir.
Bu makalede, Docker ile Cgroups'un nasıl kullanılacağını, Docker Meetup Austin, Teksas'ta verdiğim başka bir konuşmanın devamı niteliğinde ele alacağım.
Bu makale, Cgroups hakkında bazı temel bilgilere sahip olmayı gerektirmektedir. Eğer Cgroups konusunda tamamen yeniyseniz, slayt sunumuma (ApacheCon'dan) ve ayrıca sondaki kaynaklara göz atmanızı öneririm. Yine de endişelenmeyin, çok derine inmeyeceğiz. Slayt sunumuna hızlıca göz atarsanız, temel kavramları kavrayabilirsiniz.
Docker ve Cgroups
Docker iki farklı sürücüyle birlikte gelir: LXC ve libcontainer. LXC sürücüsü eski sürücüdür ve libcontainer yeni ve varsayılan sürücüdür. Çoğu durumda, yeniliklerin gerçekleştiği yer burası olduğundan libcontainer tercih edilen sürücüdür (örneğin docker exec LXC sürücüsüyle çalışmaz).
Ancak, tüm Cgroup özelliklerinin henüz libcontainer'a aktarılmadığını (veya en azından Docker'a sunulmadığını) ve bu nedenle iki farklı sürücü olduğunu belirtmek önemlidir. LXC sürücüsünü kullanırken, LXC argümanlarını doğrudan iletirsiniz; libcontainer ile ise Docker'a sunulan açık Cgroup politika argümanları vardır. Docker daemon'ını başlattığınızda açıkça bir sürücü belirtmeniz gerekecektir, bu nedenle iki sürücüyü aynı anda çalıştıramazsınız.
İşte nasıl kontrol edebileceğinize dair bir örnek:
[bash light=”true”] # LXC sürücüsü ile$ docker run -d –name=’lxc_test’ \
–lxc-conf="lxc.cgroup.cpu.shares=50" \
busybox
# libcontainer sürücüsü ile
$ docker run -d –name=’libcontainer_test’ \
–cpu-shares=50 \
busybox
[/bash]
İşte bazı Cgroup özelliklerine ve bunların iki sürücü arasında nasıl eşleştiğine dair bir genel bakış:
| Özellik | Libcontainer | LXC |
|---|---|---|
| Göreceli CPU payı | -c, –cpu-shares | –lxc-conf=”lxc.cgroup.cpu.shares” |
| Bir CPU çekirdeğine kilitleme | –cpuset-cpus | –lxc-conf=”lxc.cgroup.cpuset.cpus” |
| Belleği sınırlandırma | -m, –memory | –lxc-conf=”lxc.cgroup.cpuset.mems” |
LXC
Docker için LXC sürücüsünü kullanmak istiyorsanız, öncelikle onu etkinleştirmeniz gerekir. Bunu yapma yöntemi Linux dağıtımınıza bağlı olarak farklılık gösterecektir, ancak Ubuntu 14.04 üzerinde LXC sürücüsünün nasıl etkinleştirileceğine dair talimatları burada bulabilirsiniz.
. Yukarıda belirtildiği gibi, bunu yaptığınızda bir dizi özellikten vazgeçmiş olursunuz. Bu nedenle, libcontainer kullanan Docker'da henüz sunulmayan bir özelliğe gerçekten ihtiyacınız yoksa, kesinlikle varsayılan sürücüye bağlı kalmalısınız.
Henüz libcontainer'da sunulmayan bazı yararlı Cgroup politikaları arasında, belirli uygulamalar için çok kullanışlı olabilen G/Ç sınırlaması (I/O throttling - sunum dosyasında ele alınmıştır) yer almaktadır.
LXC sürücüsünü kullanmaya karar verdiyseniz, argüman eklemek oldukça basittir. Tek yapmanız gereken --lxc-conf argümanını eklemek ve ayarlamak istediğiniz Cgroup politikasını iletmektir.
Libcontainer
Yukarıdaki tabloda görebileceğiniz gibi, temel Cgroup politikaları Docker'ın mevcut sürümünde (bu yazının yazıldığı sırada 1.6) zaten sunulmaktadır.
Bu politikaları kullanmak çok basittir. Örneğin bir Docker konteynerini ilk CPU çekirdeğine kilitlemek istiyorsanız, --cpuset-cpus=0 ifadesini docker run komutunuza eklersiniz.
Ayrıca libcontainer ile --cgroup-parent argümanını kullanabilir ve daha ayrıntılı kaynak kısıtlamalarını manuel olarak ayarlayabilirsiniz. Ardından bu argümanı kullanarak ilgili gruba eşlersiniz.
Demo: Cgroups ile Docker
Aşağıdaki ekran kaydında iki Docker konteyneri (‘low_prio’ ve ‘high_prio’) kullanacağız. ‘busybox’ temel konteynerini kullanıyoruz ve md5sum /dev/urandom komutunu çalıştırarak CPU’yu yoğun kullanan bir süreci simüle ediyoruz. Varsayılan olarak bu, mevcut tüm CPU kaynaklarını tüketecektir. Ancak kaynakları yönetmek için iki Cgroup politikası uygulayacağız. İlk olarak, konteynerleri aynı CPU çekirdeğine (çekirdek 0) kilitlemek için ‘cpuset.cpus’ kullanıyoruz.
Ardından, göreceli bir CPU payı atamak için ‘cpu.shares’ kullanıyoruz. ‘low_prio’ konteynerine 20, ‘high_prio’ konteynerine ise 80 değerini veriyoruz. Bu, CPU’nun %20’sinin ‘low_prio’ konteynerine, %80’inin ise ‘high_prio’ konteynerine ayrılacağı anlamına gelir. Ancak lütfen göreceli payın keyfi bir ölçek olduğunu unutmayın (değer olarak 2 ve 8 de kullanabilirdik).
Kaynak yönetiminin gerçekten çalıştığını gösterdikten sonra, nasıl davrandıklarını görmek için aynı konteyner kümesini herhangi bir Cgroup politikası olmadan başlatıyoruz.
Referans olması açısından, konteynerleri başlatmak için kullanılan komutlar şunlardır.
[bash light=”true”] $ docker run -d \–name=’low_prio’ \
–cpuset-cpus=0 \
–cpu-shares=20 \
busybox md5sum /dev/urandom
$ docker run -d \
–name=’high_prio’ \
–cpuset-cpus=0 \
–cpu-shares=80 \
busybox md5sum /dev/urandom
[/bash]
Özet
Aynı ana makinede birden fazla Docker konteyneri yönetiyorsanız, konteynerler arasındaki kaynakları yönetmek için Cgroups kullanmak oldukça mantıklıdır. Örneğin, bir konteynerde çalışan bazı arka plan işleme görevleriniz ve kullanıcı içeriği sunan başka bir konteyneriniz olabilir. Bu durumda, arka plan görevlerinden önce kullanıcıya yönelik konteynerlere öncelik verdiğinizden emin olmak için yeni edindiğiniz bilgileri kullanabilirsiniz.
Yorumlar
Henüz yorum yapılmamış. İlk siz olun.