หาว่า Code PHP ส่วนไหนทำงานช้าด้วย Xdebug PHP Extension by

31
Oct
0

เคยเจอปัญหา Code PHP ทำงานช้าโดนไม่ทราบสาเหตุไหม? แถมเราไม่รู้อีกตะหากว่าไฟล์ไหน บรรทัดที่เท่าไหร่ทำงานช้า จะให้ไปไล่ Code ด้วยมือก็ Code มีเป็นหมื่นเป็นแสนบรรทัด ไม่รู้จะเริ่มยังไงกว่าจะหาเจอ แถมดันช้าเฉพาะบน Server Production อีกตะหาก แต่ชีวิต PHP Developer ก็ไม่ได้ยากขนาดนั้นหากเรารู้จัก Tools ตัวนี้ มันชื่อว่า Xdebug ครับ เป็น PHP Extension นั่นเอง วิธีลงก็แสนง่ายดาย

sudo apt-get install php-xdebug

แค่นี้จบ (Debian/Ubuntu นะ) แต่ถ้าคุณใช้ Linux OS เก่าๆ หน่อย สั่งแล้วหา package ไม่เจอ ก็อาจจะต้อง Download มา compile ด้วย phpize เองดังนี้

  1. Download version ล่าสุดที่เว็บ Xdebug (เขียนว่า source)
  2. tar -xvzf xdebug-x.x.x.tgz (เปลี่ยนชื่อไฟล์ตามเวอร์ชั่นที่โหลดมา)
  3. cd เข้า dir ที่แกะ zip ออกมาตะกี้
  4. phpize
  5. ./configure
  6. make
  7. cp modules/xdebug.so

หลังจากลงเรียบร้อย (ไม่ว่าจะวิธีใดก็ตาม) แก้ไข php.ini โดยเพิ่มคำสั่งตามด้านล่าง (ถ้าลงผ่าน apt-get install อาจจะมีไฟล์ 20-xdebug.ini อยู่แล้ว ให้แก้ไขที่ไฟล์นั้นแทน php.ini)

zend_extension=xdebug.so // อันนี้สั่ง enable extension
xdebug.profiler_output_dir=<save_path> // อันนี้แก้ <save_path> เป็น path ที่เราจะเก็บไฟล์ profiler เอาไว้ write permission ต้อง write โดย user ที่รัน Process php ได้ ส่วนใหญ่จะเป็น www-data ถ้าขี้เกียจคิดมากก็ chmod 0777 <save_path> ไปเลย
xdebug.profiler_enable=0 // สั่ง enable ให้เซพไฟล์ profiler ตรงนี้ถ้ายังไม่ใช้ให้ใส่เป็น 0 ไปก่อน จะใช้เมื่อไหร่ค่อยปรับเป็น 1

** xdebug.profiler_enable นี้สำคัญมาก ไม่ควรใส่ 1 ตลอดเวลา ไม่อย่างนั้นพื้นที่ Harddisk คุณจะเต็มเร็วมาก!!

ก่อนจะใช้งานกับ Production Server ตัวจริงแนะนำให้ทดลองกับ Development Server ที่มีคนเข้าแค่คนภายในก่อน แล้วแก้ php.ini บรรทัด xdebug.profiler_enable=1 ครับ พร้อมเมื่อไหร่ก็สั่ง restart apache หรือ php-fpm (แล้วแต่ว่า server ใช้ตัวไหนอยู่) เพื่อให้ Xdebug เริ่มทำงาน แล้วให้ลองเข้าหน้าเว็บผ่าน browser สักหน้าหนึ่ง แล้วแวะไปดูที่ <save_path> ที่กำหนดเอาไว้แต่แรก หากทุกอย่างถูกต้องจะมีไฟล์ cachegrind.out.xxxx ปรากฏออกมาหลายๆ ไฟล์ ก็ให้ Download file พวกนี้แหละลงมาที่เครื่องเราให้หมด (แนะนำให้สั่ง tar -zcvf <save_zip_file_name> <save_dir> ก่อน)

ขั้นตอนสุดท้าย Download โปรแกรมดูผล Profiler ครับ มีสองตัว ใครใช้ Windows โหลด WinCacheGrind ใครใช้ Linux โหลด KCacheGrind โหลดเสร็จก็เปิดมาสั่ง File -> Open cachegrind.out.xxxx ที่พึ่ง Download มาตะกี้ก็จะดูได้แล้วดังรูปครับ

xdebug

