Swap .. or not ?

วันนี้แวะเอาแผ่นซีดีไปฝากพี่เทพที่บ้าน นั่งคุยกันสารพัดเรื่อง นานทีเดียว .. :)

เรื่องนึงที่คุยกันคือเรื่อง swap ในลินุกซ์ .. มีกรณีแปลกๆ ที่่ผ่านตา คือ มีคนเอาหน่วยความจำมาทำเป็น RAM disk แล้วเอามาใช้เป็น swap บนเคอร์เนล 2.4 .. อ่านเรื่องเต็มๆ ได้ที่ http://kerneltrap.org/node/view/3660 .. คอมเมนต์ยาวมาก ผู้เขียนบทความพยายามอธิบายว่าการใช้หน่วยความจำมาทำเป็น swap ดีกว่า การ swap ลงดิสก์ (ซึ่งก็แหงๆ ล่ะ) .. และการทดสอบโดยผู้เขียนเองได้ผลว่าใช้หน่วยความจำทำ swap ดีกว่า ไม่มี swap เลย .. อันนี้ดูไม่น่าเป็นไปได้ แต่ก็ไม่มีอะไรชี้ชัด ตามคนต่างคอมเมนต์ตามสมมติฐานซะมากกว่า .. สรุป .. ไม่มีคำตอบ .. ลองกันเอาเอง

ผู้ใช้หลายๆ คน ‘เชื่อ’ ว่าเคอร์เนลออกแบบมาโดยคาดหวังว่ามี swap ทำงานเสมอ ดังนั้นการปิด swap อาจจะส่งผลที่ไม่ดีนัก นักพัฒนาเคอร์เนลแนะนำว่าควรเปิด swap ให้ทำงานไม่ว่าระบบจะมีหน่วยความจำมากขนาดไหนก็ตาม .. เรื่องนี้มีคนค้านจำนวนไม่น้อยโดยยกประสบการณ์มาเป็นตัวอย่างว่า ถ้าหน่วยความจำมีเยอะจริงๆ ไม่เปิดใช้ swap ก็ไม่มีปัญหาอะไร (หรือมีแต่ไม่เจอ) … หากหน่วยความจำไม่เยอะจริง และไม่มี swap เมื่อถึงจุดที่หน่วยความจำไม่พอ เคอร์เนลจะตัดสินใจ kill แอพพลิเคชันบางตัวออกไป เพื่อให้ระบบทำงานต่อไปได้ ..

ขนาดของ swap เดิมเชื่อกันว่าควรจะตั้งไว้ประมาณ 2 x หน่วยความจำ .. ที่อ่านๆ เจอ เรื่องนี้มีที่มาอยู่หลายทาง หนึ่งในนั้นคือ มาจากขนาด swap ของระบบยูนิกซ์สมัยแรกๆ .. และอีกหนึ่งมาจากเหตุที่เคอร์เนลรุ่นแรกๆ ทำงานได้ไม่ดี ถ้าขนาด swap เล็กเกินไป .. ปัจจุบัน swap ไม่จำเป็นต้องเป็นสองเท่าของหน่วยความจำ สำหรับเดส์กท็อป หน่วยความจำ 256 – 512 MB ตั้ง swap ไว้ซัก 512 MB ก็น่าจะเกินพอแล้ว มากกว่านี้ก็เปลืองเนื้อที่เปล่าๆ ยิ่งถ้าหน่วยความจำเยอะกว่านี้ swap ก็จำเป็นน้อยลง .. อีกอย่างนึงคือ ขนาดของ swap มีลิมิตที่ kswapd ซึ่งตอนนี้ ยังทำงานเป็น 32-bit .. ขนาด swap สูงสุดอยู่ที่ 2 GB/โพรเซส .. หากจะตั้ง swap เกิน 2 GB ก็ได้ แต่ kswapd จะอ้างอิงได้แค่ 2 GB แรก

สำหรับเคอร์เนล 2.6 มีการเปลี่ยนแปลง VM ไปจาก 2.4 ค่อนข้างมาก สามารถปรับแต่งการทำงานของ VM ให้เหมาะกับภาระงานของเครื่องนั้นๆ ได้ระดับนึง กระนั้นก็ยังไม่ถือว่าสมบูรณ์แบบ (เช่นเดียวกับโอเอสอื่นๆ ที่สนับสนุน VM/swapping ทุกๆ ตัว) .. ระยะหลังเลยเริ่มมีเสียงว่า เคอร์เนลอาจจะต้องทำ VM ไว้ใช้สำหรับงานต่างๆ กัน เช่น การใช้เป็นเดสก์ท็อป ทั่วไปแล้วมีหน่วยความจำ 128 – 512 MB การใช้งานแอพพลิเคชันหลากหลาย เปลี่ยนแปลงตลอดเวลา และต้องการการตอบสนองที่ดี – สลับหน้าจอแอพพลิเคชันได้เร็วขึ้น 1 วินาทีมีความหมายมากกว่าคอมไพล์เคอร์เนลได้เร็วขึ้น 1 นาที – VM สำหรับเดสก์ท็อปอาจจะต้องทำงานแบบนึง ในขณะที่ เซิร์ฟเวอร์ ตามทฤษฎีมีหน่วยความจำที่มากกว่า มีแอพพลิเคชันที่อยู่ในหน่วยความจำค่อนข้างแน่นอน ไม่ค่อยมีการเปลี่ยนแปลง VM ก็อาจจะต้องทำงานอีกแบบ ..

จะว่าไป .. หลังๆ มีแพตช์/kernel tree ที่ปรับแต่งสำหรับเดสก์ท็อปหรือเซิร์ฟเวอร์โดยเฉพาะอยู่เหมือนกัน .. :)