วิธี จำกัด การใช้ทรัพยากรเพื่อบันทึก CPU + RAM สำหรับกระบวนการบางอย่าง


25

ฉันมีเซิร์ฟเวอร์ dev ที่sshdบางครั้งหยุดทำงานเนื่องจากเครื่องไม่มี RAM ใช่เรามีหน่วยความจำเหลือน้อยและการอัพเกรดไม่ใช่ตัวเลือกที่เป็นไปได้ในขณะนี้ สิ่งที่ฉันต้องการจะทำคือการบอกเครื่อง: "ทำสิ่งที่คุณต้องการ แต่ให้เหลือ 20MB และ CPU สำหรับsshd!"

จะทำอย่างไร?


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

2
@Marcin ฉันไม่คิดว่าฉันจะทำอะไรใหญ่ ๆ การแก้ไขข้อความ แม้ว่าsshdจะมีความประพฤติดีฉันคิดว่ามันจะติดอยู่ถ้ามี CPU / RAM ไม่เพียงพอที่จะใช้ใช่ไหม
phunehehe

เมื่อ linux มีหน่วยความจำไม่เพียงพอก็จะเริ่มฆ่ากระบวนการเพื่อเรียกคืนหน่วยความจำ คุณอาจเห็นการทำงานของ OOM (หน่วยความจำไม่เพียงพอ) ฉันไม่รู้ว่าทำไมมันจะตัดสินใจฆ่า sshd ของคุณอย่างสม่ำเสมอแม้ว่า คุณเคยเห็น sshd จริง ๆ แล้วรั่ว (ขนาดโต) อย่างน่ากลัวก่อนที่มันจะระเบิดขึ้นหรือมันทำงานได้ดีในช่วงเวลาหนึ่งและจะตายต่อไปหรือไม่
Marcin

@ โอกาสมาร์ตินคือถ้าเขาเป็น OOM ระบบจะจมลงมากจนเขาไม่สามารถตอบสนองมันไม่ใช่ปัญหา sshd แต่เป็นปัญหากับภาระของเขา น่าเสียดายที่ฉันไม่รู้คำตอบสำหรับสิ่งนี้
xenoterracide

@phunehehe คุณแน่ใจหรือว่าปัญหาคือไม่มีหน่วยความจำสำหรับ ssh และไม่โหลดของคุณผ่านหลังคา? sshd ให้ข้อผิดพลาดใด ๆ โหลดบนกล่องคืออะไร? และสิ่งที่ทำให้ระบบหน่วยความจำไม่เพียงพอ
xenoterracide

คำตอบ:


9

คุณอาจจะสามารถบรรลุสิ่งที่ต้องการโดยใช้cgroupsกับควบคุมทรัพยากรหน่วยความจำ

ฉันเดาว่าคุณจะวางงานที่ต้องใช้ทรัพยากรทั้งหมดของคุณในจำนวนที่ จำกัด (CPU & RAM) cgroupและปล่อยsshd"นอก" เพื่อไม่ให้ถูก จำกัด

(การเพิ่ม swap เพิ่มเติมแม้ในรูปแบบของไฟล์ swap อาจเป็นตัวเลือกที่ดี)


ฉันยังลังเลอยู่มันดูไม่ง่าย (อูบุนตูเสีย)
phunehehe

โอ้มันไม่ง่ายอย่างแน่นอน :-) การเพิ่ม swap นั้นง่ายกว่ามาก
Mat

@phunehehe ยินดีต้อนรับสู่การเป็นผู้ดูแลระบบของ Sys มันไม่ใช่เรื่องง่าย แต่ตอนนี้คุณต้องเรียนรู้วิธีการทำสิ่งที่ไม่ง่าย
xenoterracide

6

โอ้ แต่กลุ่ม cg นั้นง่ายมาก :) ติดตั้งแพ็คเกจ libcgroup สร้าง /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

เริ่มcgconfigกระบวนการที่จะสร้างลำดับชั้นกลุ่ม cg และตั้งค่าขีด จำกัด หากประสบความสำเร็จคุณมีสองกลุ่ม cg ซึ่งทั้งคู่มี 50% ของ CPU ที่กำหนดและ 1G ของหน่วยความจำที่มีอยู่ (ไม่ทราบว่าจำนวนหน่วยความจำที่แท้จริงของคุณคือ; สมมติว่าเป็น 2G ในตัวอย่างนี้) ตอนนี้คุณเพียงแค่ต้องย้ายงานทั้งหมด (เช่นกระบวนการทั้งหมดที่ทำงานบนระบบ) จากกลุ่มรากไปยังกลุ่ม nosshd:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

จากนั้นคุณเพียงแค่ต้องได้รับ PID ของsshdกระบวนการและย้ายข้อมูลไฟล์ sshd task:

cgroup]# echo $PID >> sshd/tasks

Ta-da คุณทำเสร็จแล้ว ตอนนี้คุณสามารถมั่นใจได้ว่า sshd จะมี CPU 50% และหน่วยความจำ 1G เสมอ


1

ใช้reniceเพื่อรับลำดับความสำคัญสูงกว่าsshdหรือตรวจสอบการบัญชี (acct) -> ด้วยสิ่งนี้คุณสามารถตั้งค่าทรัพยากรสำหรับผู้ใช้ดังนั้นเรียกใช้ sshd ด้วย s


ฉันจะเพิ่มioniceไปที่เช่นกันและอาจเริ่มต้น sshd ด้วยดีไม่ได้สละมันในภายหลัง
xenoterracide

1

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

docker run -c=10 -m=1g my-container
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.