Cent OS: ฉันจะปิดหรือลดหน่วยความจำเกินความจำได้อย่างไรและปลอดภัยหรือไม่?


20

ในบางครั้งเซิร์ฟเวอร์ "ของฉัน" จะหยุดทำงานเนื่องจากหน่วยความจำและพื้นที่สว็อปหมด (มันยังคงตอบสนองต่อ ping แต่ไม่มีอะไรมากไปกว่านั้นไม่ใช่แม้แต่ ssh)

ฉันบอกว่า linux ทำ overcommitment หน่วยความจำซึ่งเท่าที่ฉันเข้าใจเหมือนกับธนาคารใช้เงิน: มันให้การประมวลผลหน่วยความจำมากกว่าที่มีจริงโดยสมมติว่ากระบวนการส่วนใหญ่จะไม่ใช้หน่วยความจำทั้งหมดที่พวกเขาถาม อย่างน้อยก็ไม่ได้ทั้งหมดในเวลาเดียวกัน

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

ดังนั้น,

  1. ฉันจะปิดการใช้งานหรือลดหน่วยความจำ overcommitment อย่างมากใน CentOS ได้อย่างไร ฉันได้อ่านมีการตั้งค่าสองอย่างที่เรียกว่า vm.overcommit_memory (ค่า 0, 1, หรือ 2) และ vm.overcommit_ratiom แต่ฉันไม่มีความคิดว่าฉันต้องค้นหาและเปลี่ยน (ไฟล์การกำหนดค่าบางอย่างหวังว่า) และฉันต้องรีบูตเซิร์ฟเวอร์เพื่อให้การเปลี่ยนแปลงมีผล

  2. และปลอดภัยหรือไม่ ฉันคาดหวังผลข้างเคียงอะไรบ้าง เมื่อ googling สำหรับ overcommit_memory ฉันพบสิ่งที่น่ากลัวอย่างที่คนบอกว่าเซิร์ฟเวอร์ไม่สามารถบู๊ตได้อีกต่อไป ....

เนื่องจากสิ่งที่ทำให้การใช้หน่วยความจำเพิ่มขึ้นอย่างฉับพลันคือ mysql เนื่องจากการสอบถามที่ทำโดย php ซึ่งจะถูกเรียกในขณะที่ให้บริการการร้องขอ HTTP ฉันคาดหวังว่าสคริปต์ php บางตัวจะไม่สมบูรณ์และบางครั้งการตอบสนอง 500 ครั้ง เซิร์ฟเวอร์ไม่ว่างซึ่งเป็นความเสี่ยงที่ฉันสามารถทำได้ (ดีกว่าแน่นอนว่าเซิร์ฟเวอร์ทั้งหมดไม่สามารถเข้าถึงได้และต้องรีบูตอย่างหนัก)

หรืออาจเป็นสาเหตุให้เซิร์ฟเวอร์ของฉันไม่สามารถรีบูทได้หากฉันเลือกการตั้งค่าที่ผิด?


1
ปิดการใช้งาน overcommit จะไม่ช่วยให้คุณเมื่อคุณกำลังจริงๆวิ่งออกมาจากหน่วยความจำ แต่การเพิ่มแรมลงในเซิร์ฟเวอร์อาจช่วยได้
Michael Hampton

2
การปิดใช้งาน overcommit จะไม่เป็นทางออกสุดท้าย แต่จะช่วยได้มากหากทุกครั้งที่เซิร์ฟเวอร์มีหน่วยความจำไม่เพียงพอ (ซึ่งทุก ๆ ครั้งในระยะเวลาไม่กี่วินาที) ฉันมีคำขอ http เพียงเล็กน้อยที่ถูกปฏิเสธ (หรือเสิร์ฟไม่ดี) แทนที่จะให้เซิร์ฟเวอร์ของฉันตายอย่างสมบูรณ์และตลอดไป (จนกว่าฉันจะรีสตาร์ท)
matteo

คำตอบ:


30

หน่วยความจำ overcommit สามารถปิดได้โดย vm.overcommit_memory=2

0 เป็นโหมดเริ่มต้นโดยที่เคอร์เนลจะกำหนดการจัดสรรด้วยวิธีการแบบ Heuristically โดยการคำนวณหน่วยความจำว่างเมื่อเปรียบเทียบกับการร้องขอการจัดสรรที่ทำ และการตั้งค่าเป็น 1 เปิดใช้งานโหมดตัวช่วยสร้างโดยที่เคอร์เนลมักจะประกาศว่ามีหน่วยความจำว่างเพียงพอสำหรับการจัดสรรใด ๆ การตั้งค่าเป็น 2 หมายความว่ากระบวนการสามารถจัดสรรได้สูงสุดตามจำนวนที่กำหนด ( overcommit_ratio) ของ RAM และจะเริ่มได้รับการจัดสรรล้มเหลวหรือข้อความ OOM เมื่อเกินระดับที่กำหนดไว้

