Gruplar, gruplanmamış süreçlerle nasıl etkileşime girer?


12

Tek çekirdekli bir makinede 3 işlemim var. Her işlem tamamen aynıdır ve CPU'yu olabildiğince hızlı yakar (sıkı döngü). Bunlardan ikisi ( Ave B) 512 ve 512'ye ayarlanmış ayrı gruplarda cgexec ile başlatılır. Üçüncüsü ( C) cgexec ile değil, düzenli olarak başlatılır.

Her şey hazır ve çalışır Chale geldiğinde CPU'nun% 66'sını alır Ave B% 33'ü böler. Ben öldürürsem Csonra Ave B(beklendiği gibi)% 50 her olsun.

Neden C% 66 elde ediyor? Bu senaryoda her birinin% 33'ünü veya belki de% 50 (C),% 25 (A) ve% 25 (B) olmasını beklerdim. CGerçi % 66 matematik dersini nasıl yaparsam yapayım işe yaramıyor.

Genel olarak, kaynak paylaşımı söz konusu olduğunda cgexecbaşlatılan süreçlerle etkileşime girmeden başlatılan işlemlerin nasıl olduğunu anlamak istiyorum cgexec(özellikle CPU, ancak çok karmaşık değilse daha genel bir cevap takdir edilecektir).


Her şeyden önce, merak ediyorum CPU kullanım yüzdesini nasıl ölçüyorsunuz? A, B ve C'yi çalıştırdığınız öncelikler nelerdir?
KWubbufetowicz

CPU kullanımını ölçtüğüme topinanıyorum ve oldukça basit bir şekilde komut isteminden başlatıldıklarına inanıyorum: cgexec -g cpu:foo myprogramve ./myprogram. Bir süredir bu yüzden kesinlikle hatırlamıyorum.
Micah Zoltu

Programımın tek iş parçacığından / işlemden fazlasını kullandığı durumlar olabilir mi? BTW hala bu sorunu çözmekle ilgileniyor musunuz?
KWubbufetowicz

Program sadece bu davranışı test etmek için yazılmış bir test uygulamasıydı. Sonuçları daraltmak için kasıtlı olarak tek iş parçacıklıydı. Hala bu sorunun cevabını merak ediyorum.
Micah Zoltu

RedHat'ın bu sayfası burada yardımcı olabilir. cpu.sharesçok tuhaf bir yapılandırma seçeneğidir; Bunun cpuset.cpusyerine mümkünse işleri CPU'lar ile ayırmanızı öneririm .
Joker

Yanıtlar:


3

Gruplar hiyerarşiktir ve tüm alt süreçler tarafından miras alınır. Bu yüzden tüm süreçler bir grupta olmalıdır. Varsayılan olarak kök gruptur ve varsayılan olarak, örneğinizde A ve B'nin iki katı olan 1024 paylaşıma sahiptir.

CPU zamanı cpu.shares içinde kendilerine atanan ağırlığa göre gruplar arasında paylaşılır.

A'nın 1024 hissesi ve B 512 ve C 256 ve D 256 olması durumunda, cpu zaman dağılımı% A - 50, B -% 25, ​​C ve D% 12,5 olabilir.


Bu nedenle cgexec ile başlatılmayan herhangi bir süreç, tüm yakın çocuklar arasında eşit olarak bölünmüş 1024 pay ile kök grubundadır. Bu tür bir yakın çocuk çağırılarak oluşturulan gruptur cgexec. Böylece cgexecişlem dışı% 50 ve gruplandırılmış işlemlerin geri kalan% 50'sini paylaşır. Gruplandırılmış süreçler içinde% 50'sini eşit olarak paylaşırlar, yani her ikisi de% 25'tir. Bu mantıklı olurdu, ancak gözlemlediğim davranış bu değil. Gördüğüm şey% 66,% 33 ve% 33. Cevabı daha fazla ayrıntı ve belki bir örnek dağıtım içerecek şekilde güncelleyebilir misiniz?
Micah Zoltu

Oh, sanırım görüyorum. İşletim sistemindeki herhangi bir işlem olmadan cgexec1024 paylaşım elde edilir. İle başlatılan herhangi bir işlem cgexecbelirtilen payları alır. Bu durumda, bir işlem 1024 pay alırken, diğer ikisi 512 pay alır ve gördüğüm dağıtımla sonuçlanır. Cevabınızı, örneğin bir örnekle biraz daha netlik sağlamak için güncellemek ister misiniz?
Micah Zoltu

Aslında, bu hala toplanmaz. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Bu cevabın aslında doğru olduğuna inanmıyorum, en azından yüzeyde değil.
Micah Zoltu

başka grupların var mı? Sayıları etkileyebilir. Ayrıca redhat dokümanlarını da kontrol edebilirsiniz, bu da benzer bir örnek access.redhat.com/documentation/tr-TR/Red_Hat_Enterprise_Linux/…
Lazy404

Önem taşıyan başka bir şey olmayan kutu, test çalışmasından önce ve sonra boşta kaldı. Tüm örnekler yalnızca, tüm işlemler grup grupları kurulumuyla başlatıldığında ne olacağını gösterir. Bazı süreçler cgroups kullanmadığında ne olacağını tartışmıyor, bu yüzden anlamaya çalışıyorum.
Micah Zoltu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.