ทดสอบประสิทธิภาพเครื่องด้วย apachebench + newrelic by heha
Jul0
ช่วงนี้กำลังทดสอบประสิทธิภาพ server เลยต้องใช้งาน apachebench (ขอเรียกสั้นๆ ว่า ab) เป็น tools ในการทดสอบประสิทธิภาพ server อย่างหนึ่ง หลังจากลงโปรแกรมแล้ว เราสามารถทดสอบการใช้งานได้ดังนี้
ลองพิมพ์คำสั่งด้านล่างกัน โดย -n คือจำนวน request ทั้งหมดที่จะยิง และ -c คือจำนวน concurrent connection ที่จะใช้ (คือจำลองว่ามีผู้ใช้เข้าใช้งานพร้อมกันกี่คนนั่นเอง) โดยเวลาพิมพ์ชื่อเว็บอย่าลืมพิมพ์ / ต่อท้ายด้วยไม่งั้นจะยิงไม่ได้ ผลจะเป็นดังนี้
วิธีแก้ปัญหาเมื่อตาราง InnoDB ไม่สามารถ alter, optimize, dump ได้เลย by heha
Jun0
เนื่องจากช่วงนี้มีปัญหาโลกแตกที่ตาราง InnoDB อยู่ๆ ก็เกิด alter, optimize, dump ไมได้เลยซักกะอย่าง มันจะบอกว่า “MySQL server has gone away” หรือ “Error 2013: Lost connection to MySQL server during query when …” ซึ่งช่างเป็น error ที่สื่อความหมายได้ดีเยี่ยมเสียจริง! ไปดูใน log error ก็ฟ้องว่า thread MySQL ตายกลางทาง กรุณา submit bug ไปให้ MySQL เอ่อ… พอสั่ง Check table มันก็บอกว่าปกติดี เอะยังไง! สุดท้ายเนื่องจากจนปัญญาจึงต้องมานั่ง query ทีละ rowๆ ออกมาใส่ตารางใหม่ที่โครงสร้างเหมือนเดิม ซึ่งได้ผลดังนี้
1. ตารางที่ query มันใหญ่มาก! ไม่สามารถสั่ง INSERT INTO user2 (SELECT * FROM user) ได้ตรงๆ เลยแบบง่ายๆ
2. ลองสั่ง INSERT INTO user2 (SELECT * FROM user LIMIT 0,1000) ไรทำนองนี้ก็ไม่ให้อีก! มันฟ้องว่า subquery ไม่ support limit เวรจริงๆ ครับ 55
3. ลองใช้ php ช่วย คือสั่ง SELECT * FROM user WHERE user_id NOT IN (SELECT user_id FROM user2) LIMIT 0,1000 แล้วค่อยเอา user_id ที่ได้มา query ต่อเป็น “INSERT INTO user2 (SELECT * FROM user WHERE user_id IN(”.implode(’,', $a_user_id).”))” ก็ยังไม่ได้เพราะแต่ละ row มันใหญ่มาก กว่าจะเสร็จก็ช้ามากๆ
4. สุดท้ายจึงได้เป็น SELECT user_id FROM user WHERE user_id NOT IN (SELECT user_id FROM user2) LIMIT 0,1000 แล้วต่อด้วย ”INSERT INTO user2 (SELECT * FROM user WHERE user_id IN(”.implode(’,', $a_user_id).”))” เหมือนเดิม ก็ใช้ได้ละครับ
5. รันไปซักพักพบ “MySQL Server has gone away” อีกแล้ว - -” จึงค่อยๆ ลด Limit มาเหลือ 1 ก็ยังพัง และค่อยๆ ลอง SELECT * FROM user WHERE id=1 ไปเรื่อยๆ โดยเปลี่ยน * เป็น field ในตารางที่มีทีละ field ปรากฏว่าก็เจอ field เจ้าปัญหาจนได้ เป็น Text field นี่เอง! ซึ่งเราไม่สามารถแม้กระทั่งสั่ง DELETE FROM user WHERE id=1 ช่างโหดร้ายยิ่ง!
6. ต่อมาจึงต้องใส่ offset เพื่อ skip row ที่มีปัญหาไป แล้วก็รันๆ ไปซักพักอีกก็เจออีก สรุปว่าข้อมูล user แสนคน เจอ row ที่มีปัญหาทั้งหมด 5 row มันไปทำอีท่าไหนถึงพังก็ไม่อาจทราบได้ และตอนนี้ก็สามารถกลับมาใช้งานได้ตามปกติซะที
5 เทคนิคการปรับปรุงเว็บไซต์ให้ทำงานได้รวดเร็วขึ้น by heha
May0
บทความนี้ค่อนข้างจะเป็นบทความภาคต่อจาก ทำไมเว็บไซต์ของคุณช้า หรือล่มบ่อย? โดยเป็นรูปแบบ Software Architecture (สถาปัตยกรรมของซอฟต์แวร์) ที่ต้องใช้ในการรันเว็บ application แต่ก่อนจะไปถึงขั้นนั้นคงต้องถามตัวเองให้ดีก่อนว่าเว็บไซต์ของคุณเป็นเว็บไซต์ที่ใช้งานหนักทางด้านไหน? คนนิยมทำอะไรบนเว็บไซต์ของคุณเพื่อที่จะได้ปรับปรุงเปลี่ยนแปลงรูปแบบการวางระบบของเราได้เหมาะสม ได้แก่
- เว็บไซต์ของคุณมีรูปแบบ operation ใดมากกว่ากันระหว่าง Read กับ Write? เป็นเว็บที่เน้น Read อย่างเดียวหรือเป็นส่วนมากหรือไม่
- หากเว็บไซต์ของคุณจำเป็นต้องใช้งาน read มากๆ ลองคิดดูให้ดีว่าข้อมูลที่แสดงให้ User เห็นจำเป็นต้องเป็นข้อมูลที่ Real Time แค่ไหน ข้อมูล update ช้าลงแค่ 5-10 นาทีจะเป็นอะไรหรือไม่ เช่น สถิติการใช้งานต่างๆ ที่มักต้องใช้ข้อมูลจากหลายๆ ส่วนมาประมวลผลรวมกันมากๆ อาจคำนวณแค่เพียงทุกๆ 5-10 นาที แต่ทุกครั้งที่คนคลิกเพื่อดูข้อมูลเราเพียงแสดงข้อมูลที่ผ่านการคำนวณเก็บไว้อยู่แล้วมาแสดงเท่านั้น (Cache)
- หากเว็บไซต์ของคุณจำเป็นต้องใช้งาน write มากๆ ลองคิดดูให้ดีว่าข้อมูลของคุณจำเป็นต้อง Durability สูงหรือไม่ (ข้อมูลเมื่อเปลี่ยนแปลงแล้วต้องคงอยู่ตลอดไปหรือไม่) เช่นระบบ chat ที่ใช้เพียงคนคุยกันแค่ไม่กี่ครั้งก็ล้างข้อมูลทิ้งหมดแล้ว ข้อมูลเก่าๆ ไม่มีการใช้งานอีก แบบนี้อาจพิจารณาการเก็บข้อมูลทั้งหมดใน Memory แทน
- หาก write เยอะ ข้อมูลที่คุณต้องเปลี่ยนในการเซพข้อมูลลงหนึ่งครั้ง สามารถเปลี่ยนแนวคิดจากการ write ทุกครั้งที่เปลี่ยนแปลงทันทีมา write เฉพาะตอนที่ web server สิ้นสุดการทำงานครั้งสุดท้ายเพียงแค่ครั้งเดียวได้หรือไม่
- และอื่นๆ อีกมาก
หลายคนจึงอาจเกิดข้อสงสัยขึ้นมาว่าแล้วเราจะทำอะไรได้บ้าง? ก็มีวิธีต่างๆ ดังต่อไปนี้
ARPU คืออะไร และ Social Game มี ARPU เฉลี่ยเท่าไร by heha
Apr1
ARPU (Average Revenue Per User) คือปริมาณรายได้ต่อจำนวนคนทั้งหมดในเกม ใช้เป็นค่าที่ประเมินได้ระดับนึงว่าเกมเราสามารถสร้างรายได้มากน้อยเพียงใด
ตัวอย่าง ARPU บน Social Game:
เกมประเภททำฟาร์ม: $0.1-$0.2
เกมประเภท Mafia Wars: : $0.25-$1
เกมประเภทสร้างเมือง: <$0.1
เกมประเภทพนัน (poker, lottery, slots): $0.25-$1
ข้อมูลนี้นับจากวันที่ 7 พฤษภาคม 2010 อาจจะเก่าไปหน่อย แต่ก็พอใช้อ้างอิงได้บ้าง
Test Driven Development (TDD) by heha
Mar1
ผมไปฟังพี่ @roofimon ในวัน Bug Day มา เลยเอามาแชร์ต่อ เนื่องจากปัญหาการ Develop งานแบบเก่าอาจเกิดปัญหาดังต่อไปนี้
- ฝั่ง Programmer เขียน code มาแล้วส่งมาให้ Tester ปรากฏว่า Bug ตรึม Tester ก็โวยวายใส่ Programmer
- Tester รายงานว่ามี Bug อะไรบ้างกลับไปให้ Programmer แล้วปรากฏว่า Programmer แก้ bug ตัวใหม่เสร็จ Bug ตัวเก่ากลับปรากฏขึ้นมาซ้ำทั้งๆ ที่แก้ไปแล้ว
- เมื่อ Bug เกิดขึ้นหนึ่งครั้ง หาต้นตอของ Bug ยาก ไม่รู้เริ่มผิดตั้งแต่ตรงไหน ต้องมาพิมพ์ print ไล่ code ทีละส่วน
- “เครื่องผมไม่เห็น bug เลย ทำไมเครื่องคุณ bug ล่ะ Test ยังไงเนี่ย”
- “เมื่อวานยังไม่ Bug เลย ทำไมวันนี้มันพังตอน present ให้หัวหน้าดูได้(วะ)เนี่ย”
- เมื่อเกิดปัญหาเช่น performance หรือต้องมีการแก้ไข Code ส่วน Core หลักที่ใช้งานทุกๆ ที่ จะไม่สามารถมั่นใจได้เลยว่าแก้ไปแล้ว Code เก่าที่อื่นจะ Bug หรือไม่
- อื่นๆ อีกมากมาย
Test Driven Development (ต่อไปนี้ขอเรียก TDD) จะเข้ามาช่วยแก้ปัญหา หรือบรรเทาปัญหาเหล่านี้ลงได้ ซึ่งต้องมีการเขียน Unit Test (การทดสอบการทำงานของ Code ด้วย Code ทำให้สามารถสั่งรันแบบ automatic ได้) โดยมีหลักการดังนี้
