มาทำ Apache ให้กิน RAM น้อยๆ ด้วย mod_fcgid

เราชาว VPS ส่วนใหญ่ จะมีปัญหาร่วมกันคือ RAM จะไม่ค่อยพอ ยิ่งถ้าเว็บมีคนเข้าเยอะๆ แล้วไม่ได้เตรียมตัวไว้ เครื่องก็จะค้างไปเลย

จากประสบการณ์ตรงของผมเอง ตอนแรกผมเช่า VPS ไว้ที่ fsckvps โดยมี RAM 512 MB เป็นแบบ OpenVZ เอาไว้เป็น Web Server สำหรับเว็บเล็กๆน้อยๆของผมเอง 3-4 เว็บ คนเข้าไม่เยอะครับ วันละ 500-700 คน ก็ใช้ได้ดีไม่มีปัญหาเว็บล่มเลย (ยกเว้นกรณีที่ fsckvps โดนแฮ็ก)

ต่อมา ผมอยากลองใช้ Xen VPS เลยย้ายมาใช้ VPS ของ Crucial Paradigm แต่ผมเลือกใช้แบบ RAM 256 MB เพราะอยากให้ค่าใช้จ่ายอยู่ราวๆสิบดอลต่อเดือน ไม่อยากให้เกินกว่านี้มาก ปรากฎว่าเครื่อง CPU 100% แล้วก็ล่มไปเลยบ่อยมาก สัปดาห์ละครั้งสองครั้งเลยทีเดียว ผมเลยต้องหาวิธีแก้ ซึ่งวิธีแก้ก็ไม่ยากครับ แค่เปลี่ยนจากการใช้ mod_php ของ Apache ไปใช้ mod_fcgid แค่นั้นเอง

fcgid มันคืออะไร แล้วมันช่วยลดการใช้ RAM ได้ยังไง ?

ปกติแล้ว ถ้าเราลง Apache และ PHP ไว้ร่วมกัน มันจะใช้ mod_php ในการทำให้ Apache ซึ่งเป็น Web Server เฉยๆ ให้บริการหน้า PHP

เวลา Apache ได้รับ Request เป็นหน้า PHP จากผู้เยี่ยมชม มันก็จะสร้าง Thread การทำงานขึ้นมา แล้วก็โหลดตัวแปรภาษา PHP ขนาดประมาณ 30 MB (ขึ้นอยู่กับว่ามี PHP Module อะไรบ้าง)

สมมติมีคนเข้ามาดูหน้า PHP 5 คนพร้อมๆกัน Apache ก็จะเปิด Thread การทำงานขึ้นมา 5 ตัว ซึ่งก็จะใช้ RAM ไป 30 MB คูณ 5 เท่ากับ 150 MB ทีเดียวเชียว

แต่จริงๆแล้ว คนเยี่ยมชมเว็บเราเขาไม่ได้โหลดหน้า PHP อย่างเดียวครับ บางทีก็โหลดไฟล์รูปบ้าง โหลดไฟล์ css หรือ javascript บ้าง ซึ่งถ้าโหลดไฟล์พวกนี้ ตัวแปรภาษา PHP ของ Thread นั้นที่โหลดมา ก็แทบไม่มีประโยชน์เลย เปลือง RAM เปล่าๆ

สมมติมีคนโหลด PHP 5 คน รวมกับโหลดรูปและไฟล์อื่นๆ 10 คนพร้อมๆกันตลอดเวลา ถ้าใช้วิธีดั้งเดิม Apache ก็จะกิน RAM ไปทั้งหมด 30 MB คูณ 15 เท่ากับ 450 MB ทีเดียว นี่แหละคือสาเหตุที่ทำไม VPS ของผมมันตายเอาๆ ก็แรมแค่ 256 MB แต่ต้องใช้งานตั้ง 450 MB มันก็ swap ไฟล์กันยกใหญ่ จน CPU 100% และตายไปในที่สุด

แต่ถ้าเรามาใช้ fcgid ทุกอย่างจะเปลี่ยนไป เพราะ Apache จะไม่ต้องโหลดตัวแปรภาษา PHP เลย แต่จะไปเรียก script ภายนอกแทน ลักษณะการทำงานจะคล้ายๆกับ cgi สมัยก่อน แต่ว่าเดี๋ยวนี้เขาพัฒนาแล้ว เป็น FastCGI ซึ่งทำให้ทำงานเร็วกว่า cgi แบบเก่าๆ แต่อย่างไรก็ตาม FastCGI (ซึ่งเอาทำเป็น mod_fastcgi) มันยังตั้งค่าอะไรได้ไม่ดีพอ ส่วนใหญ่เขาจึงแนะนำให้ใช้ mod_fcgid แทน เพราะสามารถตั้งค่าได้ว่า จะเปิด Thread ทำงานของ PHP ได้กี่ Thread เปิดได้อย่างมากกี่ Thread และต้องมีเผื่อไว้อย่างน้อยกี่ Thread

เมื่อเปลี่ยนมาใช้ fcgid ตัว Thread การทำงานของ Apache ก็จะใช้ RAM น้อยลง เหลือแค่ประมาณ 3MB ต่อ Thread เวลาคนมาโหลดไฟล์รูป หรือไฟล์อื่นๆที่ไม่ใช่ PHP ก็จะได้ไม่ต้องโหลดตัวแปรภาษา PHP ติดไปให้เปลือง ถ้าลองเอาสถานการ์ณเมื่อกี้มาคำนวนง่ายๆอีกที จะพบว่า Apache จะกินแรมเหลือเพียง 3 MB คูณ 15 บวกกับ 30 MB คูณ 5 รวมเป็น 165 MB เท่านั้นเอง ลดไปตั้งเยอะเลยครับ คราวนี้ VPS ของผมก็จะไม่ตายแล้ว

วิธีการติดตั้ง mod_fcgid

มาเริ่มติดตั้ง mod_fcgi กันเลยครับ ขั้นแรกให้เปิดโปรแกรม Putty ขึ้นมา แล้วล็อกอินเข้าไปใน VPS เลยครับ

One thought on “มาทำ Apache ให้กิน RAM น้อยๆ ด้วย mod_fcgid

Leave a Reply

Your email address will not be published. Required fields are marked *