0004 | PHP Memory Limit
Saturday, May 3rd, 2008 Posted in PHP Coding | No Comments »Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 4864 bytes) in /path/to/script.php on line 1074
ข้อผิดพลาดนี้ (อันที่จริงก็ทุกอัน) คนทำเว็บคนไหนก็คงไม่ชอบให้มันขึ้นมาหรอกจริงมั้ยครับ
วันนี้จะมาอธิบายการทำงานของ memory limit นิดนึง…
การที่ error อันนี้ขึ้นมาเนี่ย มันกำลังพยายามบอกว่า
ก่อนหน้านี้ มีการขอใช้หน่วยความจำไปแล้วจนเกือบเต็ม 262144 byte (คือเหลือหน่วยความจำว่างๆ อีกไม่เยอะ)
แล้วมีการขอใช้เพิ่มอีก 4864 byte แต่พื้นที่หน่วยความจำที่เหลืออยู่ (ตามที่อนุญาตไว้) มีไม่พอให้ใช้
มันก็เลยต้องจบการทำงานลง เพราะหน่วยความจำหมด
นี่แหละครับคือหน้าที่ของ memory limit
ตัว memory limit มีไว้สำหรับจำกัดการใช้งานหน่วยความจำ ของ “ตัวแปร” ใน PHP ครับ
แบ่งเป็นตัวแปรจากระบบ (พวก $_SERVER $_GET $_POST $_ENV $_SESSION $_COOKIE)
พวกนี้กินอย่างมากก็ประมาณ 50 KB ครับ แล้วที่เหลือก็เป็นส่วนของการทำงานใน code ไป
เชื่อมั้ยครับว่าค่าที่เหมาะสมสำหรับเว็บทั่วไปอยู่ที่ “2M” เอง เพราะปกติเราก็ไม่ใช้อะไรเยอะแยะอยู่แล้ว
สำหรับเว็บที่มีการเรียกใช้ gd library (พวกที่มี captcha อะไรพวกนี้ด้วย) ควรปรับประมาณ 16-24 M
แล้วก็ เว็บฝากไฟล์…. ใช้เท่ากะเว็บปกติครับ (สำหรับส่วนของการ upload)
เนื่องจาก content ในไฟล์ ไม่ได้ถูกนำมาเก็บในหน่วยความจำครับ
ส่วนพวก CMS ต่างๆ เช่น joomla / mambo / phpnuke / wordpress / drupal พวกนี้ควรตั้งขั้นต่ำที่ 8M ครับ
แล้วก็พวก webboard เช่น SMF / IPB / vBullentin / phpBB ควรตั้งขั้นต่ำ 16M ครับ
แต่เอาเข้าจริง ถ้าใช้ไม่ถึงมันก็กินไม่เยอะ ค่าพวกนี้เป็นเพียงแค่การตั้งค่าสูงสุดที่อนุญาตเท่านั้นครับ
ส่วนสำคัญอยู่ที่การ optimize code ของเราให้ทำงานได้เร็ว และประหยัดหน่วยความจำได้มากที่สุดมากกว่า
แล้วถามว่า จะจำกัดไปทำไม ? แรมเหลือเฟือซะอย่าง ไม่กลัวอยู่แล้ว
ลองคิดดูนะครับ สมมติโปรแกรมเมอร์ต้องการลองของ เขียน code นี้ขึ้นมา
$test = “”;
while (1) {
$test .= “more”;
}
ถ้าเกิดไม่มี memory limit นี่เครื่องพังแน่นอนครับ (ใช้แรมเกิน)
แต่กรณีปกติที่อาจจะเกิด คือเขียน script วนซ้ำ แล้วเงื่อนไขการวนซ้ำผิดพลาด
ทำให้เกิดการวนซ้ำไม่รู้จบ (infinite loop) จนมีการจองหน่วยความจำเพิ่มขึ้นเรื่อยๆ
แล้วสุดท้าย หน่วยความจำล้น (buffer overflow) เป็นเหตุให้โดน hack หรืออะไรต่างๆ ตามมาได้มากครับ
วิธีการตรวจสอบหน่วยความจำที่ใช้ไปแล้ว
ใน PHP จะมี function ตัวนึงครับ ไว้เรียกใช้เพื่อดูว่า
ตั้งแต่บรรทัดแรก จนถึง code บรรทัดที่เรียกคำสั่งนี้ ใช้ memory ไปแล้วเท่าไหร่
http://th.php.net/manual/en/function.memory-get-usage.php
ดูใน docs นะครับ ใช้ไม่ยากๆ
ปล. entry นี้อ้างอิงจากที่ > ThaiSEOBoard # ความงี่เง่าของ SLHost <
ปปล. entry นี้เขียน ปล. ก่อนเนื้อหาซะอีก
Tags: memory, optimize, PHP Coding
0003 | รับมือเว็บ 250 req/sec
Saturday, May 3rd, 2008 Posted in PHP Coding, Web Server | 3 Comments »จากหน้าที่แล้ว ที่เราคุยกันถึงเรื่อง DNS Round Robin
สาเหตุที่ต้องใช้ DNS Round Robin มันก็เนื่องมาจากเจ้านี่แหละครับ
* ข้อมูลสถิติ การเข้าใช้งานเว็บ ในวันที่ 2 พฤษภาคม 2551
นี่เฉพาะหน้าเว็บนะ ยังไม่รวม announce process อีกวินาทีละกว่า 100 ครั้ง
ซึ่งไม่สามารถเก็บสถิติได้ เพราะตัวสถิติจะล่มไปซะก่อน
และคนที่เข้าผ่าน URL สำรอง ซึ่งระบบเก็บสถิติไม่ยอมเก็บอีกไม่รู้กี่ครั้ง
เมื่อเจอเหตุการณ์แบบนี้ขึ้น ก็เลยต้องปรับระบบกันทุกทางเลยครับ
ล่าสุดที่เพิ่งปรับ สืบเนื่องมาจากมีคนมาทักใน MSN ว่า
ก็เลยนึกขึ้นมาได้ว่า ไอ้เว็บนี้เราเล่นเปิด gzip compression ไว้ทั้งเว็บเลยนี่หว่า
ปกติถ้าเว็บมีคนเข้าใช้งานไม่เยอะมันก็ไม่น่าจะมีปัญหาอะไรหรอกครับ
แค่ว่า CPU มัน process ไม่ทัน ช่วง Peak ทีนึง ทั้ง CPU ทั้ง RAM พร้อมใจกันทำงานเต็ม process 100% รวด
ก็เลยต้องหาทางลดการทำงานมันลงอีกหน่อย
จากสถิตินั่น ที่น่าสนใจคืออันที่สามครับ (ฮา)
มันคือเกมป๊อกเด้ง แบบ Pure HTML เน้นๆ ครับ ไม่มี ajax ไม่มี stand in
แถมตั้ง refresh ทุกๆ 20 วินาที คนเล่นก็ติดกันงอมแงม ก็เลยมีการใช้งานโคตรเยอะ (ฮาๆ)
เพิ่งมาปิดตอนตีสอง คนไปหลับไปนอนหมดแล้ว
เดี๋ยวตอนสี่ห้าทุ่มวันนี้ (3 พ.ค.) จะมาอัพเดทผลงานอีกทีละกัน
Tags: gzip, optimize, PHP Coding