How To

การ tuning Apache MPM prefork mode

Apapche MPM prefork mode เป็น mode การทำงานที่ง่ายต่อการติดตั้ง php เพราะ prefork mode รองรับการทำงานกับ php module ดังนั้นเมื่อติดตั้ง apache prefork mode + php แล้ว web server ก็พร้อมใช้งานได้ทันที จึงทำให้ Apache MPM preform + php module กลายเป็น default setup ของ OS หลาย ๆ ค่ายไปโดยปริยาย

สำหรับการ tuning Apapche MPM prefork mode สามารถแบ่งออกเป็นส่วน ๆ ได้ดังนี้

Prefork module

สำหรับการ tuning apache prefork mode จำเป็นต้องเข้าใจ parameter ต่าง ๆ เพื่อให้สามารถให้ระบบทำงานได้อย่างมีประสิทธิภาพ ถ้าหากปรับแต่งผิดก็สามารถทำให้ระบบล่มได้

ตัวอย่าง Configuration ของ Apache prefork

<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

ค่า parameter ต่าง ๆ ของ Apache prefork

  • MinSpareservers ค่า minimum idle process ที่อนุญาติให้รันได้ ค่าที่เหมาะ
    • 5 สำหรับ VPS
    • 10 สำหรับ Dedicated server with 1-2GB of RAM
    • 20 สำหรับ Dedicated server with 2-4GB of RAM
    • 25 สำหรับ Dedicated server with 4+GB of RAM
  • MaxSpareServers ค่า maximum idle process ที่อนุญาติให้รันได้ ค่าที่เหมาะสมไม่ควรเกิน MinSpareservers x 2
  • StartServers จำนวน process ที่เริ่มแรกเมื่อต้นการทำงาน ค่าที่เหมาะ ไม่ควรเกิน 5
  • ServerLimit – ควบคุมค่า maximum ของ processes ซึ่งโดยส่วนมากจะมีค่าเท่ากับ MaxClients ถ้าหากตั้งค่า ServerLimit สูงเกินไปจะทำให้ระบบมีปัญหาการใช้งานได้
  • MaxClients – กำหนดค่าสูงสุดของจำนวน simultaneous requests ที่รองรับได้ (ถ้าหากเกินค่าที่กำหนดจะถูกส่งเข้า queue โดยจำนวน queue ที่สามารถรองรับได้มากสุดให้กำหนดที่ ListenBacklog )
  • MaxRequestsPerChild – กำหนดให้ process หนึ่ง ๆ สามารถรองรับ requests ได้กี่ request ถ้าหากเกินที่กำหนด process ดังกล่าวจะถูกปิดลง ค่าที่เหมาะสม
    • VPS ไม่ควรเกิน 500
    • Dedicated server with 1-4GB RAM ไม่ควรเกิน 800
    • Dedicated server with 4+GB RAM ไม่ควรเกิน 2000

การหาค่า MaxClients

เมื่อทราบถึง parameter ต่าง ๆ และค่าที่เหมาะสมในแต่ละ parameter แล้ว ก็ยังเหลือค่า MaxClients และ ServerLimit ที่ยังไม่ได้กล่าวถึงว่าค่าที่เหมาะสมเท่าไหร่ แล้วเราจะรู้ได้ยังไงว่าค่าที่เหมาะสมกับคือเท่าไหร่ ไม่ต้องกังวลครับ เพราะเราสามารถหาค่าต่าง ๆ ได้ด้วยสูตรข้างล่างนี้

MaxClients = [(Total RAM – Space allocated in memory by other processes) / size of every apache process or threads]

สูตรนี้จะทำให้เราทราบจำนวน MaxClients ที่สามารถรับได้ของระบบ ซึ่งโดยปรกติแล้ว MaxClients = ServerLimit

จากสูตรข้างบนสามารถหา size of every apache process or threads ได้ด้วยการรันคำสั่ง

[root@centos ~]#  ps -ylC httpd | awk '{x += $8; ++y} END {print "Apache Memory Usage (MB): "x/1024 " ("y" processes)"; print "Average Proccess Size (MB): "x/((y)*1024)}'

ผลลัพธ์

Apache Memory Usage (MB): 2054.54 (23 processes)

Average Proccess Size (MB): 89.3278

จากผลลัพธ์จะพบว่า size of every apache process or threads จะมีค่าเฉลี่ยอยู่ที่ 89.32MB ซึ่งถ้าหากเรามาหารกับ RAM ที่ Apache สามารถใช้งานได้ จะได้เท่ากับค่า MaxClients ดังสูตร

สมมติว่า RAM ที่จะให้ Apache สามารถใช้งานได้ = 1.5GB ดังนั้น เราสามารถมี MaxClients ได้เท่ากับ

MaxClients = 1536/89.33 = 17.19

ดังนั้นจากผลลัพธ์ด้านบนเราสามารถให้ MaxClients ได้สูงสุด = 17

KeepAlive

KeepAlive On

KeepAlive คือการให้ผู้ใช้งานเข้าใช้งานด้วย connection เดิม ซึ่งถ้าหาก website มี รูป หรือ javascripts ค่อนข้างเยอะ แนะนำให้เปิดใช้งาน (MaxRequestsPerChild จะถูกนับเป็น 1 request)

KeepAliveTimeout 2

ถ้าหากเปิดใช้งาน KeepAlive แล้วให้ทำการแก้ไข KeepAliveTimeout ด้วยเพื่อป้องกันไม่ให้ connection ค้างอยู่ในระบบจำกระทั้งถึงเวลา timeout (default 15s) ค่าที่แนะนำ คือ 1-3 วินาที

MaxKeepAliveRequests 200

MaxKeepAliveRequests เป็นค่าที่กำหนดให้ connection หนึ่งสามารถรองรับ request ได้มากที่สุดเท่าไหร่ก่อนจะปิด connection ลง ดังนั้นถ้าหากเปิดใช้งาน KeepAlive แนะนำให้เพิ่ม MaxKeepAliveRequests เป็น 200-500 เพื่อเพิ่มประสิทธิภาพการทำงานของระบบ

Timeout

Timeout 100

กำหนดเวลาที่ Apache รอการทำงานของ I/O บนสถานะการณ์ต่าง ๆ เช่น การรอ TCP packet, รอ acknowledgement ของ packet หรือการรอ output ของ script ต่าง ๆ เป็นต้น ดังนั้นหากตั้งค่านานเกินจะทำให้ process ค้างในระบบและไม่สามารถรองรับ Client อื่น ๆได้ ค่าที่แนะนำคือ ไม่ควรเกิน 100

ที่มา : Peerapach Varalertsakul

Admin

ศึกษาการทำ Blog มาหลายปีและเริ่มศึกษาเรื่อง SEO มาได้ 10 ปี จนรู้ว่า Google ต้องการอะไร สามารถทำให้หน้าที่เขียนบทความไปสามารถติดหน้าแรกของ Google

Related Articles