สำนักวิทยบริการและเทคโนโลยีสารสนเทศ (สวส.)

Office of Academic Resources and Information Technology

การ 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
ค่า 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 ได้ด้วยการรันคำสั่ง
ผลลัพธ์
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
 
ที่มา : http://www.geekbase.in.th/tuning-apache-mpm-prefork-mode/