จะสร้างผู้ใช้ที่มีการใช้งาน RAM จำกัด ได้อย่างไร?


43

ดังนั้นฉันจึงมี 4 GB RAM + 4GB swap ฉันต้องการสร้างผู้ใช้ที่มี ram และ swap จำกัด : 3 GB RAM และ 1 GB swap เป็นไปได้ไหม เป็นไปได้หรือไม่ที่จะเริ่มต้นแอพพลิเคชั่นด้วย RAM ที่ จำกัด และสลับใช้ได้โดยไม่ต้องสร้างผู้ใช้แยกต่างหาก (และไม่ติดตั้งแอพพิเศษใด ๆ - มีเพียงแค่การกำหนดค่าเซิร์ฟเวอร์ Debian / CentOS เริ่มต้น

ปรับปรุง:

ดังนั้นฉันเปิด terminall และพิมพ์ลงในคำสั่งulimit : ulimit -v 1000000ซึ่งจะเป็น976,6Mbข้อ จำกัด ต่อไปฉันโทรไปulimit -aและเห็นข้อ จำกัด นั้นคือ "เปิด" จากนั้นผมเริ่มทุบตีสคริปต์บางที่รวบรวมและเริ่ม app ของฉันในnohupการอย่างใดอย่างหนึ่ง nohup ./cloud-updater-linux.sh >& /dev/null & ... แต่หลังจากที่บางครั้งที่ผมเห็น:

ป้อนคำอธิบายรูปภาพที่นี่

(ซึ่งจะโอเคถ้าไม่มีข้อ จำกัด ถูกนำไปใช้ - มันดาวน์โหลด lib ขนาดใหญ่และเริ่มรวบรวมมัน)

แต่ฉันคิดว่าฉันใช้ข้อ จำกัด กับเชลล์และกระบวนการทั้งหมดเปิดตัวด้วย / จากมันด้วยulimit -v 1000000? ฉันทำอะไรผิด วิธีการสร้างเทอร์มินัลและกระบวนการย่อยทั้งหมดที่เปิดตัวถูก จำกัด ในการใช้งาน ram?


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

@Gilles ค่อนข้างแน่ใจว่าเครื่องเสมือนใช้ cgroups และ namespaces หรืออนุพันธ์ของ
RapidWebs

@RapidWebs ไม่พวกเขาทำไม่ได้ พวกเขาเพียงแค่จำลองจำนวน RAM ที่กำหนดไว้ล่วงหน้าและ guest OS จะตัดสินใจว่าจะจัดสรรให้กับกระบวนการได้อย่างไร
Ruslan

ตู้คอนเทนเนอร์ (ไม่ใช่เครื่องเสมือน) ใช้กลุ่ม cg เพื่อ จำกัด การใช้หน่วยความจำ การ จำกัด หน่วยความจำเสมือนไม่ใช่ความคิดที่ดี กระบวนการสามารถใช้หน่วยความจำเสมือนจำนวนมาก แต่อาจใช้ RAM เพียงเล็กน้อยเท่านั้น ตัวอย่างเช่นระบบของฉันมีการจัดสรรหน่วยความจำเสมือน 34359738367 kB แต่มี RAM น้อยกว่า
ctrl-alt-delor

คำตอบ:


63

ulimitทำเพื่อสิ่งนี้ คุณสามารถตั้งค่าเริ่มต้นสำหรับulimitต่อผู้ใช้หรือต่อกลุ่มใน

/etc/security/limits.conf

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

ดังนั้นคุณlimits.confจะมีเส้น ( 4Gหน่วยความจำสูงสุด)

luser  hard  as   4000000

อัปเดต - กลุ่ม CG

ขีด จำกัด ที่กำหนดโดยulimitและlimits.confเป็นต่อกระบวนการ แน่นอนฉันไม่ชัดเจนในจุดนั้น

หากคุณต้องการ จำกัด จำนวนหน่วยความจำทั้งหมดที่ผู้ใช้ใช้ (ซึ่งเป็นสิ่งที่คุณถาม) คุณต้องการที่จะใช้cgroups

ใน/etc/cgconfig.conf:

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

สิ่งนี้สร้างcgroupหน่วยความจำที่มีขีด จำกัด สูงสุด 4GiB

ใน/etc/cgrules.conf:

luser   memory   memlimit/

นี้จะทำให้กระบวนการทั้งหมดที่ดำเนินการโดยluserจะทำงานภายในmemlimitcgroups cgconfig.confสร้างขึ้นใน


เป็นสิ่งที่สามารถตั้งค่าได้useraddหรือไม่
myWallJSON

4
@myWallJSON ไม่ใช่โดยตรง แต่คุณสามารถเพิ่มลงใน limit.conf ได้ทันทีหรือคุณสามารถตั้งค่ากลุ่มด้วยขีด จำกัด บางอย่างใน limit.conf และเพิ่มผู้ใช้ในกลุ่มนั้น
utopiabound

1
ที่น่ากลัว! ฉันไม่รู้ว่าคุณสามารถทำได้! คำตอบที่ดี +1
Yanick Girouard

1
@utopiabound: อัปเดตคำถามของฉันด้วยข้อมูลบางส่วนฉันพยายามใช้ ulimit
myWallJSON

1
@ f.ardelian อัปเกรดเคอร์เนล นี่คือบทความเกี่ยวกับวิธีการทำเช่นนั้น!
Daniel C. Sobral

4

คุณไม่สามารถเพิ่มการใช้หน่วยความจำในระดับผู้ใช้ ulimit สามารถทำได้ แต่สำหรับกระบวนการเดียว

แม้ว่าจะมีการใช้งานต่อขีด จำกัด ของ/etc/security/limits.confผู้ใช้ผู้ใช้สามารถใช้หน่วยความจำทั้งหมดโดยใช้กระบวนการหลายกระบวนการ

หากคุณต้องการเพิ่มทรัพยากรคุณต้องใช้เครื่องมือการจัดการทรัพยากรเช่นrcapd ที่ใช้โดยโครงการและโซนภายใต้ Solaris

มีบางอย่างที่ดูเหมือนว่าจะมีคุณสมบัติที่คล้ายกันในลินุกซ์ที่คุณอาจตรวจสอบคือ: cgroups


ดีฉันคิดว่าการตั้งค่าหมวกในเปลือกเข้าสู่ระบบของผู้ใช้หรือสิ่งที่สามารถตีความได้ว่าเป็น "การตั้งค่าขีด จำกัด สำหรับผู้ใช้" เนื่องจากกระบวนการทั้งหมดจะสืบทอดมาจากเปลือกที่?
amn

1
@amn มันจะไม่ ผู้ใช้อาจเปิดเปลือกล็อกอินใหม่เพื่อแก้ไขข้อ จำกัด ดังกล่าว
jlliagre

ใช่นั่นทำให้การสันนิษฐานของฉันเป็นโมฆะ
amn

3

cgroupsเป็นวิธีที่เหมาะสมในการทำเช่นนี้เป็นคำตอบอื่น ๆ ได้ชี้ให้เห็น น่าเสียดายที่ไม่มีวิธีการแก้ปัญหาที่สมบูรณ์แบบเนื่องจากเราจะลงไปข้างล่าง มีหลายวิธีในการตั้งค่าขีด จำกัด การใช้หน่วยความจำของ cgroup วิธีการเกี่ยวกับการสร้างเซสชั่นการเข้าสู่ระบบของผู้ใช้โดยอัตโนมัติส่วนหนึ่งของ cgroup จะแตกต่างกันไปในแต่ละระบบ Red Hatมีเครื่องมือบางอย่างและsystemd ก็เช่นกัน

memory.memsw.limit_in_bytesและmemory.limit_in_bytesกำหนดขีด จำกัด รวมถึงและไม่รวมการสลับตามลำดับ ข้อเสียmemory.limit_in_bytesคือมันนับไฟล์ที่แคชโดยเคอร์เนลในนามของกระบวนการใน cgroup กับโควต้าของกลุ่ม การแคชที่น้อยลงหมายถึงการเข้าถึงดิสก์มากขึ้นดังนั้นคุณอาจยกเลิกประสิทธิภาพบางอย่างหากระบบมีหน่วยความจำเหลืออยู่

ในทางกลับกันmemory.soft_limit_in_bytesอนุญาตให้ cgroup ข้ามโควตา แต่ถ้า killer OOM เคอร์เนลถูกเรียกใช้จากนั้นกลุ่ม cg ที่อยู่เหนือโควต้าของพวกเขาจะถูกฆ่าก่อน อย่างไรก็ตามข้อเสียคือมีสถานการณ์ที่จำเป็นต้องใช้หน่วยความจำบางส่วนในทันทีและไม่มีเวลาสำหรับ OOM killer ที่จะมองหากระบวนการที่จะฆ่าซึ่งในกรณีนี้บางสิ่งบางอย่างอาจล้มเหลวก่อนที่กระบวนการของผู้ใช้เกินโควต้าคือ ถูกฆ่าตาย

ulimitอย่างไรก็ตามเป็นเครื่องมือที่ผิดอย่างยิ่งสำหรับเรื่องนี้ ulimit วางข้อ จำกัด ในการใช้งานหน่วยความจำเสมือนซึ่งแทบจะไม่ใช่สิ่งที่คุณต้องการ แอปพลิเคชันในโลกแห่งความจริงจำนวนมากใช้หน่วยความจำเสมือนไกลกว่าหน่วยความจำกายภาพ runtimes ที่เก็บรวบรวมขยะส่วนใหญ่ (Java, Go) ทำงานด้วยวิธีนี้เพื่อหลีกเลี่ยงการแตกแฟรกเมนต์ โปรแกรม "hello world" เล็กน้อยใน C หากคอมไพล์ด้วยน้ำยาฆ่าเชื้อที่อยู่สามารถใช้หน่วยความจำเสมือน 20TB ตัวจัดสรรที่ไม่พึ่งพาsbrkเช่นjemalloc (ซึ่งเป็นตัวจัดสรรเริ่มต้นสำหรับ Rust) หรือtcmallocจะมีการใช้งานหน่วยความจำเสมือนมากกว่าการใช้งานจริงอย่างมีนัยสำคัญ เพื่อประสิทธิภาพเครื่องมือหลายตัวจะใช้ไฟล์ mmap ซึ่งเพิ่มการใช้งานเสมือน แต่ไม่จำเป็นต้องใช้งานจริง กระบวนการ Chrome ทั้งหมดของฉันใช้หน่วยความจำเสมือน 2TB ต่อครั้ง ฉันใช้แล็ปท็อปที่มีหน่วยความจำกายภาพ 8GB วิธีใดก็ตามที่พยายามตั้งค่าโควต้าหน่วยความจำเสมือนที่นี่อาจเป็นการทำลาย Chrome บังคับให้ Chrome ปิดการใช้งานคุณลักษณะด้านความปลอดภัยบางอย่างซึ่งขึ้นอยู่กับการจัดสรร (แต่ไม่ได้ใช้) หน่วยความจำเสมือนจำนวนมากหรือไม่มีประสิทธิภาพในการป้องกันผู้ใช้ .

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