วิธีเพิ่มพื้นที่ Swap บน Ubuntu 20.04

หนึ่งในวิธีในการป้องกันข้อผิดพลาดในกรณีหน่วยความจำไม่เพียงพอในแอปพลิเคชัน คือการเพิ่มพื้นที่สว็อปไปยังเซิร์ฟเวอร์ของเรา ซึ่งปัจจุบันผู้พัฒนาเว็บไซต์นิยมหันมาใช้ 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

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