ดูที่ช่อง Self กับ Cum. ก็จะรู้เวลาที่ใช้เรียบร้อย โดย Self ตัวเฉพาะ function นี้ที่ตัวมันเองเรียกเนี่ยใช้เวลาเท่าไหร่ และ Cum. คือรวมเวลา function ลูกที่ function นี้ไป call ต่ออีกทีทั้งหมดใช้เวลาเท่าไหร่ (- แสดงว่าน้อยมากจนแทบไม่มีผล) และจะบอกว่าไฟล์ไหน บรรทัดอะไรให้เสร็จสรรพ ดับเบิ้ลคลิกเข้าไปทีละชั้นๆ ได้เลย

ก็เท่านี้แหละครับสำหรับวิธีใช้งาน หากต้องการใช้บน Production Server หลังจากแก้ไข xdebug.profiler_enable=1 แล้ว restart php-fpm หรือ apache แล้วถ้าคนเล่น active เยอะหน่อยก็ไม่ต้องเปิดนานครับ สัก 5-10 วิพอ แล้วแก้ xdebug.profiler_enable=0 กลับ แล้วรีบ restart php-fpm หรือ apache ทันที มิฉะนั้นมันจะกินที่ไปมหาศาลครับ Download ลงเครื่องเราก็เสียเวลาเยอะอีก

ขอให้โชคดีครับ :)

Unity Profiler by

31
Aug
0

เคยหรือไม่ ทำเกมแล้วกระตุก เคยหรือไม่ ทำเกมแล้ว memory เกินจนภาพกระพริบ หรือกลายเป็นสีดำ เคยหรือไม่ว่าไม่รู้ว่าอะไรกิน Memory มากที่สุด! วันนี้เราขอนำเสนอ Profiler พระเอกของเรา!!

เนื่องจาก Unity 5 เป็นต้นไปสามารถใช้งาน Feature ต่างๆ ได้ฟรีแบบเต็มที่ แน่นอนว่ารวมไปถึง Profiler นี้ เรามาลองดูกันดีกว่า

profiler4

ภาพที่ 1

profiler1

ภาพที่ 2

 

  1. ขั้นแรกเราต้องเลือก Build Setting เป็น Development Build และ Auto Connect Profiler ก่อน Build APK หรือ Build เป็น XCode ตามรูปที่ 1
  2. กด CTRL + 7 หรือ Command + 7 เพื่อเปิดหน้าต่าง Profiler
  3. กดที่ Active Profiler ตามรูปที่ 2 เพื่อเลือกว่าเราต้องการจะดูข้อมูลการทดสอบที่ใด ถ้าดูที่ Editor เลยก็เลือก Editor ถ้าดูที่ Android ก็ต้องต่อ Wifi เดียวกันระหว่าง PC และ android เครื่องนั้นแล้วจะมีชื่อมือถือเครื่องนั้นมาให้เลือกตามรูปที่ 2 และสุดท้ายถ้าเป็น ios ก็ต้องเสียบ USB ครับ
  4. เมื่อเลือก Device ที่ต้องการแล้ว หากถูกต้องจะปรากฏกราฟวิ่งตลอดเวลา โดยมีหลากหลายอย่างให้เลือกดู ที่ดูบ่อยๆ ก็คงหนีไม่่พ้น CPU และ Memory ลองคลิกที่ Memory กันก่อน

profiler2

รูปที่ 3

profiler3

รูปที่ 4

  1. จากรูปที่ 3 จะเริ่มที่ simple ซึ่งเป็นภาพรวมของ memory ที่ใช้ ซึ่งเราสามารถคลิกเปลี่ยนเป็น Detailed แล้วจะมีคำว่า “Take Sample: xxx” อยู่ข้างๆ ตามรูปที่ 4 ให้กดและรอสัก 2-3 นาที (หากเปิด Profiler ก่อนเปิดโปรแกรมบนมือถืออาจเร็วกว่านั้น)
  2. เมื่อมีข้อมูลปรากฏ เราจะสามารถรู้ได้ทันทีว่า ณ เวลาที่เรากด Take Sample  อะไรที่กิน Memory มากที่สุด ซึ่งสิ่งที่กินมากที่สุดมักจะหนีไม่พ้น Texture 2D รองลงมาก็คือ Mesh หากเป็นเกม 3D และสุดท้ายคือ ManagedHeap หรือก็คือ Mono Memory ซึ่งจะเพิ่มอย่างเดียวไม่มีลด ก็ต้องคอยระวัง เคลียร์ค่า Texture 2D หรือ Mesh ไม่ให้ค้างใน Memory ตลอดเวลา ซึ่งหนึ่งในวิธีที่ง่ายที่สุดก็คือการ Load Scene ใหม่นั่นเอง
  3. หากต้องการดู CPU ก็คอยสังเกตว่ามีอะไรที่กราฟพุ่งสูงผิดปกติไหม สูงจนได้ fps ต่ำเกินไป และมี Draw Calls มากเกินไปหรือไม่

ขอให้โชคดีกับการทำเกมครับ :)