ปลอดภัยหรือไม่ที่จะทำ ฉันไม่ได้เห็นกรณีการใช้งานที่เหมาะสมซึ่งการปิดใช้งานหน่วยความจำเกินจริงช่วยได้เว้นแต่คุณจะมั่นใจ 100% ของภาระงานและความจุของฮาร์ดแวร์ ในกรณีที่คุณมีความสนใจติดตั้งkernel-docsแพคเกจและไป/Documentation/sysctl/vm.txtเพื่ออ่านข้อมูลเพิ่มเติมหรืออ่านมันออนไลน์

ถ้าคุณตั้งค่าvm.overcommit_memory=2มันจะ overcommit ถึงเปอร์เซ็นต์ของ RAM ที่มีอยู่จริงที่กำหนดค่าในvm.overcommit_ratio(ค่าเริ่มต้นคือ 50%)

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

สิ่งนี้จะไม่สามารถรีบูตได้ เพื่อคงอยู่ให้ใส่สิ่งนี้ลงใน/etc/sysctl.confไฟล์:

vm.overcommit_memory=X

sysctl -pและเรียกใช้ ไม่จำเป็นต้องรีบูท


ส่วนที่คุณไม่ได้รับคำตอบคือไฟล์ใดที่ฉันเปลี่ยนการตั้งค่า vm.memory_overcommit และโดยเฉพาะอย่างยิ่งฉันต้องรีบูท (หรืออะไรก็ได้) เพื่อให้มันมีผล
matteo

2
echo 0/1/2> / proc / sys / vm / overcommit_memory สิ่งนี้จะไม่สามารถรีบูตได้ สำหรับการคงอยู่ให้วางสิ่งนี้ไว้ในไฟล์ /etc/sysctl.conf vm.overcommit_memory = X และรัน sysctl -p ไม่จำเป็นต้องรีบูท
Soham Chakraborty

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

1
เพิ่มส่วนใหม่
Soham Chakraborty

4
"overcommit_ratio" มีผลกระทบที่สำคัญเมื่อใช้ overcommit_memory = 2 - มันกำหนดเปอร์เซ็นต์ของ RAM ที่มีอยู่จริงซึ่งได้รับอนุญาตให้จัดสรร! ดังนั้นหากอัตราส่วน <100 คุณจะปล่อยให้ RAM บางส่วนไม่ได้ถูกจัดสรรบางทีสำหรับแคชดิสก์หรือที่คล้ายกัน อัตราส่วนเริ่มต้นคือ 50% ดังนั้นคุณจะใช้ 50% ของ RAM จริงถ้าคุณไม่เปลี่ยนแปลง!
David Gardner

6

คำสั่งที่ไม่มีเงื่อนไขอย่างสมบูรณ์: การปิดใช้งานหน่วยความจำเกินความจำเป็นแน่นอน "ปลอดภัย" มากกว่าการเปิดใช้งาน

ลูกค้า $ ได้ตั้งค่าไว้ในเว็บเซิร์ฟเวอร์สองสามร้อยแห่งและช่วยแก้ไขปัญหาด้านความมั่นคงได้มาก มีแม้แต่ Nagios ที่เรียกไฟจริงดังถ้ามันไม่เคยปิดการใช้งาน

ในทางกลับกันผู้คนอาจไม่คิดว่ามัน "ปลอดภัย" ที่จะทำให้กระบวนการของพวกเขาออกไปจากความทรงจำเมื่อพวกเขาต้องการที่จะ overcommit ram น้อยและไม่เคยใช้มัน (เช่น SAP จะเป็นตัวอย่างที่ดีมาก)

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

(ฉันรู้ว่าฉันจะเสี่ยง downvote โดยบางคนไม่พอใจ)


3

ฉันยอมรับว่าการปิดใช้งานการปิดทับทับนั้นปลอดภัยกว่าการเปิดใช้งานในบางสถานการณ์ ถ้าเซิร์ฟเวอร์รันงานหน่วยความจำขนาดใหญ่เพียงไม่กี่งาน (เช่นการจำลองวงจรในกรณีของฉัน) มันปลอดภัยกว่าที่จะปฏิเสธแอปพลิเคชันที่ร้องขอหน่วยความจำล่วงหน้าแทนที่จะรองาน OOM (ซึ่งแน่นอนว่าจะติดตามในไม่ช้า) ค่อนข้างบ่อยเราเห็นเซิร์ฟเวอร์ มีปัญหาหลังจาก OOM killer ทำงานแล้ว

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