Linux sistemlerinin kullanımında, genellikle "belirli bir sürecin veya belirli işlemlerin kaynak tahsisini sınırlamayı ummak" olarak bahsedilen bir gereklilik vardır. Şu anda, yeni bir Cgroups terimi ortaya çıktı.
Cgroups, Kontrol Gruplarının kısaltmasıdır.Linux çekirdeği tarafından, işlem grupları tarafından kullanılan fiziksel kaynakları (cpu, bellek, IO vb.) Sınırlamak, kaydetmek ve izole etmek için sağlanan bir mekanizmadır ve süreçleri katmanlar halinde gruplandırır. , Ve özel bir dosya sistemiyle açın.
Başlangıçta Google mühendisleri tarafından önerildi, daha sonra Linux çekirdeğine entegre edildi.
2.1 İlke ve işlev
Docker, ortamın izolasyonunu tamamlamak için Namespace'i kullanır. Ancak kapsayıcılar için, tüm kapsayıcılar ana bilgisayarın tüm CPU, bellek ve IO kaynaklarını paylaşabilir.Bu kaynakların izolasyonunu tamamlamak için Docker'ın Cgroups'a güvenmesi gerekir. Gruplardaki önemli kavram, "alt sistem", yani kaynak denetleyicidir.Her alt sistem bir kaynak ayırıcıdır.Örneğin, CPU alt sistemi CPU zamanının tahsisini kontrol eder.
2.2 Cgroup'un temel kavramları
1) Alt Sistemler : Buna bir alt sistem deyin Bir alt sistem bir kaynak denetleyicidir Örneğin, CPU alt sistemi CPU zaman tahsisini kontrol eden bir denetleyicidir.
2) Hiyerarşiler : Aranabilir Hiyerarşik sistem Ayrıca aranabilir Kalıtım sistemi , Kontrol Gruplarını ifade eder, hiyerarşi sisteminin ilişkisine göre düzenlenir.
3) Kontrol Grupları : Belirli bir standarda göre bölünmüş bir dizi süreç. Süreçler bir Kontrol Grubundan başka bir Kontrol Grubuna taşınabilir ve Kontrol Gruplarındaki süreçler de bu grubun kaynakları tarafından kısıtlanacaktır.
4) Görevler : Gruplarda Görevler sistemden biridir süreç .
2.3 Cgroup alt sistemi
Cgroup alt sisteminin adı ve amacı şunları içerir:
Alt sistemin dokümantasyonu:
Rpm paketini kurmak için yum install kernel-doc komutunu kullanın.
Belgelerin tümü / usr / share / doc / kernel-doc- dizinindedir. < Çekirdek sürümü > / Documentation / cgroups / dizininde, tümü txt formatındadır.
CPU alt sistemi hakkında daha fazla bilgi aşağıdaki gibidir:
Gerçek zamanlı planlama
/ usr / share / doc / kernel-doc- < Çekirdek sürümü > /Documentation/scheduler/sched-rt-group.txtCFS planlaması
/ usr / share / doc / kernel-doc- < Çekirdek sürümü > /Documentation/scheduler/sched-bwc.txt2.4 Varsayılan Cgroup seviyesi
Centos / red_hat 7 sisteminde, varsayılan olarak systemd, Cgroup ağacı için birleşik bir yapı sağlamak için otomatik olarak bir dilim, kapsam ve hizmet birimleri hiyerarşisi oluşturacaktır.
Systemd birim türü, sistemde çalışan tüm işlemler systemd init sürecinin alt süreçleridir. Kaynak yönetimi ve denetimi açısından systemd üç tip birim sağlar.
Systemd-cgls komutunu kullanarak şunları görüntüleyebilirsiniz:
# systemd-cglsUser.slice altındaki iki kapsam, kullanıcının oturum açtığı tty'dir ve ortadaki sayı, kullanıcının kullanıcı kimliğini temsil eder.
Service.slice, sistemin tüm hizmetlerini temsil eder.
Tüm hiyerarşi ayrıca / sys / fs / cgroup / systemd altında da görülebilir.
2.5 Düzeyler ve alt sistemler arasındaki ilişkinin şeması
3.1 Bir kontrol grubu oluşturun
1. Geçici bir Cgroup oluşturmak için systemd-run kullanın
Kök kullanıcı olarak çalıştır
systemd-run --unit = name --scope --slice = dilim_adı komutuUyarılar:
Misal:
Burada CPU'yu dolduran, kendisi sonsuz döngü olan bir sh betiği yazdım
# cat /root/1.sh doğru iken yapmak x = + 1 bittiKontrol grubunun oluşturulmasını tamamlamak için aşağıdaki komutu yürütün.
systemd-run --unit = 1.sh --slice = test sh /root/1.shHizmetin çalışma durumunu sorgulamak için aşağıdaki komutu kullanın
systemctl durumu 1.shServis işletim parametrelerini görüntülemek için show komutunu kullanın
systemctl gösterisi 1.shDizin yapısını görüntüleyin:
ağaç / sys / fs / cgroup / systemd /Bir test.slice dizininin yaratıldığını ve bu dizinin altına 1.sh.service dizininin yerleştirildiğini göreceksiniz. Tümü oluşturma sırasında belirtilir.
2. Kalıcı bir Grup oluşturun
Sistem başladığında bir otomatik başlatma birimini yapılandırmak için, birleşik dosyanın yazılmış olması koşuluyla systemctl enable komutunu çalıştırın.
3.2 Kontrol grubunu sil
1. Geçici kontrol grubunda yer alan süreç sona erdiğinde, geçici Cgroup otomatik olarak serbest bırakılacaktır.
Hizmet grubundaki tüm işlemleri durdurun:
systemctl stop 1.shSystemd altındaki test.slice dizinini kontrol edin
ls /sys/fs/cgroup/systemd/test.slice1.sh hizmetinin artık mevcut olmadığını ve piyasaya sürüldüğünü göreceksiniz
2. Kalıcı kontrol grubu, sil
gerçekleştirillen
systemctl xxxxx devre dışı bırak3.3 Cgroup parametrelerini değiştirin (kaynak kontrolü)
Komutu kullan
systemctl set-özellik adı parametresi = değerBurada ad, kontrol grubu adını ve parametre, parametre adını temsil eder
1. CPU kaynaklarının kontrolü-CPUQUOTA (cpu birimi döngü süresi)
Bir kontrol grubu oluşturmak için yukarıdaki 1.sh'yi kullanın (1.sh, cpu'yu doldurabilecek sonsuz bir döngü yazar)
# systemd-run --unit = 2.sh --slice = test sh /root/1.sh Unit 2.sh.service olarak çalışıyor.Cpu yükünü görüntülemek için üst kısmını kullanın
2.sh hizmetinin% 100'de çalıştığı bulundu
CPU kota değerini ayarlamak için systemctl kullanın
# systemctl set-property 2.sh.service CPUQuota =% 50Ardından en yüksek değeri kontrol edin
Sürecin% 50'ye düştüğünü görecek
/ Sys / fs / cgroup / cpu / dizini görüntüle
# cd / sys / fs / cgroup / cpu / # ls cgroup.clone_children cgroup.sane_behavior cpuacct.usage_percpu cpu.rt_period_us cpu.stat system.slice user.slice cgroup.event_control cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release görevleri cgroup.procs cpuacct.usage cpu.cfs_quota_us cpu.shares release_agent test.slice # cd test.slice / # ls 2.sh.service cgroup.procs cpuacct.usage_percpu cpu.rt_period_us cpu.stat cgroup.clone_children cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_release cgroup.event_control cpuacct.usage cpu.cfs_quota_us cpu.shares görevleri # cd 2.sh.service / # ls cgroup.clone_children cgroup.procs cpuacct.usage cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release cgroup.event_control cpuacct.stat cpuacct.usage_percpu cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat görevleriTest.slice ve 2.sh.service dizinlerinin yaratıldığını ve cpu kurallarının 2.sh.service dizinine kaydedildiğini göreceksiniz.
Bu dizindeki cfs yapılandırmasını görüntüleyin
# cat cpu.cfs_period_us 100.000 # cat cpu.cfs_quota_us 50000Periyot 100000 (mikrosaniye birimleri ve 0,1 saniye), kota 50000 (mikrosaniye birimleri ve 0,05 saniye) olarak ayarlanmıştır, dönem dönemi temsil eder ve kota, işlemin dönem içinde CPU'yu işgal ettiği süreyi temsil eder. Bu kontrol grubundaki tüm işlemler, cpu döngüsünün 0.1 saniyesinde yalnızca 0.05 saniye sürdü. 2 CPU varsa, kota 200000 olarak ayarlanabilir, böylece 0,1 saniyelik döngü işlemi 0,2 saniye kullanır ve 2 CPU alır
Not: Bu cfs'nin ayarı mutlak bir değerdir
2. CPU kaynaklarının kontrolü-CPUSHARES (cpu kullanım ağırlığı)
Açıklama:
İzlenecek yol (bu sefer sistem 2 cpu'dur)
Geçici olarak 2 grup oluşturun:
# systemd-run --unit = 1.sh --slice = test sh /root/1.sh Unit 1.sh.service olarak çalışıyor. # systemd-run --unit = 2.sh --slice = test sh /root/1.sh Unit 2.sh.service olarak çalışıyor.Ardından cpu yükünü kontrol edin:
İki hizmetin yükü benzerdir, 1.sh paylaşım değerini indirin ve 512'ye ayarlayın
# systemctl set-property 1.sh.service CPUShares = 5121.sh 2.sh c grubunun yapılandırmasını görüntüleyin
# pwd /sys/fs/cgroup/cpu/test.slice # cat 1.sh.service / cpu.shares 512 # cat 2.sh.service / cpu.shares 1024Cpu yükünün hala çok ortalama olduğunu göreceksiniz, ancak paylaşım değeri 512 ve 1024 olarak ayarlanmıştır, bu da çok çekirdekli ayar% 100'den az olsa bile% 100 yük olabileceği anlamına gelir.
Şimdi bir 3.sh hizmetine katılıyor
# systemd-run --unit = 3.sh --slice = test sh /root/1.sh Unit 3.sh.service olarak çalışıyor.Sonra yükü kontrol edin
Cpushares değeri esnek olduğu için, cpu yük oranının ayar ile kabaca aynı olduğunu göreceksiniz.
Her cg'nin cpu kullanımını görüntülemek için systemd-cgtop -c komutunu kullanın. Her cg'nin belirli değeri göstermesi için cpu seviyesinin altında systemd.slice bulunmalıdır, aksi takdirde yalnızca kökün toplam değeri görüntülenecektir.
3. MEM kaynak kontrolü
Bellek paylaşılamayan bir kaynaktır, bu nedenle en çok kullanılan ve ne kadar bellek ayrıldığı.
Çok fazla bellek tüketen bir servis oluşturun.
# kedi 2.sh x = a doğru iken yapmak x = $ x $ x echo $ x bittiOluşturmak
# systemd-run --unit = mem-test --slice = test sh /root/2.sh Unit mem-test.service olarak çalışıyor.Bellek değerini ayarla
# systemctl set-property mem-test MemoryLimit = 10 milyonBu hizmet tarafından kullanılan belleği görüntülemek için systemctl status mem-test kullanın
# systemctl durumu mem-testHafızanın 10M ile sınırlı olduğunu göreceksiniz.
Docker'ı daha pratik öğrenmek için beni takip edin ve ~