รันแอปพลิเคชันของคุณบนหลาย workers พร้อมกันด้วย Python Gunicorn workers

Poolsawat Apin
2 min readOct 22, 2023

Gunicorn เป็นเว็บแอปพลิเคชันเซิร์ฟเวอร์ที่ได้รับความนิยมสำหรับ Python ช่วยให้คุณสามารถรันแอปพลิเคชันของคุณบนหลาย workers พร้อมกัน ซึ่งช่วยให้สามารถรองรับปริมาณการใช้งานที่สูงได้

Workers คือกระบวนการที่ Gunicorn ใช้เพื่อให้บริการคำขอ HTTP แอปพลิเคชันของคุณ

ประเภทของ workers

Gunicorn รองรับประเภทของ workers ต่อไปนี้:

  • Workers แบบ pre-fork: ประเภทนี้สร้าง workers ใหม่สำหรับแต่ละคำขอ HTTP
  • Workers แบบ worker-group: ประเภทนี้สร้างกลุ่ม workers ไว้ล่วงหน้า และจะสลับระหว่าง workers ในกลุ่มนั้นเมื่อมีการร้องขอ
  • Workers แบบ eventlet: ประเภทนี้ใช้ eventlet โมดูลเพื่อจัดการคำขอ HTTP
  • Workers แบบ gevent: ประเภทนี้ใช้ gevent โมดูลเพื่อจัดการคำขอ HTTP

การกำหนดค่า workers

คุณสามารถกำหนดค่า workers ของ Gunicorn ได้โดยใช้ไฟล์การกำหนดค่าหรือตัวเลือกบรรทัดคำสั่ง

ไฟล์การกำหนดค่า Gunicorn อยู่ในไดเร็กทอรี gunicorn.conf.py หรือ gunicorn.conf

ตัวเลือกบรรทัดคำสั่งสำหรับการกำหนดค่า workers ของ Gunicorn มีดังนี้:

  • workers: กำหนดจำนวน workers ที่จะสร้าง
  • worker_class: กำหนดประเภทของ workers ที่จะใช้
  • worker_connections: กำหนดจำนวนการเชื่อมต่อสูงสุดที่แต่ละ worker สามารถยอมรับได้
  • worker_threads: กำหนดจำนวน threads ที่จะสร้างสำหรับแต่ละ worker

การจัดการ workers

คุณสามารถจัดการ workers ของ Gunicorn ได้โดยใช้คำสั่ง gunicorn

คำสั่ง gunicorn มีตัวเลือกต่อไปนี้สำหรับการจัดการ workers:

  • -w: กำหนดจำนวน workers ที่จะสร้าง
  • -k: กำหนดประเภทของ workers ที่จะใช้
  • -c: กำหนดจำนวน connections สูงสุดที่แต่ละ worker สามารถยอมรับได้
  • -t: กำหนดจำนวน threads ที่จะสร้างสำหรับแต่ละ worker

การกำหนดค่า workers แบบ advance

นอกเหนือจากตัวเลือกพื้นฐานสำหรับการกำหนดค่า workers แล้ว Gunicorn ยังมีตัวเลือกขั้นสูงอื่นๆ ที่สามารถปรับแต่งประสิทธิภาพและการทำงานของ workers ได้

ตัวเลือกขั้นสูงบางประการสำหรับการกำหนดค่า workers มีดังนี้:

  • worker_tmp_dir: กำหนดไดเร็กทอรีที่จะใช้สำหรับไฟล์ชั่วคราวของ workers
  • worker_max_requests: กำหนดจำนวนคำขอสูงสุดที่แต่ละ worker สามารถดำเนินการได้ก่อนที่จะถูกรีสตาร์ท
  • worker_max_spare_threads: กำหนดจำนวน threads สูงสุดที่แต่ละ worker สามารถมีได้โดยไม่ทำงาน
  • worker_timeout: กำหนดระยะเวลาสูงสุดที่ workers สามารถดำเนินการคำขอได้ก่อนที่จะหมดเวลา
  • worker_shutdown_timeout: กำหนดระยะเวลาสูงสุดที่ workers สามารถปิดตัวลงได้อย่างสมบูรณ์ก่อนที่จะหยุดทำงาน

ตัวอย่างการกำหนดค่า workers แบบ advance

ต่อไปนี้เป็นตัวอย่างการกำหนดค่า workers แบบ advance:

# gunicorn.conf.py

workers = 3
worker_class = "gevent"
worker_connections = 1000
worker_threads = 10

worker_tmp_dir = "/tmp/gunicorn"
worker_max_requests = 10000
worker_max_spare_threads = 50
worker_timeout = 30
worker_shutdown_timeout = 5

การกำหนดค่านี้กำหนดจำนวน workers เป็น 3 ประเภทเป็น gevent จำนวนการเชื่อมต่อสูงสุดเป็น 1000 จำนวน threads สูงสุดเป็น 10 ไดเร็กทอรีสำหรับไฟล์ชั่วคราวเป็น /tmp/gunicorn จำนวนคำขอสูงสุดต่อ worker เป็น 10000 จำนวน threads สูงสุดที่แต่ละ worker สามารถมีได้โดยไม่ทำงานเป็น 50 ระยะเวลาสูงสุดที่ workers สามารถดำเนินการคำขอได้ก่อนที่จะหมดเวลาเป็น 30 วินาที และระยะเวลาสูงสุดที่ workers สามารถปิดตัวลงได้อย่างสมบูรณ์ก่อนที่จะหยุดทำงานเป็น 5 วินาที

ปัญหาที่อาจเกิดขึ้นกับ workers

ปัญหาที่อาจเกิดขึ้นกับ workers ของ Gunicorn มีดังนี้:

  • Out of memory: เกิดขึ้นเมื่อ workers ใช้หน่วยความจำมากเกินไป
  • Too many connections: เกิดขึ้นเมื่อ workers มีการเชื่อมต่อมากเกินไป
  • Timeouts: เกิดขึ้นเมื่อ workers ไม่ตอบสนองต่อคำขอในเวลาที่กำหนด

แนวทางปฏิบัติที่ดีที่สุดสำหรับ workers

ต่อไปนี้เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับการกำหนดค่า workers ของ Gunicorn:

  • กำหนดจำนวน workers ให้เพียงพอที่จะรองรับปริมาณการใช้งานของคุณ
  • ใช้ประเภทของ workers ที่เหมาะกับแอปพลิเคชันของคุณ
  • กำหนดจำนวน connections สูงสุดให้เพียงพอที่จะรองรับปริมาณการใช้งานของคุณ
  • กำหนดจำนวน threads สูงสุดให้เพียงพอที่จะรองรับปริมาณการใช้งานของคุณ

บทสรุปท้ายบทความ

บทความนี้ครอบคลุมหัวข้อที่สำคัญทั้งหมดเกี่ยวกับ Python Gunicorn workers หวังว่าคุณจะพบว่าบทความนี้มีประโยชน์

--

--

Poolsawat Apin

Senior Engineering, Full Stack Developer [Subscribe Me @poolsawat.com]