Score:0

วิธี จำกัด กระบวนการโต้ตอบที่รันอยู่แล้วด้วย cgroup2

ธง br

โฮมเซิร์ฟเวอร์ของฉันใช้งานฮาร์ดแวร์รุ่นเก่า (Core i5-3450, ซอฟต์แวร์ RAID1 บนดิสก์ SATA) และมักจะมีปัญหาเมื่อฉันเรียกใช้สิ่งที่เน้นประสิทธิภาพ เช่น งานคอมไพล์นอกเหนือจากบริการ "ปกติ" ที่ทำงานในเบื้องหลัง (DNS, เว็บ, DHCP, Mail ฯลฯ เป็นต้น)

เมื่อเร็ว ๆ นี้ฉันเกือบจะทิ้งระบบของฉันเมื่องานคอมไพล์มี CPU เกือบ 100% และส่งผลให้การรอ I/O พุ่งสูงขึ้นเช่นกัน และโดยพื้นฐานแล้วไม่มีกระบวนการอื่นใดที่จะได้รับทรัพยากรฟรีอีกต่อไป

ฉันอ่านเกี่ยวกับ cgroup2 และลองดู ตั้งค่าตัวเลือกด้วง systemd.unified_cgroup_hierarchy=1 และรีบูต สร้าง cgroup ใหม่ เปิดใช้งาน I/O และตัวควบคุม CPU และสามารถโยน PID ของคอมไพเลอร์ของฉันลงใน cgroup.procs และสามารถใส่ลงใน "พื้นหลัง" ได้สำเร็จโดยใช้ CPU เพียง 5% และไม่รบกวนส่วนที่เหลือของ ระบบ. งานคอมไพล์ใช้เวลาเกือบตลอดไป (หลายวัน) แต่ฉันก็ไม่รังเกียจ อย่างไรก็ตาม หลายครั้งต่อวัน จู่ๆ การตั้งค่า cpu.max ของฉันก็หายไปและระบบเสียสมดุลอีกครั้งหลังจากอ่านเพิ่มเติมเกี่ยวกับ cgroup และ systemd ฉันเชื่อว่าเป็นเพราะฉันเข้าไปยุ่งกับการควบคุม systemd และโดยทั่วไปแล้ว systemd ดูเหมือนจะรีเซ็ตการตั้งค่าที่กำหนดเองกลับเป็นค่าเริ่มต้น (cpu.max == 'max 1000000') ซึ่งจากนั้นก็เริ่มทำลายระบบของฉัน

ดังนั้นฉันจึงอ่านเกี่ยวกับวิธีการทำอย่างถูกต้อง

ก่อนอื่นฉันตั้งค่า ผู้รับมอบสิทธิ์=จริง ถึงฉัน [email protected] ไฟล์และรีบูต

จากนั้นฉันพยายามวางไข่ "งาน" ใหม่โดยเรียกใช้ systemd-run --user CPUQuota=5% stress-ng --matrix 0 -t 10m ซึ่งทำงานได้สำเร็จ เช่น การใช้งาน CPU ต่อกระบวนการถูกจำกัดไว้ที่ 5%/4 ต่อเธรดความเครียด!

ฉันสามารถดูไดเร็กทอรีใหม่ด้านล่าง /sys/fs/cgroup/user.slice/user-1000.slice/[email protected] ซึ่งมีการตั้งค่าของฉัน:

cat /sys/fs/cgroup/user.slice/user-1000.slice/[email protected]/run-raef937da699b484b80f1bf03bc049f7a.service/cpu.max
5,000 100,000

และ cgroups.procs มี PID ของ stress-ng ที่สอดคล้องกัน ความสำเร็จ!

ตอนนี้ฉันอาจต้องการเปลี่ยนการตั้งค่านั้น ไม่ว่าจะเป็นเพราะ ด้วย ต่ำหรือเพราะเหตุอื่นใด ฉันขอเขียนค่าอื่นโดยตรงไปยัง cpu.max ได้ไหม หรือฉันควรจะใช้เครื่องมือคำสั่ง systemd เพื่อทำเช่นนั้น? (อันไหน?)

ปัญหาอื่นของฉันคือ: ถ้าฉันไม่รู้ล่วงหน้าว่าคำสั่งที่ฉันกำลังจะเรียกใช้อาจมีผลกระทบที่ไม่ดีต่อประสิทธิภาพของระบบ ฉันจะจำกัดคำสั่งในภายหลังโดยไม่ฆ่าและรันใหม่โดยใช้ systemd- ได้อย่างไร วิ่ง?

สมมติว่าฉันเพิ่งเรียกใช้ "stress-ng" ในเชลล์ของฉัน (โดยไม่ต้องรัน systemd) ฉันเห็นว่า PID เป็นสมาชิกของกลุ่มเซสชันปกติ

แมว /proc/742779/cgroup
0::/user.slice/user-1000.slice/session-2232.scope

แต่ นั่น cgroup ได้รับการจัดการโดย systemd ดังนั้นฉันจึงไม่ควร (และฉันก็ไม่สามารถมีสิทธิ์ผู้ใช้ตามปกติ) เพื่อเขียนลงในโครงสร้าง cpu.max, io.max และอื่น ๆ ใช่ไหม

ฉันมีข้อจำกัดอะไรบ้างสำหรับการรันกระบวนการที่กำลังรันอยู่ใน session-xxx.scope แทนที่จะอยู่ภายใต้ของฉัน [email protected]? ฉันสามารถ "รับกรรมสิทธิ์" ของ PID 742779 และโอนไปยังไฟล์ของฉันได้หรือไม่ [email protected] การประชุม?

ฉันรู้ว่ามี cgcreate, cgclassify ฯลฯ แต่นั่นคือ cgroup1 เท่านั้นใช่ไหม (อย่างน้อยก็ให้ผม cgcreate: การเริ่มต้น libcgroup ล้มเหลว: ไม่ได้เมาต์ Cgroup ผลที่ตามมา.)

Score:0
ธง us

ตามที่เขียนไว้แล้วในที่อื่น ตั้งค่าคุณสมบัติ systemctl(หน้าจัดการ) อาจเป็นสิ่งที่คุณกำลังมองหา

cyberschlumpf avatar
br flag
ขอบคุณ schtobia! มีวิธีการเปลี่ยน PID เฉพาะที่ฉันต้องการจำกัดกลุ่มที่แตกต่างกันโดยสิ้นเชิงหรือไม่ `systemctl set-property' จะส่งผลต่อ cgroup ทั้งหมดที่มี PID อื่น ๆ อยู่ในนั้นเสมอ ใช่ไหม
us flag
ฉันไม่แน่ใจ. `libcgroup` ดูเหมือนจะ [cgroups v2 สามารถ](https://github.com/libcgroup/libcgroup/issues/12) แต่ฉันไม่มีประสบการณ์กับมัน และใช่ `systemctl set-property` *จะ* มีผลกับ cgroup ทั้งหมดเสมอ - หรือถูกต้องกว่านั้น คือทั้ง [unit](https://www.freedesktop.org/software/systemd/man/systemd.unit.html ).

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา