วิธีตั้งค่าขีด จำกัด cpu สำหรับกระบวนการที่กำหนดอย่างถาวร Cpulimit และนิสัยดีไม่ทำงาน


12

มีคำถามที่คล้ายกันมากมาย แต่ไม่มีคำถามใดที่ช่วยฉันแก้ปัญหาได้

ฉันมี Ubuntu 11.10 บนเซิร์ฟเวอร์ (เป็นเวอร์ชั่นเดสก์ท็อป) ฉันมีเว็บไซต์ที่เปิดอยู่ มีกระบวนการหนึ่งที่สำคัญมาก แต่ไม่จำเป็นต้องเรียกใช้ในลำดับความสำคัญสูง ฉันต้องการ จำกัด การใช้งาน cpu อย่างถาวรสำหรับกระบวนการไม่ใช่สำหรับผู้ใช้ กระบวนการนี้ดำเนินการโดยฟังก์ชั่น exec (เป็นฟังก์ชั่น php ไม่ใช่กระบวนการของระบบ)

ดังนั้นฉันเห็นตัวเลือก 2 ตัว: 1. เพิ่มขีด จำกัด บางอย่างทุกครั้งที่มีการใช้งานฟังก์ชัน 2. จำกัด การใช้ cpu อย่างถาวรสำหรับกระบวนการนี้

ฉันพยายามใช้ "ดี" และ cpulimit แต่ดูเหมือนว่าจะไม่มีอะไรทำงาน ดีไม่มีผลใด ๆ และ cpulimit (ด้วย -e) พูดว่า: "ไม่พบกระบวนการเป้าหมาย"

ฉันเป็นผู้เริ่มต้นดังนั้นโปรดคิดว่าฉันไม่รู้อะไรเลย


คุณช่วยบอกสิ่งที่คุณได้ลอง กลุ่ม cg สามารถทำสิ่งนี้เพื่อคุณ
Panther

สำหรับการกำหนดค่าคุณสามารถเรียกใช้cgsnapshot -sเพื่อดึงข้อมูลโดยไม่ต้องเขียนไฟล์กำหนดค่าด้วยตนเองซึ่งไม่แนะนำให้ใช้หลัง
Mingliang Liu

คุณต้องการเร่งกระบวนการจริง ๆ หรือไม่เช่นต้องแน่ใจว่าไม่เกินเวลาที่กำหนดไว้หรือไม่
Ken Sharp

ฉันใช้วิธีนี้และได้ผลกับฉัน .. ubuntuforums.org/showthread.php?t=992706
มุสตาฟาซาลมาน

คำตอบ:


19

ในกรณีที่ไม่มีรายละเอียดที่ร้องขอ ...

นี่คือวิธีที่ฉันใช้ cgroups บน ubuntu

ตลอดโพสต์นี้คุณจะต้องเปลี่ยนตัวแปร "$ USER" เป็นผู้ใช้ที่ดำเนินการ

ฉันเพิ่มข้อมูลสำหรับหน่วยความจำเช่นเดียวกับที่จะเป็นคำถามที่พบบ่อยถ้าคุณไม่ต้องการมันไม่ได้ใช้มัน

1) ติดตั้ง cgroup-bin

sudo apt-get install cgroup-bin

2) รีบูต cgroups ตั้งอยู่ที่/sys/fs/cgroup

3) สร้าง cgroup สำหรับผู้ใช้ของคุณ (เจ้าของกระบวนการ)

# Change $USER to the system user running your process.
sudo cgcreate -a $USER -g memory,cpu:$USER

4) ผู้ใช้ของคุณสามารถจัดการทรัพยากรได้ ตามค่าเริ่มต้นผู้ใช้จะได้รับ 1024 cpu units (แชร์) ดังนั้นเพื่อ จำกัด ประมาณ 10% cpu หน่วยความจำมีหน่วยเป็นไบต์ ...

# About 10 % cpu
echo 100 > /cgroup/cpu/$USER/cpu.shares

# 10 Mb
echo 10000000 > /cgroup/memory/$USER/memory.limit_in_bytes

5) เริ่มกระบวนการของคุณ (เปลี่ยน exec เป็น cgexec)

# -g specifies the control group to run the process in
# Limit cpu
cgexec -g cpu:$USER command <options> &

# Limit cpu and memory
cgexec -g memory,cpu:$USER command <options> &

องค์ประกอบ

