เพิ่ม Swap File บน Linux Server
คำตอบสั้น ๆ: สร้าง Swap File เพื่อลดโอกาสที่ MySQL หรือ PHP ถูก OOM Killer ปิดเมื่อ RAM เต็ม ตั้งให้เปิดอัตโนมัติหลังรีบูต และปรับค่า swappiness ให้เหมาะกับเซิร์ฟเวอร์
คู่มือนี้อธิบาย Swap File ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Swap คือพื้นที่บนดิสก์ที่ Linux ใช้เป็นหน่วยความจำสำรองเมื่อ RAM ใกล้เต็ม Cloud Server หลาย Image ไม่ได้สร้าง Swap ไว้ให้ เมื่อโปรแกรมใช้ RAM เกิน ระบบจะเรียก OOM Killer มาปิดโปรแกรมที่ใช้หน่วยความจำมาก ซึ่งมักเป็น MySQL/MariaDB หรือ PHP-FPM ทำให้เว็บไซต์ล่มกะทันหัน การเพิ่ม Swap File ช่วยให้ระบบมีที่พักข้อมูลในช่วงที่ใช้หน่วยความจำพุ่งสูงชั่วคราว
ควรเข้าใจว่า Swap ช้ากว่า RAM มาก จึงเป็นเพียงตาข่ายนิรภัย ไม่ใช่สิ่งทดแทน RAM ถ้าเซิร์ฟเวอร์ใช้ Swap หนักอยู่ตลอดเวลา แปลว่าควรเพิ่มสเปก RAM คู่มือนี้ใช้ได้กับ Ubuntu 22.04/24.04 และ AlmaLinux/Rocky Linux 8-9 บนระบบไฟล์ ext4 หรือ XFS
สิ่งที่ต้องเตรียม (Swap File)
- สิทธิ์ root หรือผู้ใช้ที่ใช้
sudo ได้
- พื้นที่ดิสก์ว่างมากกว่าขนาด Swap ที่ต้องการ ตรวจด้วย
df -h /
- ขนาด Swap ที่เหมาะสม ดูแนวทางด้านล่าง
| RAM ของเซิร์ฟเวอร์ | ขนาด Swap ที่แนะนำเป็นจุดเริ่มต้น |
| ไม่เกิน 2 GB | เท่ากับ RAM ถึง 2 เท่า |
| 2-8 GB | เท่ากับ RAM |
| มากกว่า 8 GB | 4-8 GB ก็เพียงพอสำหรับงานเว็บและฐานข้อมูลทั่วไป |
ตัวอย่างในคู่มือนี้สร้าง Swap ขนาด 2 GB
ขั้นตอนที่ 1: ตรวจว่ามี Swap อยู่แล้วหรือไม่
sudo swapon --show
free -h
ถ้า swapon --show ไม่แสดงอะไรเลย และบรรทัด Swap: ของ free -h เป็น 0B แปลว่ายังไม่มี Swap ถ้ามีอยู่แล้วและต้องการเพิ่ม สร้างไฟล์ที่สองด้วยชื่ออื่นได้ เช่น /swapfile2
ขั้นตอนที่ 2: สร้างไฟล์ Swap
sudo fallocate -l 2G /swapfile
fallocate จองพื้นที่ทันทีโดยไม่ต้องเขียนข้อมูลจริง จึงเสร็จในไม่กี่วินาที ถ้าคำสั่งแจ้งว่าไม่รองรับ หรือขั้นตอนที่ 4 แจ้งว่าไฟล์มี Hole ให้ลบไฟล์แล้วสร้างใหม่ด้วย dd ซึ่งเขียนศูนย์ลงไปจริงทั้งไฟล์ (ใช้เวลานานกว่า)
sudo rm -f /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
ตรวจขนาดไฟล์
ls -lh /swapfile
ควรเห็นขนาด 2.0G
ขั้นตอนที่ 3: ตั้งสิทธิ์ไฟล์
Swap อาจมีข้อมูลที่อยู่ในหน่วยความจำ เช่น รหัสผ่านหรือข้อมูลลูกค้า จึงต้องให้ root อ่านเขียนได้เท่านั้น
sudo chmod 600 /swapfile
ถ้าข้ามขั้นตอนนี้ swapon จะเตือน insecure permissions 0644, fix with: chmod 0600 /swapfile
ขั้นตอนที่ 4: จัดรูปแบบและเปิดใช้งาน
sudo mkswap /swapfile
sudo swapon /swapfile
mkswap จะแสดงข้อความประมาณ Setting up swapspace version 1, size = 2 GiB ส่วน swapon ไม่แสดงอะไรเมื่อสำเร็จ
ขั้นตอนที่ 5: ให้ Swap เปิดอัตโนมัติหลังรีบูต
Swap ที่เปิดด้วย swapon จะหายไปเมื่อรีบูต ต้องเพิ่มลงในไฟล์ /etc/fstab ไฟล์นี้สำคัญต่อการบูต ถ้าเขียนผิดเครื่องอาจบูตไม่ขึ้น ให้สำรองไว้ก่อน
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
ตรวจว่าไฟล์ fstab อ่านได้ถูกต้องโดยไม่ต้องรีบูต
sudo findmnt --verify
ผลลัพธ์ไม่ควรมีบรรทัดที่ขึ้นต้นด้วย [E] (Error) ถ้ามี ให้คืนไฟล์เดิมด้วย sudo cp /etc/fstab.bak /etc/fstab แล้วตรวจอีกครั้ง
ขั้นตอนที่ 6: ปรับ swappiness (ไม่บังคับ)
ค่า vm.swappiness (ค่าเริ่มต้นคือ 60) บอกว่า Kernel จะย้ายข้อมูลจาก RAM ไป Swap เร็วแค่ไหน สำหรับเซิร์ฟเวอร์เว็บและฐานข้อมูล นิยมลดลงเหลือ 10 เพื่อให้ใช้ RAM ก่อนและใช้ Swap เมื่อจำเป็นจริง ๆ
cat /proc/sys/vm/swappiness
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
ค่าใหม่มีผลทันทีและคงอยู่หลังรีบูต
ตรวจสอบผลลัพธ์
sudo swapon --show
free -h
ตัวอย่างผลลัพธ์ที่ถูกต้อง
NAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2
และบรรทัด Swap: ของ free -h ต้องแสดงขนาดรวมประมาณ 2.0Gi ถ้าต้องการยืนยันว่าค่าใน fstab ใช้ได้จริง ให้รีบูตในช่วงเวลาที่กระทบผู้ใช้น้อยแล้วรัน swapon --show อีกครั้ง
ติดตามการใช้งาน Swap ในระยะยาวด้วย vmstat 5 ถ้าคอลัมน์ si และ so (Swap In/Out) มีค่าสูงตลอดเวลา แปลว่า RAM ไม่พอสำหรับงานที่รันอยู่
ปัญหาที่พบบ่อยเกี่ยวกับ Swap File
swapon: /swapfile: swapon failed: Invalid argument
มักเกิดเมื่อไฟล์ถูกสร้างด้วย fallocate บนระบบไฟล์ที่ Swap ไม่รองรับไฟล์แบบนั้น ให้สร้างไฟล์ใหม่ด้วย dd ตามขั้นตอนที่ 2 ถ้าระบบไฟล์เป็น Btrfs ต้องใช้วิธีเฉพาะ ดู เอกสาร Btrfs เรื่อง Swapfile
fallocate: fallocate failed: No space left on device
พื้นที่ดิสก์ไม่พอ ลดขนาด Swap หรือเคลียร์พื้นที่ก่อน ดู ดิสก์เต็ม: ตรวจสอบพื้นที่และหาไฟล์ขนาดใหญ่บน Linux
ต้องการลบหรือเปลี่ยนขนาด Swap
ปิด Swap ก่อน (ต้องมี RAM ว่างพอรับข้อมูลที่อยู่ใน Swap ตรวจด้วย free -h) ลบบรรทัด /swapfile ออกจาก /etc/fstab แล้วจึงลบไฟล์
sudo swapoff /swapfile
sudo nano /etc/fstab
sudo rm /swapfile
ถ้าต้องการขนาดใหม่ ให้ทำตามขั้นตอนที่ 2 ถึง 5 อีกครั้งหลังลบไฟล์เดิม
มี Swap แล้วแต่โปรแกรมยังถูก OOM Killer ปิด
ตรวจ Log ด้วย sudo journalctl -k | grep -i 'out of memory' ถ้ายังเกิดซ้ำแปลว่าใช้หน่วยความจำเกินทั้ง RAM และ Swap ควรลดค่าการใช้หน่วยความจำของโปรแกรม เช่น จำนวน Process ของ PHP-FPM หรือ Buffer ของฐานข้อมูล หรือเพิ่ม RAM ของเซิร์ฟเวอร์
หากไม่แน่ใจว่าควรเพิ่ม Swap หรือเพิ่ม RAM สำหรับงานของคุณ ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
สรุปขั้นตอน Swap File
ทบทวน Swap File ทั้งหมดตามลำดับ ก่อนนำไปใช้กับระบบจริง
- ตรวจว่ามี Swap อยู่แล้วหรือไม่
- สร้างไฟล์ Swap
- ตั้งสิทธิ์ไฟล์
- จัดรูปแบบและเปิดใช้งาน
- ให้ Swap เปิดอัตโนมัติหลังรีบูต
- ปรับ swappiness (ไม่บังคับ)
เมื่อทำครบทุกข้อแล้ว Swap File จะพร้อมใช้งาน หากผลลัพธ์ไม่เป็นไปตามที่คาด ให้ย้อนกลับไปดูหัวข้อปัญหาที่พบบ่อยด้านบน ซึ่งรวบรวมกรณีที่พบจริงจากการใช้งาน Swap File ไว้แล้ว
อ่านเพิ่มเติมเกี่ยวกับ Swap File