การ 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