วิธีจำกัดการใช้งาน CPU และ RAM ของกระบวนการด้วย Cgroups บน Ubuntu

ใน Ubuntu วิธีที่ปลอดภัยที่สุดในการจำกัดปริมาณงานด้วย cgroups คือการปล่อยให้ systemd สร้างและจัดการกลุ่มควบคุมเอง ใช้systemd-runสำหรับคำสั่งที่คุณกำลังเริ่มต้น หรือกำหนดค่าบริการ systemd เมื่อข้อจำกัดนั้นต้องคงอยู่หลังจากการรีสตาร์ท ตั้งCPUQuota=ค่าขีดจำกัดเวลา CPU ที่แน่นอน และเลือกระหว่างMemoryHigh=ค่าแรงดันและMemoryMax=ค่าขีดจำกัดหน่วยความจำที่แน่นอน ข้อจำกัดเหล่านี้ใช้กับหน่วยและกระบวนการลูกของมันด้วยกัน

cgroup (control group) คือกลไกในเคอร์เนลของลินุกซ์ที่จัดระเบียบกระบวนการต่างๆ เพื่อให้ระบบสามารถตรวจสอบและควบคุมการใช้ทรัพยากรได้ systemd ของ Ubuntu ได้จัดวางบริการต่างๆ ไว้ใน cgroup อยู่แล้ว ดังนั้นผู้ใช้ส่วนใหญ่จึงไม่จำเป็นต้องสร้างไดเร็กทอรี/sys/fs/cgroupด้วยตนเอง ตัวอย่างด้านล่างใช้ส่วนติดต่อควบคุมทรัพยากรของ systemd และควรตรวจสอบกับเวอร์ชัน systemd ที่ติดตั้งใน Ubuntu เวอร์ชันของคุณ

การจำลองเทอร์มินัลสไตล์ Ubuntu เพื่อตรวจสอบเวอร์ชัน systemd และประเภทการเมานต์ cgroup2fs ก่อนตั้งค่าขีดจำกัดทรัพยากร
ภาพจำลองเทอร์มินัลสำหรับตรวจสอบ systemd และการเมานต์ cgroup v2 เวอร์ชันและผลลัพธ์ที่แสดงเป็นเพียงตัวอย่าง ไม่ใช่ผลการทดสอบจริง

เลือกตัวควบคุมที่ตรงกับปัญหา

วิธีสิ่งที่มันควบคุมเหมาะสมที่สุดข้อแลกเปลี่ยนหลัก
systemd-runขอบเขตชั่วคราวโควต้า CPU และขีดจำกัดหน่วยความจำสำหรับคำสั่งที่เรียกใช้ใหม่และคำสั่งที่สืบทอดมาจากคำสั่งนั้นการสร้าง การเขียนสคริปต์ การนำเข้า หรืองานแบบแบตช์ครั้งเดียวขอบเขตการใช้งานเป็นแบบชั่วคราวและจะสิ้นสุดลงเมื่อปริมาณงานเสร็จสิ้น โดยจะไม่ผูกติดกับกระบวนการใดๆ ที่กำลังทำงานอยู่แล้ว
การตั้งค่าบริการ systemdทรัพยากรสำหรับ cgroup ของบริการ รวมถึงกระบวนการย่อยโปรแกรมหรือแอปพลิเคชันที่ควรคงค่าขีดจำกัดเดิมไว้หลังจากรีบูตเครื่องจำเป็นต้องกำหนดค่าบริการและโดยปกติจะต้องรีสตาร์ทเพื่อใช้งานการตั้งค่าใหม่
ไฟล์ cgroup v2 โดยตรงตัวควบคุมระดับเคอร์เนล เช่นcpu.maxและmemory.maxรันไทม์คอนเทนเนอร์, ตัวจัดการ cgroup ที่ได้รับมอบหมาย หรือการบริหารจัดการเฉพาะทางต้องดำเนินการด้วยตนเองมากขึ้น เนื่องจาก systemd เป็นเจ้าของโครงสร้างลำดับชั้นส่วนใหญ่ของ Ubuntu และการเขียนลงในโครงสร้างที่จัดการโดย systemd อาจขัดแย้งกับ systemd หรือล้มเหลวเนื่องจากสิทธิ์และการมอบหมาย
niceหรือCPUWeight=ลำดับความสำคัญของ CPU เมื่อกลุ่มต่างๆ แข่งขันกันลดลำดับความสำคัญของงานเบื้องหลังลง ในขณะที่ยังคงอนุญาตให้ใช้ CPU ที่ว่างอยู่นี่ไม่ใช่ข้อจำกัดด้าน CPU ที่เข้มงวด และไม่ได้จำกัดหน่วยความจำ

