[Update] วิธีเพิ่ม Swap Memory ใน Elastic Beanstalk

หาก Instance ที่ถูกสร้างจาก Elastic Beanstalk มีการใช้งานเกินกว่าความจุที่กำหนดไว้ สามารถ Swap Memory ให้กับ Instance ได้โดยตั้งค่าไฟล์ "01_swap.config" ในโฟลเดอร์ ".ebextensions" ที่รวมอยู่ใน Project

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

กรณีที่ Memory ของ Instance ที่ถูกสร้างจาก Elastic Beanstalk มีการใช้งานเกินกว่าความจุที่กำหนดไว้ สามารถ Swap Memory ให้กับ Instance ได้โดยตั้งค่าไฟล์ 01_swap.config ในโฟลเดอร์ .ebextensions แล้ว Deploy ไปยัง Elastic Beanstalk ก็จะทำให้เพิ่มประสิทธิภาพการทำงานของ Memory ใน Instance ที่ถูกสร้างจาก Elastic Beanstalk และลดการเกิดปัญหา Out of Memory (OOM) ที่อาจทำให้แอปพลิเคชันหยุดทำงานหรือ Crash ได้ครับ

สิ่งที่ต้องมี

  • สร้าง Application และ Deploy Project ใน Environment บน Elastic Beanstalk แล้ว

เลือก Deploy Project ใน Elastic Beanstalk ได้ตามลิงก์ด้านล่างนี้

เตรียมไฟล์สำหรับ Deploy ใน Elastic Beanstalk

ไฟล์ที่จะสร้างมีดังนี้

  • โฟลเดอร์ ".ebextensions"
  • ไฟล์ ".ebextensions/01_swap.config"

สร้างโฟลเดอร์ .ebextensions และไฟล์ 01_swap.config

Project ที่ใช้เป็นตัวอย่างนี้ จะอ้างอิงจากลิงก์บทความด้านล่างนี้ (สามารถดำเนินการใน Project อื่นๆ ได้เช่นเดียวกัน)

การสาธิตนี้เป็นการแนะนำแบบง่ายๆ ก็จะสร้างไฟล์ด้วย Notepad บนอุปกรณ์ Windows
ดูรายละเอียดเพิ่มเติมได้ที่ เตรียมไฟล์สำหรับใช้ใน Elastic Beanstalk

การตั้งค่านี้จะ Swap Memory ขนาด 1024 MB (หรือ 1 GB) ใน Instance ที่สร้างขึ้นจาก Environment

ก่อนอื่นให้สร้างโฟลเดอร์ .ebextensions ใน Project ที่จะ Deploy และสร้างไฟล์ 01_swap.config ในโฟลเดอร์ ".ebextensions" อีกที ก็จะเป็น .ebextensions/01_swap.config
แล้วคัดลอก Code ด้านล่างนี้วางลงในไฟล์ 01_swap.config แล้วบันทึก
*เราสามารถ Swap Memory ได้ตามขนาดที่ต้องการ โดยเปลี่ยนขนาดที่ count=[memory_size] ที่สำคัญ Storage ต้องมีความจุเพียงพอจึงจะทำ Swap Memory ได้

commands:
  01_swap_memory:
    test: '[ ! -e /var/swap.1 ]'
    command: |
      /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
      /sbin/mkswap /var/swap.1
      /sbin/swapon /var/swap.1


เมื่อเตรียมไฟล์ ".ebextensions/01_swap.config" เสร็จแล้ว ให้บีบอัดไฟล์ Project เป็นไฟล์ ZIP ซึ่งวิธีการแบบอัดไฟล์มีหลายวิธี แต่ครั้งนี้จะบีบอัดไฟล์ดังนี้

การบีบอัดไฟล์ครั้งนี้จะบีบอัดโฟลเดอร์ .ebextensions รวมกับไฟล์ info.php ที่ใช้เป็น Project เนื่องจากสามารถแสดงผลหน้าเว็บไซต์ได้

ดูตัวอย่างเพิ่มเติมได้ที่นี่เฉพาะเนื้อหาการบีบอัดไฟล์นี้: Compress to ZIP file (2 ไฟล์)

วิธีการบีบอัดไฟล์ง่ายๆ คือเลือกไฟล์ที่จะบีบอัด แล้วคลิกขวาที่ไฟล์ใดไฟล์หนึ่ง แล้วเลือก Compress to ZIP file

แล้วตั้งชื่อไฟล์ ZIP ตามต้องการ

เมื่อเตรียมไฟล์เสร็จแล้ว Deploy Project ได้เลย (วิธี Deploy สำหรับกรณีที่ Environment กำลังทำงาน)

เชื่อมต่อกับ Instance ที่ถูกสร้างจาก Elastic Beanstalk ด้วย PuTTY

เชื่อมต่อกับ Instance ที่ถูกสร้างจาก Elastic Beanstalk ด้วย PuTTY เพื่อตรวจสอบผลลัพธ์การตั้งค่า Swap

ดูตัวอย่างที่นี่เฉพาะหัวข้อย่อยนี้: การเชื่อมต่อกับ EC2 Instance ด้วย PuTTY

ตรวจสอบ Swap

รันคำสั่งตรวจสอบ Memory ใน Server Instance ที่สร้างจาก Elastic Beanstalk

free -m

ดูที่แถว Swap จะเห็นว่ามี "total = 1023 (count=1024)" ซึ่งเป็นค่า Memory ที่ได้กำหนดในไฟล์ 01_swap.config

root@ip-xx-xx-xx-xx:~

Using username "ec2-user".
Authenticating with public key "tinnakorn-swap-config"
  _____ _           _   _      ____                       _        _ _
 | ____| | __   ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
 |  _| | |/ _ \/ __| __| |/ __|  _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
 | |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
 |_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\

 Amazon Linux 2023 AMI

 This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
 WILL BE LOST if the instance is replaced by auto-scaling. For more information
 on customizing your Elastic Beanstalk environment, see our documentation here:
 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.                                        html

   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$ free -m
               total        used        free      shared  buff/cache   available
Mem:             909         372         299          26         237         396
Swap:              0           0           0
[ec2-user@ip-xx-xx-xx-xx ~]$ free -m
               total        used        free      shared  buff/cache   available
Mem:             909         369          53          26         485         397
Swap:           1023           0        1023
[ec2-user@ip-xx-xx-xx-xx ~]$


เพียงเท่านี้การทำ Swap Memory ก็เสร็จแล้ว นอกจากนี้เราสามารถทำ Swap Memory โดยการตั้งค่าด้วยภาษาโปรแกรมที่นอกเหนือจาก PHP ได้ (Environment ของ Elastic Beanstalk ที่ใช้ Amazon Linux 2023 จะสามารถใช้งานได้ทั้งหมด)

สรุป

การทำงานของ Swap Memory คือการดึงพื้นที่ Storage ใน EBS มาสร้าง Swap Memory เพื่อทำหน้าที่เป็นหน่วยความจำเสมือน และทำให้ระบบการทำงานของ Linux Instance เร็วขึ้น ซึ่งวิธีนี้เราสามารถใช้กับ Elastic Beanstalk ได้ นอกจากนี้ยังช่วยให้การใช้ EC2 Instance มีราคาที่ถูกขึ้นอีกด้วย ดังนั้นแนะนำให้มาลองทำ Swap Memory กันครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง