Performance Benchmark Web Server “ขำๆ”
พูดถึง Web Server ชื่อดังที่หลายคนรู้จัก คงไม่พ้น Nginx ไม่ก็ Apache เพราะ Market Share ของสองเจ้านี้ค่อนข้าง “กว้างเต็มเลน” เลยทีเดียว แต่ก็มีผู้ให้บริการอีกหลายเจ้าในโลก Web Server ที่เน้นความไว แบบว่าไวกว่า Nginx และ Apache ไปหลายเปอร์เซ็นเลย
วันนี้ขอนำเสนอในหัวเรื่อง Performance Benchmark Web Server “ขำๆ” ฉบับรวบรัด เข้าใจง่ายๆ และแน่นอนว่า วันนี้เป็นเพียงแค่การทดลองขำๆ ดังนั้น โพสต์นี้ก็ไม่ได้มีผลได้ผลเสียกับเจ้าไหนทั้งนั้นนะ ไม่มี Sponsors อะไรทั้งสิ้น และถูกเขียนเพื่อจะขอนำเสนอเพียงแค่ “ข้อดี” แค่นั้นพอนะ ใครอยากทราบข้อเสียของแต่ละฝั่ง ผมคงต้องรบกวนไปหาเพิ่มเติมด้วยตนเองแย้ววว
ส่วนตัวผมแล้ว ส่วนมากก็จะใช้ Nginx เป็นขาประจำในการ Serving Static Files ต่างๆ แต่ดั๊นนน ไปเจออีกเจ้าหนึ่ง ชื่อว่า “G-WAN” เร็วจนเรียกว่า The Flash ก็คงได้ และค่อนข้างน่าสนใจมากเลยทีเดียว เพราะดูจากหน้าเว็บก็เหมือนจะข่มศัตรูไว้ได้อย่างน่ากลัว
ดังนั้นแล้ว เรามาสร้างการ Benchmark กัน… ส่วน Requirements งานนี้ มีความต้องการได้แก่
- Web Application สักตัว (Build มาด้วยนะ)
- Docker + docker-compose สำหรับ Run Web Service หลายๆตัวบนเครื่อง
- Gobench (https://github.com/cmpxchg16/gobench) สำหรับ Load Test ที่ใช้ตัวนี้ เพราะเขาโม้ว่า Request Hits กับ Request Rate ดีกว่าเจ้าอื่นๆ และสแปม Client ได้แบบเต็ม 65535 ports เลย…ตะเขร้
สอง-สามอย่างที่เป็น Base ในงานนี้ก็น่าจะเพียงพอในการทำ Benchmark กันแล้ว ต่อมาสร้าง Container ของทั้งสองฝั่งกัน
## ฝั่ง Nginx ##
Build Container โดยใช้ Dockerfile ตามนี้
ข้อสังเกต:
- Web App จะอยู่ใน build/
นะ
- nginx configuration file จะอยู่ที่ nginx/default.conf
ซึ่งก็ไม่ได้มีอะไรมาก default สุดๆ (ปรับจูนแค่แก๊งค์ gzip กะ listen 9998 เสยๆ ซึ่งหาได้ตามเน็ต)
แล้วรัน Build สักครั้งด้วยคำสั่ง
docker build -t web-nginx .
จากนั้น Run Container ผ่าน docker-compose ตามนี้จ่ะ โดยเว็บจะรันอยู่บน localhost:9998/
เด้อพี่น้อง
## ฝั่ง G-WAN ##
ไม่ Build Container เพราะขี้เกียจ (ฮาาา) ให้รัน image ของ retailify/docker-gwan
แทน แล้วก็ docker-compose เลย โดยเว็บจะรันอยู่บน localhost:9990/
เด้อพี่น้อง
ข้อสังเกต:
- Web App จะอยู่ใน build/
เหมือนเดิมนะ แล้วก็จะ Map Volume เข้าไปแทน
NOTE: ทั้งสอง Container ก็ Run docker-compose ด้วยคำสั่งปกติเลย… docker-compose up -d
ปล. Gobench ไปติดตั้งกันเองเด้อ ขอข้าม
เริ่มทดสอบ
ณ ตำแหน่งนี้ Assume ว่า
- Web Nginx รันอยู่บน localhost:9998
- Web G-WAN รันอยู่บน localhost:9990
- ติดตั้ง Gobench แล้ว
เตรียมของพร้อมแล้ว เริ่มโดย
ทดสอบ 1: [Nginx ซ้าย | ขวา G-WAN] ทดสอบ 500 Clients 10 seconds

ทดสอบ 2: [Nginx ซ้าย | ขวา G-WAN] ทดสอบ 2000 Clients 10 seconds

Plot กราฟออกมาหน่อย



สรุป
จากที่ทดสอบ โดยส่วนตัวผมแล้ว ค่อนข้างตะลึ่งกับความเร็วที่ G-WAN ทำได้ เปรียบเทียบกับ NGINX แล้วนั้น ทิ้งห่างแบบไม่เห็นฝุ่นเลยทีเดียว ความจริงแล้วการเปรียบเทียบด้วย Indicator แค่นี้ ไม่ได้เป็นตัวชี้วัดที่บ่งบอกว่าเราควรจะเลือกใช้อะไรดี ถึงแม้ว่าฝั่ง G-WAN จะได้คะแนนสูงลิบลิ่ว แต่การนำเอา G-WAN ไปใช้อาจจะต้องดูเรื่อง ข้อเสีย ความพร้อมในการใช้งาน ความสะดวกในการแก้ปัญหา การปรับจูน การสเกล และ License หรือข้อจำกัดอีกที (เท่าที่ทราบ G-WAN เป็น Freeware ไม่ใช่ Open-source) และถ้าสังเกตดีๆ Real-World Production ก็เห็นเอา G-WAN ไปใช้จริงน้อยอยู่นะ อาจจะเพราะ Community ของ Open-source มันเยอะกว่าอย่างเห็นได้ชัด ช่วยกันแก้ปัญหา ช่วยกันพัฒนา มันก็จะได้เปรียบตรงนี้ สุดท้ายแล้ว กรุณาเลือกใช้อย่างระมัดระวังนะครับ
โซน References
- ทำกราฟโดย: https://live.amcharts.com/
- รวมรูปโดย: https://www.befunky.com/
- G-WAN: http://gwan.com/
- Gobench: https://github.com/cmpxchg16/gobench
- Difference Between G-WAN and Nginx: https://www.difference.wiki/g-wan-vs-nginx/
- Web Server Performance Benchmark: https://www.rootusers.com/web-server-performance-benchmark/
- Serving static files: a comparison between Apache, Nginx, Varnish and G-WAN: https://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/
- retailify/docker-gwan: https://hub.docker.com/r/retailify/docker-gwan
- How to Perform Web Server Performance Benchmark?: https://geekflare.com/web-performance-benchmark/