โฮมเซิร์ฟเวอร์ของฉันใช้งานฮาร์ดแวร์รุ่นเก่า (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
ผลที่ตามมา.)