สำหรับเครื่อง Ubuntu ที่ใช้งานแบบโต้ตอบส่วนใหญ่ ขอบเขตชั่วคราว (transient scope) เป็นตัวเลือกที่รวดเร็วและสามารถย้อนกลับได้ สำหรับบริการที่ใช้งานจริง ให้ใช้หน่วยบริการ (service unit) เพื่อให้มีการบันทึกนโยบายและเรียกคืนได้เมื่อบูตเครื่อง ใช้ไฟล์ cgroup โดยตรงเฉพาะเมื่อคุณกำลังจัดการลำดับชั้นที่ได้รับมอบหมายอย่างตั้งใจ หรือกำลังสร้างเวิร์กโฟลว์คอนเทนเนอร์/รันไทม์

ตรวจสอบระบบ Ubuntu ก่อนตั้งค่าข้อจำกัด

ขั้นแรก ตรวจสอบว่า systemd พร้อมใช้งานหรือไม่ และระบบไฟล์ cgroup เป็น unified v2 หรือไม่:

systemctl --version
stat -fc %T /sys/fs/cgroup

ผลลัพธ์cgroup2fsจากคำสั่งที่สองบ่งชี้ว่าระบบไฟล์เป็นแบบ cgroup v2 ที่รวมกัน ระบบปฏิบัติการ Ubuntu และระบบที่ปรับแต่งเองอาจแตกต่างกัน ดังนั้นอย่าคิดว่าทุกเครื่องจะมีลำดับชั้นหรือคุณสมบัติของ systemd เหมือนกัน คุณสามารถตรวจสอบเวอร์ชัน systemd ปัจจุบันได้ด้วยคำสั่งแรก หากการเมานต์ cgroup ไม่ใช่ v2 คุณสมบัติของทรัพยากรหรือพฤติกรรมของคอนโทรลเลอร์บางอย่างอาจแตกต่างกัน โปรดศึกษาคู่มือ Ubuntu สำหรับเวอร์ชันที่ติดตั้งก่อนคัดลอกการกำหนดค่า

เลือกค่าต่างๆ หลังจากวัดปริมาณงานแล้ว เว้นพื้นที่ไว้สำหรับส่วนที่เหลือของระบบ และอย่าลืมว่าข้อจำกัดที่ตั้งไว้สำหรับบริการของผู้ใช้จะถูกจำกัดโดยข้อจำกัดใดๆ ที่ตั้งไว้สำหรับสไลซ์แม่ด้วย cgroup ย่อยไม่สามารถรับทรัพยากรได้มากกว่าที่ cgroup บรรพบุรุษอนุญาต

จำกัดคำสั่งที่คุณกำลังจะเริ่มต้น

สำหรับการเรียกใช้คำสั่งในเซสชันผู้ใช้ของคุณเอง ให้เรียกใช้คำสั่งนั้นในขอบเขตชั่วคราวด้วยsystemd-run --user --scopeตัวอย่างเช่น:

