หนึ่งในวิธีในการป้องกันข้อผิดพลาดในกรณีหน่วยความจำไม่เพียงพอในแอปพลิเคชัน คือการเพิ่มพื้นที่สว็อปไปยังเซิร์ฟเวอร์ของเรา ซึ่งปัจจุบันผู้พัฒนาเว็บไซต์นิยมหันมาใช้ VPS (Virtual Private Server) ซึ่งเราจะพูดถึงวิธีการเพิ่มพื้นที่สว็อปไปยังเซิร์ฟเวอร์ของเราบน Ubuntu 20.04
Swap คืออะไร?
Swap คือส่วนหนึ่งของพื้นที่จัดเก็บฮาร์ดไดรฟ์ที่จัดสรรไว้สำหรับระบบปฏิบัติการเพื่อจัดเก็บข้อมูลที่ไม่สามารถเก็บไว้ใน RAM ได้ชั่วคราว วิธีนี้ช่วยให้เราสามารถเพิ่มปริมาณข้อมูลที่เซิร์ฟเวอร์ของเรา ให้สามารถเก็บไว้ในหน่วยความจำที่ใช้งานได้ โดยมีข้อแม้บางอย่างคือ พื้นที่สว็อปบนฮาร์ดไดรฟ์ส่วนใหญ่จะใช้เมื่อไม่มีพื้นที่ว่างเพียงพอใน RAM แล้ว เพื่อที่จะเก็บข้อมูลแอปพลิเคชันที่ใช้งานอยู่ ข้อมูลที่เขียนลงดิสก์จะช้ากว่าข้อมูลที่เก็บไว้ใน RAM มาก ซึ่งถ้าเราพอมีงบประมาณ การเพิ่มแรมจริงจะเป็นทางเลือกที่ดีกว่ามากๆ โดยรวมแล้ว การมีพื้นที่สว็อปเป็นทางเลือกเมื่อ RAM ของระบบของเราหมดเท่านั้น
ขั้นตอนที่ 1 – ตรวจสอบระบบสำหรับข้อมูลการทำสว็อป
ก่อนที่เราจะเริ่มต้น เราสามารถตรวจสอบว่าระบบมีพื้นที่สวอปว่างอยู่แล้วหรือไม่ เราสามารถจะมีหลายไฟล์สว็อปหรือหลายพาร์ติชั่นสว็อปได้ แต่โดยทั่วไปแล้วหนึ่งไฟล์สวอปก็เพียงพอแล้ว
เราสามารถดูว่าระบบมีการกำหนดค่า swap ใด ๆ หรือไม่ โดยพิมพ์:
sudo swapon --show
หากเราไม่ได้รับผลลัพธ์ใด ๆ กลับมา แสดงว่าระบบของเราไม่มีพื้นที่สว็อปที่พร้อมใช้งานในขณะนี้
free -h
Output total used free shared buff/cache available Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi Swap: 0B 0B 0B
ดังที่เราเห็นในแถว Swap ของ Output ไม่มีการ Swap ใดๆ ในระบบ
ขั้นตอนที่ 2 – ตรวจสอบพื้นที่ว่างบนพาร์ติชันฮาร์ดไดรฟ์
ก่อนที่เราจะสร้างไฟล์ swap เราจะตรวจสอบการใช้งานดิสก์ปัจจุบันเพื่อให้แน่ใจว่าเรามีพื้นที่เพียงพอ ทำได้โดยป้อน:
df -h
Output Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 99M 932K 98M 1% /run /dev/vda1 25G 1.4G 23G 7% / tmpfs 491M 0 491M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 491M 0 491M 0% /sys/fs/cgroup /dev/vda15 105M 3.9M 101M 4% /boot/efi /dev/loop0 55M 55M 0 100% /snap/core18/1705 /dev/loop1 69M 69M 0 100% /snap/lxd/14804 /dev/loop2 28M 28M 0 100% /snap/snapd/7264 tmpfs 99M 0 99M 0% /run/user/1000
อุปกรณ์ที่มี / ในคอลัมน์ Mounted on คือดิสก์ของเราในกรณีนี้ ในตัวอย่างนี้เรามีพื้นที่ว่างอยู่มาก (ใช้เพียง 1.4G) การใช้งานของเราอาจจะแตกต่างออกไป แม้ว่าจะมีข้อมูลมากมายเกี่ยวกับขนาดที่เหมาะสมของพื้นที่สว็อป แต่จริงๆ แล้วขึ้นอยู่กับความชอบส่วนบุคคล โดยทั่วไป จำนวนพี้นที่สว็อปเท่ากับหรือสองเท่าของจำนวน RAM ในระบบของเราก็เป็นจุดเริ่มต้นที่ดี
ตอนนี้เราทราบพื้นที่ว่างในฮาร์ดไดรฟ์แล้ว เราก็สามารถสร้างไฟล์ Swap บนระบบไฟล์ของเราได้ เราจะจัดสรรไฟล์ขนาดที่เราต้องการเรียกว่า swapfile ในไดเร็กทอรี root (/) ของเรา
ขั้นตอนที่ 3 – การสร้างไฟล์ Swap
ตอนนี้เราทราบพื้นที่ว่างในฮาร์ดไดรฟ์แล้ว เราก็สามารถสร้างไฟล์ Swap บนระบบไฟล์ของเราได้ เราจะจัดสรรไฟล์ขนาดที่เราต้องการ เรียกว่า swapfile ในไดเร็กทอรี root (/) ของเรา
วิธีที่ดีที่สุดในการสร้างไฟล์สวอปคือการใช้โปรแกรม fallocate คำสั่งนี้จะสร้างไฟล์ตามขนาดที่ระบุในทันที
เนื่องจากเซิร์ฟเวอร์ในตัวอย่างมี RAM 1G เราจะสร้างไฟล์ 1G โดยที่เพื่อนๆ สามารถปรับค่านี้ให้ตรงกับความต้องการของเซิร์ฟเวอร์ของเพื่อนๆ:
sudo fallocate -l 1G /swapfile
เราสามารถตรวจสอบได้ว่ามีการสำรองพื้นที่ที่ถูกต้อง โดยพิมพ์:
ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
ไฟล์ของเราถูกสร้างขึ้นโดยแบ่งพื้นที่ว่างไว้แล้ว
ขั้นตอนที่ 4 – เปิดใช้งาน Swap File
ตอนนี้เรามีไฟล์ที่มีขนาดที่ถูกต้องแล้ว เราจำเป็นต้องเปลี่ยนสิ่งนี้ให้เป็นพื้นที่สว็อป
ขั้นแรก เราต้องล็อกการอนุญาตของไฟล์เพื่อให้เฉพาะผู้ใช้ที่มีสิทธิ์ Root เท่านั้นที่สามารถอ่านและเขียนได้ ซึ่งจะป้องกันไม่ให้ผู้ใช้ทั่วไปเข้าถึงไฟล์ได้ ซึ่งจะส่งผลต่อความปลอดภัยอย่างมาก
ทำให้ไฟล์เข้าถึงได้เฉพาะ Root โดยพิมพ์:
sudo chmod 600 /swapfile
ตรวจสอบการเปลี่ยนแปลงการอนุญาตโดยพิมพ์:
ls -lh /swapfile
Output -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
อย่างที่เราเห็น เฉพาะผู้ใช้รูทเท่านั้นที่เปิดใช้งานในการอ่านและเขียน
ตอนนี้เราสามารถทำเครื่องหมายไฟล์เป็นพื้นที่สว็อปโดยพิมพ์:
sudo mkswap /swapfile
Output Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
หลังจากทำเครื่องหมายไฟล์แล้ว เราสามารถเปิดใช้งานไฟล์สว็อป เพื่อให้ระบบของเราเริ่มใช้งานได้:
sudo swapon /swapfile
ตรวจสอบว่ามีการเปิดใช้งานแล้ว โดยพิมพ์:
sudo swapon --show
Output NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2
เราสามารถตรวจสอบผลลัพธ์ของยูทิลิตี้ฟรีอีกครั้ง เพื่อยืนยัน:
free -h
Output total used free shared buff/cache available Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi Swap: 1.0Gi 0B 1.0Gi
สวอปของเราได้รับการตั้งค่าเรียบร้อยแล้ว และระบบปฏิบัติการของเราจะเริ่มใช้งานตามความจำเป็น
ขั้นตอนที่ 5 – ทำให้ไฟล์ Swap อยู่แบบถาวร
การเปลี่ยนแปลงล่าสุดของเราได้เปิดใช้งานไฟล์ Swap สำหรับเซสชันปัจจุบัน อย่างไรก็ตาม หากเรารีบูต เซิร์ฟเวอร์จะไม่เก็บการตั้งค่าไว้โดยอัตโนมัติ เราสามารถเปลี่ยนแปลงได้โดยการเพิ่มไฟล์ swap ลงในไฟล์ /etc/fstab ของเรา
สำรองไฟล์ /etc/fstab ในกรณีที่มีสิ่งผิดปกติเกิดขึ้น:
sudo cp /etc/fstab /etc/fstab.bak
เพิ่มข้อมูลไฟล์ swap ที่ส่วนท้ายของไฟล์ /etc/fstab โดยพิมพ์:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
ต่อไป เราจะตรวจสอบการตั้งค่าบางอย่างที่เราสามารถอัปเดตเพื่อปรับพื้นที่สว็อปของเรา
ขั้นตอนที่ 6 – ปรับการตั้งค่า Swap ของเรา
มีตัวเลือกสองสามตัวเลือก ที่เราสามารถกำหนดค่าได้ ซึ่งจะส่งผลต่อประสิทธิภาพของระบบของเรา
การปรับค่า Swappiness
พารามิเตอร์ swappiness จะกำหนดค่าความถี่ที่ระบบของเราสลับข้อมูลจาก RAM ไปยังพื้นที่สว็อป อยู่ระหว่าง 0 ถึง 100 ที่แสดงเป็นเปอร์เซ็นต์
สำหรับค่าที่ใกล้ศูนย์ เคอร์เนลจะไม่สลับข้อมูลไปยังดิสก์เว้นแต่จำเป็นจริงๆ โปรดอย่าลืมว่า การโต้ตอบกับไฟล์ Swap นั้น ใช้เวลานานกว่าการโต้ตอบกับ RAM และอาจทำให้ประสิทธิภาพลดลง การบอกระบบว่าไม่ต้องพึ่งพาการแลกเปลี่ยนมากนักจะทำให้ระบบของเราเร็วขึ้น
ค่าที่ใกล้ 100 จะพยายามใส่ข้อมูลในการแลกเปลี่ยนมากขึ้น เพื่อรักษาพื้นที่ว่าง RAM ให้มากขึ้น
เราสามารถเห็นค่า swappiness ปัจจุบันโดยพิมพ์:
cat /proc/sys/vm/swappiness
Output 60
สำหรับเดสก์ท็อป การตั้งค่าการสลับไปมาที่ 60 ไม่ใช่ค่าที่แย่ สำหรับเซิร์ฟเวอร์ เราอาจต้องปรับให้เข้าใกล้ 0 มากขึ้น
เราสามารถตั้งค่า swappiness เป็นค่าอื่นได้โดยใช้คำสั่ง sysctl
ตัวอย่างเช่น หากต้องการตั้งค่าความสลับไปมาเป็น 10 เราสามารถพิมพ์:
sudo sysctl vm.swappiness=10
Output vm.swappiness = 10
การตั้งค่านี้จะคงอยู่จนกว่าจะรีบูตครั้งถัดไป เราสามารถตั้งค่านี้โดยอัตโนมัติเมื่อรีสตาร์ทโดยเพิ่มบรรทัดลงในไฟล์ /etc/sysctl.conf ของเรา:
sudo nano /etc/sysctl.conf
ที่ด้านล่าง เราสามารถเพิ่ม:
vm.swappiness=10
บันทึกและปิดไฟล์เมื่อเราทำเสร็จแล้ว
การปรับการตั้งค่า Cache Pressure
ค่าที่เกี่ยวข้องอื่นที่เราอาจต้องการแก้ไขคือ vfs_cache_pressure การตั้งค่านี้กำหนดว่าระบบจะเลือกแคช inode และ dentry ข้อมูลมากกว่าข้อมูลอื่นมากน้อยเพียงใด
โดยทั่วไป เราสามารถดูค่าปัจจุบันได้โดยสอบถามระบบไฟล์ proc อีกครั้ง:
cat /proc/sys/vm/vfs_cache_pressure
Output 100
เนื่องจากขณะนี้มีการกำหนดค่า ระบบของเราจะลบข้อมูลไอโหนดออกจากแคชเร็วเกินไป เราสามารถตั้งค่านี้เป็นการตั้งค่าที่ระมัดระวังมากขึ้น เช่น 50 โดยพิมพ์:
sudo sysctl vm.vfs_cache_pressure=50
Output vm.vfs_cache_pressure = 50
และก็เหมือนเดิมคือ สิ่งนี้ใช้ได้สำหรับเซสชันปัจจุบันของเราเท่านั้น เราสามารถเปลี่ยนได้โดยเพิ่มลงในไฟล์การกำหนดค่าของเรา เหมือนกับที่เราทำกับการตั้งค่าสว็อปที่ผ่านมา:
sudo nano /etc/sysctl.conf
ที่ด้านล่าง ให้เพิ่มบรรทัดที่ระบุค่าใหม่ของเรา:
vm.vfs_cache_pressure=50
บทสรุป
การเพิ่มพื้นที่สว็อป จะทำให้เรามีพื้นเก็บข้อมูล ในกรณีที่อาจนำไปสู่ข้อยกเว้นหน่วยความจำไม่เพียงพอ ซึ่งพื้นที่สว็อปมีประโยชน์อย่างมากในการหลีกเลี่ยงปัญหาที่จะเกิดขึ้น แต่ถ้ามีงบเหลือๆ จัดแรมให้เยอะๆ ไปเลยจะดีกว่า 🙂