สมมติว่ากลุ่ม cg เหมาะกับคุณ;)

แก้ไข/etc/cgconfig.confเพิ่มใน cgroup ที่คุณกำหนดเอง

# Graphical
gksudo gedit /etc/cgconfig.conf

# Command line
sudo -e /etc/cgconfig.conf

เพิ่มใน cgroup ของคุณ เปลี่ยน $ USER เป็นชื่อผู้ใช้ที่เป็นเจ้าของกระบวนการอีกครั้ง

group $USER {
# Specify which users can admin (set limits) the group
perm {    
    admin {
        uid = $USER;
    }
# Specify which users can add tasks to this group
    task {
        uid = $USER;
    }
}
# Set the cpu and memory limits for this group
cpu {
    cpu.shares = 100;
    }
memory {
    memory.limit_in_bytes = 10000000;
    }
}

นอกจากนี้คุณยังสามารถระบุกลุ่มgid=$GROUP/etc/cgconfig.conf มีความคิดเห็นดี

ตอนนี้เรียกใช้กระบวนการของคุณอีกครั้งด้วย cgexec -g cpu:$USER command <options>

คุณสามารถดูกระบวนการของคุณ (โดย PID) ใน /sys/fs/cgroup/cpu/$USER/tasks

ตัวอย่าง

bodhi @ ufbt: ~ $ cgexec -g cpu: bodhi sleep 100 &

[1] 1499

bodhi @ ufbt: ~ $ cat / sys / fs / cgroup / cpu / bodhi / งาน

1499

สำหรับข้อมูลเพิ่มเติมโปรดดูที่: http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/


2
ฉันจัดการจนเสร็จสิ้นส่วนที่ 1 ใช้งานได้ แต่คุณควรเพิ่มข้อมูลที่กระบวนการ จำกัด ในขณะที่กระบวนการอื่นต้องการซีพียู / หน่วยความจำ ไม่ชัดเจน - และฉันต้องใช้เวลาคิดนาน (เพราะฉันเป็นคนขอทาน) ฉันเข้าใจถูกต้องหรือไม่ว่า "การกำหนดค่า" คือการบันทึกการตั้งค่าแม้หลังจากรีบูต
Rafal

1
ดีใจที่คุณได้รับมันเรียง มีเส้นโค้งการเรียนรู้เล็กน้อย =) ใช่การกำหนดค่าคือการรักษาการตั้งค่าไว้ตลอดการบูท
Panther

เมื่อฉันใช้ cgroup จากบรรทัดคำสั่งมันทำงานได้ดี แต่เมื่อฉันเรียกใช้คำสั่งเดียวกันจากฟังก์ชั่น exec ใน php: (<? php exec ("cgexec -g cpu: GroupHere NameOfProcess InputFile OutputFile") มันใช้งานไม่ได้แตกต่างเพียงอย่างเดียวจากบรรทัดคำสั่งที่ฉันใช้ไฟล์ที่อยู่ใน โฟลเดอร์ที่ผมอยู่ในและจาก PHP ผมใช้เส้นทางยาวเพื่อไฟล์เหล่านั้นความคิดสิ่งที่อาจจะมีปัญหาผมใช้ผู้ใช้เดียวกันในทั้งสองกรณี..
Rafal

1
@Rafal: ฉันไม่ได้แสดงความคิดเห็นครั้งแรกของคุณถูกต้องหน่วยความจำควรถูก จำกัด แม้ว่าจะไม่มีกระบวนการอื่น ๆ ที่ใช้หน่วยความจำมากขึ้น
Flimm

1
@Flimm มีเพียง 2 กระบวนการเท่านั้นที่ทำงานเมื่อฉันทดสอบโซลูชันนี้ - apache และกระบวนการที่ควร จำกัด เมื่อไม่มีการเชื่อมต่อ apache ขึ้นหรือมีเพียงหนึ่งการเชื่อมต่อกับ apache กระบวนการที่ จำกัด นั้นใช้ CPU 100% มันมีข้อ จำกัด เพียงครั้งเดียวที่การเชื่อมต่อหลายครั้งของ apache เพิ่มขึ้น (ฉันทำสิ่งนี้โดยเว็บไซต์ที่รีเฟรชมากจากเว็บเบราว์เซอร์) ดังนั้นอาจเป็นกรณีที่ไม่มีกระบวนการอื่นทำงาน
Rafal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.