การจำลองเทอร์มินัลสไตล์ Ubuntu ที่แสดงการเรียกใช้งาน Python worker โดยกำหนดโควต้า CPU 50 เปอร์เซ็นต์ และขีดจำกัดหน่วยความจำ 700 MB และ 900 MB
ภาพจำลองหน้าจอเทอร์มินัลแสดงคำสั่ง systemd-run แบบครั้งเดียว พร้อมโควต้า CPU ขีดจำกัดแรงดันหน่วยความจำ และขีดจำกัดหน่วยความจำสูงสุด
systemd-run --user --scope --unit=worker-capped \
  -p CPUQuota=50% \
  -p MemoryHigh=700M \
  -p MemoryMax=900M \
  -- python3 /opt/worker.py

แทนที่คำสั่ง Python ด้วยโปรแกรมที่คุณต้องการเรียกใช้งานจริง ตัวอย่างนี้กำหนดแบนด์วิดท์ CPU สูงสุดให้กับ cgroup เทียบเท่ากับครึ่งหนึ่งของ CPU หนึ่งตัว เริ่มจัดการแรงดันหน่วยความจำเมื่อถึง 700 MiB และตั้งค่าหน่วยความจำสูงสุดแบบฮาร์ดแวร์ไว้ที่ 900 MiB ค่าหน่วยความจำใช้หน่วยฐาน 1024 ของ systemd โควต้า100%หมายถึงเวลาใช้งานได้สูงสุดหนึ่ง CPU 200%สามารถใช้งานได้สูงสุดสอง CPU เมื่อมีให้ใช้งาน ไม่ได้หมายถึงเปอร์เซ็นต์ของคอร์ทั้งหมดในคอมพิวเตอร์

คำสั่งนี้จะทำงานในโหมดพื้นหน้าเนื่องจากเป็นขอบเขตการทำงาน เมื่อคำสั่งสิ้นสุดลง หน่วยชั่วคราวจะหายไป ลบ--userเฉพาะในกรณีที่คุณต้องการใช้ตัวจัดการระบบและมีสิทธิ์ที่จำเป็น สำหรับหน่วยชั่วคราวที่ครอบคลุมทั้งระบบ ให้เรียกใช้คำสั่งsudoโดยใช้ตัวเลือกคำสั่งที่เหมาะสม การตั้งค่าทรัพยากรอาจถูกปฏิเสธหากตัวจัดการหรือตัวควบคุม cgroup ไม่รองรับ

กำหนดข้อจำกัดให้กับบริการ systemd ที่ทำงานอย่างต่อเนื่อง

สำหรับบริการเช่นworker.serviceให้สร้าง drop-in แทนการแก้ไขไฟล์หน่วยของผู้จำหน่าย เรียกใช้คำสั่งsudo systemctl edit worker.serviceและเพิ่ม:

