cgroups โต้ตอบกับกระบวนการที่ไม่จัดกลุ่มได้อย่างไร


12

ฉันมี 3 กระบวนการในเครื่องแกนเดียว แต่ละขั้นตอนเหมือนกันและเผา CPU ให้เร็วที่สุดเท่าที่จะทำได้ สองของพวกเขา ( AและB) ถูกเปิดตัวด้วย cgexec ในกลุ่มที่แยกจากกันโดยมีการแชร์ตั้งไว้ที่ 512 และ 512 และที่สาม ( C) เปิดตัวเป็นประจำไม่ใช่ cgexec

เมื่อทุกอย่างพร้อมใช้งานCได้รับ 66% ของ CPU ในขณะที่AและBแบ่ง 33% ถ้าฉันฆ่าCแล้วAและBจะได้รับ 50% ในแต่ละ (ตามคาด)

ทำไมถึงCได้ 66% ฉันคาดว่าจะได้ 33% ต่อสถานการณ์นี้หรืออาจจะ 50% (C) 25% (A) และ 25% (B) 66% จะCไม่ได้ผลไม่ว่าฉันจะทำคณิตศาสตร์อย่างไร

โดยทั่วไปฉันต้องการเข้าใจว่ากระบวนการเปิดตัวโดยไม่ต้องcgexecโต้ตอบกับกระบวนการที่เปิดตัวcgexecเมื่อมันมาถึงการแบ่งปันทรัพยากร (โดยเฉพาะ CPU แต่คำตอบทั่วไปจะได้รับการชื่นชมมากขึ้นถ้ามันไม่ซับซ้อนเกินไป)


ก่อนอื่นฉันสงสัยว่าคุณวัดเปอร์เซ็นต์การใช้งาน CPU ได้อย่างไร ลำดับความสำคัญของคุณคืออะไร A, B และ C?
KWubbufetowicz

ฉันเชื่อว่าฉันได้รับการวัดการใช้งาน CPU ด้วยtopและผมเชื่อว่าพวกเขาได้เริ่มต้นอย่างเป็นธรรมเพียงจากคำสั่งที่พรอมต์: และcgexec -g cpu:foo myprogram ./myprogramมันเป็นเวลานานแล้วที่ฉันจำไม่ได้ด้วยความมั่นใจ
คา Zoltu

เป็นไปได้ไหมว่า myprogram ใช้มากกว่า thread / process เดียว? Btw คุณยังสนใจที่จะแก้ปัญหานี้หรือไม่?
KWubbufetowicz

โปรแกรมนี้เป็นโปรแกรมทดสอบที่เขียนขึ้นเพื่อทดสอบพฤติกรรมนี้ มันเป็นเธรดเดี่ยวที่ตั้งใจทำเพื่อ จำกัด ผลลัพธ์ ฉันยังสนใจที่จะตอบคำถามนี้
คา Zoltu

หน้านี้จาก RedHatอาจช่วยได้ที่นี่ cpu.sharesเป็นตัวเลือกการกำหนดค่าที่แปลกประหลาดมาก ฉันขอแนะนำให้แยกสิ่งต่าง ๆ โดยใช้ CPU หากเป็นไปได้ให้ใช้cpuset.cpusแทน
สัญลักษณ์แทน

คำตอบ:


3

กลุ่ม Cg เป็นลำดับชั้นและพวกเขาได้รับมรดกโดยกระบวนการย่อยทั้งหมด ดังนั้นกระบวนการทั้งหมดจะต้องอยู่ในบางกลุ่ม โดยค่าเริ่มต้นมันเป็นกลุ่ม cgroup และโดยค่าเริ่มต้นมี 1024 หุ้นซึ่งเป็นสองเท่าเป็น A และ B ในตัวอย่างของคุณ

เวลาของ CPU จะถูกแชร์ในกลุ่ม betwean ตามน้ำหนักที่กำหนดไว้ใน cpu.shares

หาก A มี 1024 การแบ่งปันและ B 512 และ C 256 และ D 256 การกระจายเวลา cpu นั้นจะเป็น A - 50%, B - 25%, C และ D 12,5%


ดังนั้นกระบวนการใด ๆ ที่ไม่เปิดตัวด้วย cgexec จึงอยู่ในกลุ่มรากกลุ่ม cgroup ที่มี 1024 การแบ่งใช้แบ่งเท่า ๆ กันระหว่างเด็กที่อยู่ติดกันทั้งหมด เด็กคนหนึ่งทันทีดังกล่าวเป็น cgroup cgexecที่สร้างขึ้นโดยการโทร ดังนั้นcgexecกระบวนการที่ไม่ใช่จะได้รับ 50% และกระบวนการ cgrouped ทั้งหมดจะแบ่งปัน 50% ที่เหลือ ภายในกระบวนการกลุ่มที่พวกเขาแบ่งปัน 50% อย่างเท่าเทียมกันทั้งสองหมายความว่าได้รับ 25% นี่จะสมเหตุสมผล แต่มันไม่ใช่พฤติกรรมที่ฉันสังเกตเห็น สิ่งที่ฉันเห็นคือ 66%, 33% และ 33% คุณสามารถอัปเดตคำตอบเพื่อรวมรายละเอียดเพิ่มเติมและบางทีการกระจายตัวอย่าง
คา Zoltu

โอ้ฉันคิดว่าฉันเห็น กระบวนการใด ๆ บนระบบปฏิบัติการที่เปิดตัวโดยไม่cgexecได้รับ 1024 แชร์ กระบวนการใด ๆ ที่เปิดตัวด้วยการcgexecได้รับหุ้นที่ระบุไว้ ดังนั้นในกรณีนี้กระบวนการหนึ่งได้รับ 1024 การแบ่งปันและอีกสองได้รับ 512 กระบวนการผลการกระจายที่ฉันเห็น คุณคิดว่าจะปรับปรุงคำตอบเพื่อให้มีความชัดเจนมากขึ้นเช่นมีตัวอย่างหรือไม่?
คา Zoltu

ที่จริงแล้วยังไม่เพิ่มขึ้น 1024 + 512 + 512 = 2048. 512/2048 == 25%. ฉันไม่เชื่อว่าคำตอบนี้ถูกต้องจริงอย่างน้อยก็ไม่ใช่บนพื้นผิว
คา Zoltu

คุณมีกลุ่มอื่น ๆ บ้างไหม? มันอาจส่งผลกระทบต่อตัวเลข นอกจากนี้คุณยังสามารถตรวจสอบเอกสาร redhat ซึ่งเป็นตัวอย่างที่
คล้ายกันของ

ไม่มีสิ่งอื่นใดที่สำคัญในการใช้งานกล่องนี้ไม่มีการทำงานก่อนและหลังการทดสอบการทำงาน ตัวอย่างทั้งหมดแสดงเฉพาะสิ่งที่เกิดขึ้นเมื่อกระบวนการทั้งหมดเริ่มต้นด้วยการตั้งค่ากลุ่ม มันไม่ได้พูดถึงสิ่งที่เกิดขึ้นเมื่อบางกระบวนการไม่ได้ใช้ cgroups ซึ่งเป็นสิ่งที่ฉันพยายามหา
คา Zoltu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.