พอดีทำไว้ให้พนักงานที่มาใหม่ใน forum ของทางเรา เลยนำมาแบ่งปันไว้ในนี้ครับ
ผิดถูกประการใดหรือทำให้สับสนมากขึ้นก็ต้องขออภัยมา ณ ที่นี้ด้วย
ไม่ผิด ขอลองเขียนบ้าง
ถ้าอย่างนี้จะง่ายกว่าไหม
KeepAlive = เมื่อเสร็จ request แล้วยังไม่ต้องปิด connection ให้รอดูว่าจะมี request เข้ามาอีกรึเปล่า ถ้ามีก็ใช้ connection นี้ต่อไปเลย มีประโยชน์สำหรับเว็บที่มี request เยอะๆใน 1 หน้าเว็บ - รูปภาพ 1 รูปนับเป็น 1 request - 1 frame นับเพิ่มอีก 1 request (รูปใน frame นับเพิ่มต่างหากอีก) ดังนั้นเว็บที่มีพวกนี้เยอะๆควรเปิด keepalive ไว้ เพื่อลดจำนวน connection ที่เข้ามา
TimeOut = ช่วงเวลารอการส่งข้อมูลของ apache กับโปรแกรม backend(เช่น PHP, Cgi) หรือ user(คนที่เปิดเว็บ) ถ้ามันรอนานเกินเวลาที่ตั้งเอาไว้มันจะปิด connection เอง ค่านี้ปกติไม่ต้องแก้ เพราะค่า default ก็ใช้ดีอยู่แล้ว
MaxKeepAliveRequests = จำนวนครั้งสูงสุดที่ 1 connection จะสามารถรับ request ได้ (กรณีเปิด keepalive เท่านั้น) ถ้าใน 1 connection รับ request เกินที่กำหนดไว้ connection นั้นจะปิดลงเองอัตโนมัติ ค่านี้ควรตั้งไว้เยอะๆ เพราะไม่เช่นนั้นจะไม่ต่างอะไรกับการเปิด Keepalive
KeepAliveTimeout = (ใช้กับ keepalive)หลังจากรับ request เสร็จ apache จะรอ request ถัดไป ถ้า request ถัดไปไม่เข้ามาภายในเวลาที่กำหนด connection จะปิดลงอัตโนมัติ
StartServers = จำนวน child server processes เมื่อ start apache
MinSpareServers = ถ้ามี child server processes ที่ว่างงานต่ำกว่าค่าที่กำหนดไว้ apache จะสร้าง ถ้ามี child server processes ขึ้นมาใหม่จนกว่าจะมี ถ้ามี child server processes ที่ว่างงานเท่ากับค่าที่กำหนด (อัตราการสร้าง ถ้ามี child server processes อยู่ที่ 1 ถ้ามี child server processes ต่อ 1 วินาที)
MaxSpareServers = ถ้ามี child server processes ที่ว่างงานรวมกันแล้วเกินค่าที่กำหนดไว้ child server processes ที่ว่างงานจะถูกปิดลงเพื่อให้มีจำนวน child server processes ที่ว่างงานไม่เกินค่าที่กำหนด
MaxClients = จำนวน child server processes ทั้งหมดที่ apache จะมีได้ ค่าสูงสุดจะถูกจำกัดไว้ที่ 256 ถ้าต้องการมากกว่านี้ต้องไปแก้ค่า ServerLimit ให้เกิน 256 ด้วย
MaxRequestsPerChild = ถ้า child server processes รับ reuqest ถึงค่าที่กำหนดไว้ child server processes จะถูกปิดเพื่อคืนทรัพยากรกลับสู่ระบบ ค่านี้ควรตั้งไว้ต่ำๆ เนื่องจากในแต่ละ request มีการใช้ทรัพยากรไม่เท่ากัน และในแต่ละครั้งที่เรียกใช้ทรัพยากร child server processes จะไม่คืนทรัพยากรให้แก่ระบบจนกว่า child server processes จะถูกปิด ดังนั้นถ้า child server processes ทำงานต่อเนื่องเป็นเวลานาน อาจทำให้มีการถือครองทรัพยากรเกินความจำเป็นทำให้ทรัพยากรของระบบไม่พอ
เขียนได้รู้เรื่องกว่าผมจริงๆ 555+ แต่ผมว่า TimeOut
ควรจะแก้นะ เพราะค่า default สูงอยู่น่าจะปรับให้ไม่ถึงนาที
TimeOut ถ้าต่ำไปเหมือนจะดีแต่ไม่ดีครับ เพราะเวลา traffic เยอะๆแล้วเครื่องทำงานไม่ทัน(เป็นเยอะกับพวก script ที่มันดึงข้อมูล DB เยอะๆ) มันจะทำให้หลายๆ connection timeout ก่อนข้อมูลจะ process เสร็จ
ส่งผลให้สภาพโดยรวมแย่ลงอีก เพราะไอ้พวกได้ connection กับ child process แล้วกับไม่ได้ข้อมูลกลับไปเพราะ timeout ก่อน ทำให้พวกนี้ต้องกลับมารอ connection ใหม่อีกรอบ (คือ server มันทำงานฟรีๆ ทำงานเสร็จแต่ส่งให้คนใช้ไม่ได้เพราะ timeout ไปแล้ว)
timeout ต่ำมีประโยชน์ที่ผมเห็นชัดเจนอยู่อย่างเดียว คือเวลาที่เขียนโค้ดผิด หรือพวก backend มันมีปัญหา มันจะไม่พา apache ล่มไปด้วย เพราะถ้ามัวแต่รอ backend นานๆมันจะทำให้ connection ของ apache เต็มและรับ load เพิ่มไม่ได้
อ้อแถมอีกเทคนิคนึง สำหรับเครื่องที่รับโหลดเยอะๆ
ควรทำ reverse proxy เอาไว้ด้วย คือเอา proxy service ไปขวางหน้า apache ก่อน เพราะมันจะช่วยลด process time ของแต่ละ user ลงได้ เพราะกว่าที่ process แต่ละตัวจะหมดภาระ มันจะต้องส่งข้อมูลไปให้ user แต่ละคนเสร็จเสียก่อน ซึ่งถ้าเราไปเจอ user ที่เน็ตช้าๆ จะทำให้ process ของ apache ต้องรอส่งข้อมูลแทนที่จะเอาเวลาไปประมวลผลอย่างอื่นที่เกิดประโยชน์มากกว่านี้
เท่าที่ผมทดลอง ถ้าเอา proxy มาช่วยอย่างเดียว สามารถเำพิ่ม capacity ให้ apache ได้เกือบ 10 เท่าเลยครับสำหรับเว็บแบบ PHP แต่ถ้าเป็นเว็บพวก static content น่าจะได้เป็น 100 เท่าขึ้นไป
ขอบคุณสำหรับคำแนะนำดีๆ มากๆ ครับ
ขอบคุณสำหรับความรู้ดีๆครับ