แบบจำลองการกำหนดค่าบริการ systemd ที่ประกอบด้วยการตั้งค่า CPUQuota, MemoryHigh และ MemoryMax
ตัวอย่างการกำหนดค่าบริการ systemd พร้อมการควบคุม CPU และหน่วยความจำแบบถาวร โปรดใช้ชื่อบริการจริงและค่าที่เหมาะสมกับปริมาณงานของคุณ
[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M

บันทึกไฟล์ drop-in จากนั้นโหลดคำจำกัดความหน่วยของ systemd ใหม่ และรีสตาร์ทบริการเพื่อให้กระบวนการเริ่มต้นภายใต้นโยบายที่แก้ไขแล้ว:

sudo systemctl daemon-reload
sudo systemctl restart worker.service

ควรกำหนดขีดจำกัดหน่วยความจำอย่างระมัดระวัง หากบริการไม่สามารถเรียกคืนหน่วยความจำได้เพียงพอต่ำกว่าMemoryMaxขีดจำกัดที่กำหนดไว้ เคอร์เนลอาจเรียกใช้กลไกการจัดการหน่วยความจำไม่เพียงพอภายใน cgroup นั้น ซึ่งอาจยุติกระบวนการหนึ่งหรือหลายกระบวนการในกลุ่มบริการและขัดจังหวะการทำงาน รูปแบบที่ปลอดภัยกว่ามักจะเป็นการตั้งค่าMemoryHighในระดับที่การเรียกคืนและการจำกัดการใช้งานเป็นที่ยอมรับได้ จากนั้นจึงตั้งค่าMemoryMaxให้สูงขึ้นเป็นขีดจำกัดสุดท้าย ทดสอบด้วยภาระงานสูงสุดที่สมจริงก่อนที่จะใช้งานขีดจำกัดที่เข้มงวด

ตรวจสอบอุปกรณ์และสังเกตพฤติกรรมของมัน

สำหรับออสซิลโลสโคปแบบชั่วคราว ให้ตรวจสอบสถานะโดยใช้ชื่อหน่วยที่คุณระบุไว้:

ภาพจำลองเทอร์มินัลที่แสดงคำสั่ง systemctl status และ systemd-cgtop ที่กำลังตรวจสอบขอบเขตงานชั่วคราว
ภาพแสดงสถานะและการตรวจสอบ cgroup ตัวเลข CPU และหน่วยความจำที่แสดงในที่นี้ไม่ใช่ค่าที่วัดได้จากการใช้งานจริง
systemctl --user status worker-capped.scope
systemd-cgtop

สำหรับบริการระบบ ให้ละเว้น--userในคำสั่งสถานะ มุมมองสถานะจะยืนยันว่าหน่วยนั้นมีอยู่และทำงานอยู่systemd-cgtopแสดงการใช้งานทรัพยากรแบบเรียลไทม์ตามกลุ่มควบคุม หากต้องการตรวจสอบคุณสมบัติที่กำหนดค่าไว้ ให้สอบถามหน่วยโดยตรง เช่น:

systemctl --user show worker-capped.scope \
  -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

ปริมาณหน่วยความจำที่รายงานสำหรับ cgroup ไม่จำเป็นต้องเท่ากับปริมาณหน่วยความจำที่ใช้จริงของกระบวนการใดกระบวนการหนึ่งเสมอไป เพราะมันรวมถึงหน่วยความจำที่ถูกเรียกเก็บจากกลุ่ม และอาจรวมถึงกระบวนการย่อยของเวิร์กโหลดด้วย ควรพิจารณาการตรวจสอบนี้เป็นหลักฐานแสดงถึงพฤติกรรมของเวิร์กโหลดนี้เมื่อเวลาผ่านไป ไม่ใช่เป็นเพียงตัวเลขเดียวที่จะนำไปใช้ในการปรับให้เหมาะสมโดยไม่คิดไตร่ตรอง

แล้วถ้ากระบวนการนั้นกำลังทำงานอยู่ล่ะ?

systemd-runคำสั่งนี้จะเริ่มต้นคำสั่งใหม่ภายในหน่วยใหม่ โดยจะไม่นำ PID ที่มีอยู่แล้วมาใส่ในขอบเขตนั้น หากกระบวนการนั้นเป็นส่วนหนึ่งของบริการ systemd ให้ใช้การตั้งค่ากับบริการนั้นด้วย drop-in หรือหากต้องการเปลี่ยนแปลงชั่วคราว ให้ใช้ รูปแบบ sudo systemctl set-property --runtime worker.service CPUQuota=50% MemoryHigh=700M MemoryMax=900Mนี้--runtimeเป็นแบบชั่วคราวและจะไม่แทนที่การกำหนดค่าบริการแบบถาวร

หากกระบวนการนั้นเป็นโปรแกรมปกติในเซสชันเดสก์ท็อปของคุณ วิธีที่ปลอดภัยและง่ายที่สุดคือการหยุดโปรแกรมแล้วเริ่มใหม่ภายใต้systemd-runการใช้คุณสมบัติกับส่วนที่กว้างกว่า เช่น ส่วนของผู้ใช้ทั้งหมด อาจส่งผลกระทบต่อแอปพลิเคชันที่ไม่เกี่ยวข้องหลายตัว การย้ายกระบวนการโดยการเขียน PID ลงในไฟล์ cgroup จำเป็นต้องควบคุมลำดับชั้นการมอบหมายที่เกี่ยวข้องและต้องเคารพกฎการจัดวางกระบวนการ cgroup v2 อย่าเขียนลงในไดเร็กทอรีที่จัดการโดย systemd โดยอาศัยการคาดเดา

วิธีการเลือกนโยบาย CPU และหน่วยความจำ

  • ต้องการกำหนดขีดจำกัดการใช้งาน CPU ที่แน่นอนใช่ไหมเลือกค่านี้CPUQuota=ค่าที่ต่ำกว่าจะช่วยลดการใช้งาน CPU สูงสุด แต่จะทำให้การประมวลผลช้าลงและเพิ่มเวลาในการรอคิว
  • ต้องการลำดับความสำคัญต่ำกว่าใช่ไหมลองพิจารณาใช้CPUWeight=แทนการกำหนดโควต้า การจัดสรรน้ำหนักจะแบ่งใช้ CPU ตามสัดส่วนการใช้งาน ไม่ได้สงวนเปอร์เซ็นต์คงที่หรือป้องกันการใช้งาน CPU ที่ว่างอยู่
  • ต้องการจัดการแรงดันหน่วยความจำโดยไม่ให้หยุดทำงานทันทีใช่ไหม?ตั้งค่านี้MemoryHigh=เป็นเกณฑ์แรงดันหลัก แล้วสังเกตความหน่วงและพฤติกรรมการเรียกคืนหน่วยความจำ
  • ต้องการขอบเขตการกักเก็บขั้นสุดท้ายหรือไม่?เพิ่มMemoryMax=พื้นที่ว่างให้เพียงพอสำหรับปริมาณสูงสุดปกติ เตรียมพร้อมรับมือกับพฤติกรรม OOM (Out of Ground) เมื่อไม่สามารถเคารพขอบเขตที่กำหนดได้
  • กำลังใช้งานคอนเทนเนอร์อยู่แล้วใช่ไหม?ควรเลือกใช้แฟล็ก CPU และหน่วยความจำที่ตัวจัดการคอนเทนเนอร์รองรับ ซึ่งจะกำหนดค่า cgroups สำหรับคอนเทนเนอร์นั้นและเหมาะสมกับวงจรชีวิตของมัน

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

เอกสารอ้างอิง

ฝากความเห็น

ดาวน์โหลด FlightGear ได้ฟรี: คู่มือการติดตั้งอย่างเป็นทางการ

ดาวน์โหลด FlightGear ได้ฟรี: คู่มือการติดตั้งอย่างเป็นทางการ

ดาวน์โหลด FlightGear ได้ฟรีจากเว็บไซต์ทางการ เปรียบเทียบแพ็กเกจสำหรับ Windows, macOS และ Linux ติดตั้งไฟล์ข้อมูล และเริ่มต้นการบินครั้งแรกของคุณ

OKSampler: โปรแกรมแซมpler เพลงฟรีและใช้งานง่าย สำหรับสร้างจังหวะจากคีย์บอร์ด

OKSampler: โปรแกรมแซมpler เพลงฟรีและใช้งานง่าย สำหรับสร้างจังหวะจากคีย์บอร์ด

OKSampler แปลงคลิป MP3 เป็นคีย์บนแป้นพิมพ์และสามารถเล่นเสียงวนซ้ำได้ เรียนรู้ว่าซอฟต์แวร์ฟรีรุ่นเก่านี้ทำอะไรได้บ้าง ฟีเจอร์เก่าๆ สิ้นสุดลงตรงไหน และควรตรวจสอบอะไรบ้างก่อนดาวน์โหลด

แอปพลิเคชัน Google Tasks สำหรับเดสก์ท็อป: วิธีใช้งานบนคอมพิวเตอร์

แอปพลิเคชัน Google Tasks สำหรับเดสก์ท็อป: วิธีใช้งานบนคอมพิวเตอร์

เปิด Google Tasks ในเบราว์เซอร์ เพิ่มทางลัด Chrome หรือเปิดใช้งานในรูปแบบแอป และจัดการรายการสิ่งที่ต้องทำตามวันที่ผ่านปฏิทินและ Gmail

วิธีเล่นเกม Don't Starve Together บน Linux

วิธีเล่นเกม Don't Starve Together บน Linux

ติดตั้งเกม Don't Starve Together เวอร์ชัน Linux ผ่าน Steam เริ่มเล่นในโลกใหม่ หรือเข้าร่วมกับเพื่อน ๆ โดยทำตามขั้นตอนการตั้งค่าและการแก้ไขปัญหาเหล่านี้

วิธีเล่น DiRT Rally บน Linux: การตั้งค่า Steam และการแก้ไขปัญหา Proton

วิธีเล่น DiRT Rally บน Linux: การตั้งค่า Steam และการแก้ไขปัญหา Proton

เรียนรู้วิธีเล่น DiRT Rally บน Linux หากคุณมีเกมนี้อยู่แล้วบน Steam: ติดตั้งเวอร์ชันสำหรับระบบ Linux โดยเฉพาะ เปิดใช้งาน และใช้ Proton เป็นตัวเลือกสำรองเท่านั้น

วิธีเล่นเกม Squad บน Linux ด้วย Steam Proton

วิธีเล่นเกม Squad บน Linux ด้วย Steam Proton

ติดตั้งเกม Squad บน Linux โดยใช้ Steam Play และ Proton จากนั้นติดตั้งเกม เลือกเครื่องมือตรวจสอบความเข้ากันได้ และแก้ไขปัญหาเกี่ยวกับการโกงเกม

วิธีการติดตั้ง Linux Mint Debian Edition 5 “Elsie” จาก USB

วิธีการติดตั้ง Linux Mint Debian Edition 5 “Elsie” จาก USB

ดาวน์โหลดและตรวจสอบไฟล์ ISO ของ LMDE 5 ที่จัดเก็บไว้ สร้าง USB ที่สามารถบูตได้ และเลือกการตั้งค่าการติดตั้งที่ปลอดภัย Elsie หมดอายุการใช้งานแล้ว โปรดดู LMDE เวอร์ชันปัจจุบัน

วิธีสร้างไดรฟ์ USB ที่สามารถบูต Windows 11 ได้บนระบบ Linux

วิธีสร้างไดรฟ์ USB ที่สามารถบูต Windows 11 ได้บนระบบ Linux

สร้าง USB สำหรับติดตั้ง Windows 11 บน Linux ด้วย Ventoy: ดาวน์โหลดไฟล์ ISO อย่างเป็นทางการ ติดตั้ง Ventoy อย่างปลอดภัย คัดลอกอิมเมจ และบูตไปยังพีซีเป้าหมาย

วิธีการติดตั้ง Wireshark บน Linux: Ubuntu, Fedora, Arch และอื่นๆ

วิธีการติดตั้ง Wireshark บน Linux: Ubuntu, Fedora, Arch และอื่นๆ

ติดตั้ง Wireshark บน Ubuntu, Debian, Fedora, Arch หรือ openSUSE โดยใช้คำสั่งแพ็กเกจปัจจุบัน จากนั้นกำหนดค่าการจับแพ็กเก็ตแบบเรียลไทม์ได้อย่างปลอดภัย

วิธีการติดตั้ง Devuan Linux จาก USB ที่สามารถบูตได้

วิธีการติดตั้ง Devuan Linux จาก USB ที่สามารถบูตได้

ติดตั้ง Devuan Excalibur จากไฟล์ ISO แบบ Live บนเดสก์ท็อป ตรวจสอบไฟล์ที่ดาวน์โหลด สร้าง USB ที่สามารถบูตได้ ป้องกันพาร์ติชั่นที่มีอยู่ และทำการติดตั้งให้เสร็จสมบูรณ์ด้วย Refracta Installer