ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home เพิ่ม Swap File บน Linux Server

เพิ่ม Swap File บน Linux Server

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

สิ่งที่ต้องเตรียม

  • สิทธิ์ root หรือผู้ใช้ที่ใช้ sudo ได้
  • พื้นที่ดิสก์ว่างมากกว่าขนาด Swap ที่ต้องการ ตรวจด้วย df -h /
  • ขนาด Swap ที่เหมาะสม ดูแนวทางด้านล่าง
RAM ของเซิร์ฟเวอร์ขนาด Swap ที่แนะนำเป็นจุดเริ่มต้น
ไม่เกิน 2 GBเท่ากับ RAM ถึง 2 เท่า
2-8 GBเท่ากับ RAM
มากกว่า 8 GB4-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 ไม่พอสำหรับงานที่รันอยู่

ปัญหาที่พบบ่อย

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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security