SWAP คุณจะให้ CentOS ติดตั้งบน Quad Core XEON คู่กับ RAM ขนาด 16GB ที่กำลังจะเรียกใช้เว็บไซต์ php พร้อมกับแบ็กเอนด์ mysql - โหลดปานกลาง / หนักหรือไม่
SWAP คุณจะให้ CentOS ติดตั้งบน Quad Core XEON คู่กับ RAM ขนาด 16GB ที่กำลังจะเรียกใช้เว็บไซต์ php พร้อมกับแบ็กเอนด์ mysql - โหลดปานกลาง / หนักหรือไม่
คำตอบ:
ไม่เกินกิ๊กหรือสอง - คุณต้องการการแลกเปลี่ยนเล็กน้อยในกรณีและเพราะมันช่วยให้สิ่งต่าง ๆ ทำงานได้ดีขึ้นเล็กน้อย แต่ถ้าคุณไปถึงจุดที่คุณทำการแลกเปลี่ยนอย่างหนัก จะไร้ประโยชน์ - และในสถานการณ์ความหายนะที่เกิดขึ้นจริงคุณดีกว่าจริง ๆ ด้วยพื้นที่สว็อปเล็ก ๆ เพราะคุณจะทำให้ OOM killer เร็วขึ้นแทนที่จะทำในภายหลัง
ฉันขอโทษสำหรับคำตอบที่ยาวมาก ฉันต้องการที่จะให้บางสิ่งบางอย่างเข้าถึงได้ในขณะนี้!
TLDR; ตามหลักวิชาแล้วคำตอบคือ "อาจจะไม่น้อยกว่าจำนวนหน่วยความจำที่มีอยู่ทั้งหมดที่แอปพลิเคชันของคุณต้องการใช้"
ฉันจะพยายามอธิบายถ้าคุณอยู่กับฉัน ..
บิตเกี่ยวกับหน่วยความจำเสมือน
ฉันรู้สึกว่ามีความเข้าใจผิดร่วมกันในทุกวันนี้เกี่ยวกับคุณค่าของการแลกเปลี่ยนและจุดประสงค์ของมันคืออะไร มักจะถือว่าการแลกเปลี่ยนนั้นมีความหมายเป็น 'ธนาคารสำรอง' สำหรับหน่วยความจำเมื่อหน่วยความจำของคุณเหลือน้อย ใช่นี้เป็นจริงบางส่วน แต่เคอร์เนลไม่ต้องการที่จะใช้แลกเปลี่ยนของคุณเป็นธนาคารสำรอง นอกจากนี้เคอร์เนลไม่ต้องการที่จะเรียกใช้ดิสก์เพื่อรับข้อมูลที่คุณอยู่หลังจาก!
ในพื้นที่แอพพลิเคชันมีสิ่งต่าง ๆ ที่เคอร์เนลจะเก็บไว้ในหน่วยความจำ
เพื่อวัตถุประสงค์ในการจัดการหน่วยความจำการจัดสรรหน่วยความจำจะถูกสำรองในบางรูปแบบหรืออีกรูปแบบหนึ่งโดยอุปกรณ์ที่รองรับ
หน่วยความจำที่สำรองไฟล์คือหน่วยความจำที่มาจากไฟล์และโดยทั่วไปแล้ว O / S ประกอบไปด้วยการจัดสรรหน่วยความจำส่วนใหญ่บนระบบ มันรวมไฟล์ต่าง ๆ เช่นไลบรารีที่แชร์ซึ่งโหลดแล้วไฟล์ที่อ่านจากดิสก์และเก็บไว้ในแคชของหน้าและไฟล์ที่ทำจากดิสก์ (ในความเป็นจริงเคอร์เนลจะไม่แยกความแตกต่างของหน้าระหว่างไฟล์ในแคชของหน้าและไฟล์ สิ่งเดียวกัน).
สิ่งที่ยอดเยี่ยมเกี่ยวกับหน่วยความจำนี้จากจุดยืนของเมล็ดเป็นแบบใช้แล้วทิ้งซึ่งควรจะทิ้งหน้าเหล่านี้หากคุณต้องการหน่วยความจำสำหรับสิ่งอื่นและนี่คือสิ่งที่หน้าแคชทำหากหน่วยความจำมีความต้องการกะทันหัน
หน่วยความจำที่สำรองข้อมูลโดยไม่ระบุชื่อเป็นอีกเรื่องหนึ่ง หน่วยความจำจากภูมิภาคนี้ไม่ระบุชื่อเพราะไม่มีไฟล์บนดิสก์ที่มีข้อมูลนี้ โดยปกติแล้วจะประกอบด้วยแอปพลิเคชันสแต็กฮีปอะไรก็ตามใน tmpfs และข้อมูล mmapped ซึ่งเป็นข้อมูลส่วนตัวและได้รับการแก้ไข (เนื่องจากไม่สามารถซิงค์สิ่งนี้กลับไปที่ดิสก์) เนื่องจากไม่มีไฟล์ที่ถูกต้องในระบบไฟล์ที่จะเขียนหน้าเหล่านี้กลับไปหากมีการเปลี่ยนแปลงหน่วยความจำที่สำรองข้อมูลโดยไม่ระบุชื่อจึงได้รับการสนับสนุนโดยสื่อสลับ
ตอนนี้เคอร์เนลรู้ว่าเมื่อหน่วยความจำเหลือน้อยมันถูกกว่าการทิ้งไฟล์หน่วยความจำที่สำรองข้อมูลไว้ในหน่วยความจำที่ไม่ระบุชื่อเนื่องจากข้อมูลที่ไม่ระบุชื่อมีโอกาสสูงที่จะ "สกปรก" มากกว่าข้อมูลที่สำรองไฟล์ อัตราหน่วยความจำที่สำรองข้อมูลโดยไม่ระบุชื่อว่ามีค่ามากกว่าหน่วยความจำที่สำรองไฟล์ 80 เท่าและนี่คือสิ่งที่ตัวแก้ไข swappiness ทำบน linux (ดูโพสต์นี้ที่นี่ถ้าคุณต้องการทราบว่าพารามิเตอร์ swappiness กำลังเปลี่ยนแปลง)
สถานการณ์กรณีที่เลวร้ายที่สุด
สถานการณ์กรณีที่เลวร้ายที่สุดเมื่อมาถึงเซิร์ฟเวอร์ที่ไม่สามารถควบคุมได้และ OOMing ขึ้นอยู่กับข้อเท็จจริงที่ว่ามันใช้เวลานานเกินไปในการจัดการคำขอ I / O มากกว่าที่จะยอมรับคำขอจัดสรรหน่วยความจำ มีสองเงื่อนไขที่สามารถเรียกใช้เกณฑ์นี้
สิ่งแรกคือความคิดทั่วไปของปัญหา นั่นคือเนื่องจากหน่วยความจำจำนวนมากอาศัยอยู่ในการแลกเปลี่ยนเราจำเป็นต้องสลับหน่วยความจำที่ไม่ระบุชื่อออกจาก RAM นำมันกลับมาเป็น swap จากนั้นนำบางอย่างจากการแลกเปลี่ยนและใส่ลงใน RAM จริง การดำเนินการนี้มีราคาแพงมากทำให้เครื่องช้าลงจนถึงจุดที่สามารถกลายเป็นสถานการณ์ที่ไม่สามารถกู้คืนได้ (เนื่องจากมีสิ่งต่าง ๆ รอคิวสำหรับความต้องการของหน้ามากกว่าที่จะให้บริการจาก I / O)
คนที่สองถือว่าน้อยกว่า แต่สำคัญพอ ๆ หากคุณจัดสรรหน่วยความจำเกือบทั้งหมดของคุณให้เป็นข้อมูลแอปพลิเคชันจริง - คุณจะไม่ได้อยู่นาน เกือบทุกแอปพลิเคชันอาศัยการอ่านไฟล์จากระบบไฟล์เพื่อใช้งานอาจเป็นเพราะคำแนะนำบางอย่างอาศัยอยู่ในไลบรารีที่แชร์หรือเพราะคุณต้องอ่าน /etc/resolv.conf สำหรับการเรียกใช้ไลบรารีหรือวัตถุประสงค์อื่น ๆ มีความเป็นไปได้ทั้งหมดที่จะหยุดระบบปฏิบัติการ แต่ยังมีหน่วยความจำเพียงพอที่จะปรับให้เหมาะกับทุกแอปพลิเคชันของคุณ แต่เนื่องจากคุณรอคิว I / O จำนวนมากจึงไม่มีโอกาสที่จะทำให้สมบูรณ์
เคอร์เนลต้องการทำอะไรกับการแลกเปลี่ยนของคุณ
เคอร์เนลต้องการที่จะใช้ swap ของคุณเพื่อกำจัดเพจที่มีการสูญเสียหน่วยความจำเพื่อให้สามารถใช้หน่วยความจำนั้นเพื่อสิ่งอื่น
โดยทั่วไปในการทำงานปกติเคอร์เนลชอบเติมข้อมูลในแคชของเพจด้วยข้อมูลที่อ่านจากดิสก์อย่างจริงจังซึ่งหมายความว่าจะไม่อ่านดิสก์สำหรับข้อมูลเดียวกัน นี่เป็นการออกแบบที่ดีและสามารถลด I / O ได้อย่างมาก ตอนนี้อาจเป็นเพราะคุณมีบางแอปพลิเคชั่นนั่งอยู่ในความทรงจำที่หลับเป็นเวลา 3 วันตื่นขึ้นทำงานได้หลายอย่างจากนั้นก็นอนอีก 3 วัน
สิ่งที่เคอร์เนลต้องการจะทำกับข้อมูลนี้คือสลับเพื่อให้มีที่ว่างสำหรับกิจกรรมระบบไฟล์แทนเนื่องจากคุณมีโอกาสสูงที่จะใช้หน้าเหล่านี้บ่อยกว่าหน้าที่คุณใช้สำหรับแอปพลิเคชันของคุณ การแลกเปลี่ยนในแง่นี้อาจเป็นธุรกรรมขนาด 16kb ไปยังสื่อสว็อปของคุณซึ่งคุณแทบจะไม่รู้สึก แต่ในทางกลับกันคุณได้ปลดปล่อยหน่วยความจำขนาด 16kb ที่สามารถนำมาใช้เพื่อจัดเก็บข้อมูลสี่ไฟล์
สิ่งที่เคอร์เนลไม่ต้องการใช้ swap
เคอร์เนลไม่ต้องการใช้ swap ของคุณเพื่อจัดสรรหน่วยความจำนิรนามมากขึ้นโดยการสลับหน่วยความจำนิรนามอื่น ๆ นี่เป็นสถานการณ์ที่ผู้คนกังวลมากที่สุดและถูกต้อง
อย่างไรก็ตามฉันควรชี้ให้เห็นว่าหากคุณได้จัดสรรหน่วยความจำมากมายที่เคอร์เนลไม่มีทางเลือกนอกจากทำสิ่งนี้นี่เป็นปัญหาการกำหนดค่าของผู้ดูแลระบบไม่ใช่เคอร์เนลเอง - มันแค่พยายามทำสิ่งที่ดีที่สุดโดย ตัวเลือกที่คุณได้รับมัน!
หากคุณมีการแลกเปลี่ยนจำนวนมากคุณจะเพิ่มโอกาสในการใช้มันหรือไม่?
No! หากคุณมีหน่วยความจำ 1G และมีการแลกเปลี่ยน 4G ไม่มีโอกาส 80% ที่ข้อมูลของคุณจะถูกสับเปลี่ยน! เคอร์เนลต้องการใช้การแลกเปลี่ยนเฉพาะเมื่อเพจในหน่วยความจำสามารถแสดงผลได้ดีกว่าทำอย่างอื่น!
เป็นประโยชน์หรือไม่ที่จะไม่ใช้ swap เลย
ฉันจะไม่ทำสิ่งนี้ การสลับช่วยให้ O / S กำจัดหน่วยความจำที่คุณต้องการ แต่ไม่เคยใช้ หากคุณไม่มีการแลกเปลี่ยนหน่วยความจำที่เพิ่งกลืนกินของคุณคุณจะไม่ได้รับกลับมาซึ่งคุณอาจเห็นการปรับปรุงประสิทธิภาพที่สำคัญโดยการอนุญาตให้พูดว่าแคชของเพจจะมีแทน
การแลกเปลี่ยนที่ดีที่สุดคืออะไร
ตามทฤษฎีแล้วค้นหาจำนวนหน่วยความจำที่มีอยู่ + 20% สำหรับความปลอดภัยเช่นการโทรเข้าห้องสมุดใหม่ที่ต้องจัดสรรหน่วยความจำจากฮีป - จากนั้นตั้งค่าการแลกเปลี่ยนเป็นจำนวนเงินนั้น สิ่งนี้ (ตามหลักเหตุผลแล้ว) อนุญาตให้ระบบปฏิบัติการสลับหน่วยความจำที่ไม่ระบุชื่อออกทั้งหมดหากจำเป็นต้องหาวิธีเพื่อสิ่งที่มีประโยชน์มากกว่า
ถ้าฉันได้รับโอกาสเคอร์เนลที่จะแลกเปลี่ยนทุกอย่างที่เป็นอันตรายหรือไม่
โปรดจำไว้ว่าเคอร์เนลไม่ต้องการสลับเพื่อหลีกทางให้กับการจัดสรรหน่วยความจำที่ไม่ระบุชื่อที่นี่มากขึ้นมันจะสลับหน้าเพจที่ไม่ได้ใช้งานเพื่อประโยชน์อย่างอื่นที่จะทำให้การใช้พื้นที่ดีขึ้นแทน
หากการสลับหน่วยความจำไม่ได้อยู่ในหน่วยความจำที่ไม่ระบุชื่อเพิ่มเติมแสดงว่าคุณทำอะไรผิดพลาดและต้องการ RAM เพิ่มขึ้นหรือเพื่อปรับแต่งแอปพลิเคชันของคุณใหม่
คุณต้องการ RAM เท่าใด
คุณต้องอนุญาตให้ RAM เพียงพอที่จะเรียกใช้แอปพลิเคชันทั้งหมดของคุณแน่นอน แต่คุณควรอนุญาตให้ RAM เพิ่ม 2G สำหรับ pagecache เพื่อเติม - อาจจะมากกว่านี้ แคชของหน้าทำให้คอมพิวเตอร์ของคุณเร็วขึ้นมากและดิสก์ของคุณจะใช้งานได้นานขึ้น หากคุณคิดที่จะเรียกใช้เว็บเซิร์ฟเวอร์การมี pagecache มากขึ้นเป็นความคิดที่ดีเนื่องจากจำนวนเนื้อหาคงที่ที่คุณสามารถเรียกคืนและนำกลับมาใช้ใหม่จาก pagecache ที่จะให้บริการ (ถ้าปริมาณงานของเว็บเซิร์ฟเวอร์ของคุณเป็น 5mb / s ต้องการที่จะดึงเนื้อหา 5mb / s ที่คุณสร้างจากดิสก์ของคุณหลังจากทั้งหมด!)
จะทำอย่างไรถ้าคุณไม่ไว้วางใจลินุกซ์ในการแลกเปลี่ยนอย่างถูกต้อง
หากคุณกังวลจริงๆคุณสามารถจัดสรรหน่วยความจำได้มากกว่าที่คุณมี:
วิธีที่ดีที่สุดในการปรับแต่งหน่วยความจำสำหรับแอปพลิเคชันของฉันคืออะไร
ผู้ขายแนะนำการกำหนดค่าที่แตกต่างกัน ..
ฟังที่นั่นแทน แอปพลิเคชั่นบางตัวเขียนในลักษณะที่พวกเขาจงใจเรียกใช้เคอร์เนลเพื่อให้เพจของพวกเขาแอ็คทีฟเหนือแอพพลิเคชั่นอื่นทั้งหมด นี่เป็นกลอุบายที่น่ารังเกียจที่จะซื่อสัตย์ แต่ก็ทำลายความสามารถของเมล็ดในการจัดการหน่วยความจำได้อย่างราบรื่นเมื่อมันเกิดขึ้น หากผู้ขายของคุณให้ข้อมูลเฉพาะแก่คุณพวกเขาก็จะตกอยู่ในหมวดหมู่นี้และฟังสิ่งที่พวกเขาพูดแทน
สรุป
เคอร์เนลมักจะทำงานได้ดีมากในการจัดการหน่วยความจำเสมือนอย่างถูกต้อง เป็นกรณีที่แอปพลิเคชันของคุณจัดสรรหน่วยความจำมากกว่าที่คุณคาดหวังว่าจะสามารถใช้งานได้และนั่นคือสาเหตุที่ทำให้เกิด OOM
Swap เคยถูกใช้เป็น 'memory memory' แต่มันไม่ได้มีวัตถุประสงค์หลักอีกต่อไปดังนั้นอย่าคิดว่าจะใช้มันแบบนั้น แต่ขอขอบคุณที่เคอร์เนลของคุณอาจรู้ดีที่สุดว่ามันต้องการใช้หน่วยความจำของคุณเพื่ออะไร ให้พื้นที่สำหรับการตัดสินใจและคุณจะได้รับประโยชน์จากการปรับปรุงประสิทธิภาพโดยรวม
จากเอกสาร "Oracle 10g Server บน Red Hat® Enterprise Linux® 5 คำแนะนำการปรับใช้"
Oracle ให้คำแนะนำทั่วไปเกี่ยวกับขนาดของการแลกเปลี่ยนใน MetaLink Note 169706.1 คำแนะนำเหล่านี้อาจนำไปสู่การสร้างพื้นที่สว็อปขนาดใหญ่มากบนระบบที่มีหน่วยความจำจำนวนมาก การสลับขนาดใหญ่มากอาจทำให้ประสิทธิภาพการทำงานของระบบลดลงอย่างรุนแรงและสามารถแก้ไขได้โดยการลดพื้นที่สว็อป Red Hat ไม่แนะนำให้จัดสรรมากกว่า 4GB สำหรับการแลกเปลี่ยนบน Red Hat Enterprise Linux 5
ดังนั้นสำหรับ 16GB คุณควรมี swap ไม่เกิน 4GB
PS นอกจากนี้ควรทราบว่าการเรียกใช้oom
นั้นดีกว่ากระบวนการสลับที่ไม่สามารถใช้งานได้โดยใช้แบนด์วิดท์ I / O ทั้งหมด
คำแนะนำ CentOS Swap ปัจจุบันใช้สูตร:
M = Amount of RAM in GB, and S = Amount of swap in GB, then
If M < 2
S = M *2
Else
S = M + 2
ดังนั้นสำหรับ 16G จำนวนการแลกเปลี่ยนควรเป็น 18G
ดูhttp://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-swapspace.html
จากสิ่งที่ฉันจำได้จากเอกสารของ linux: หาก ram ของคุณมีขนาดใหญ่กว่า 2gb คุณจะต้องสลับ = (ramSize + 2) ถ้ามันน้อยกว่าคุณจะสลับ = (ramSize * 2)
ฉันพบเอกสารนี้สำหรับคุณแล้วมันจะช่วยให้คุณตัดสินใจได้ว่าที่นี่คือ: Swap Space คืออะไร แต่คำตอบข้างต้นไม่ถูกต้อง
dd if=/dev/zero of=swap.file bs=1024 count=1048576; mkswap swap.file; swapon swap.file