natty

[PHP] การเพิ่ม Performance ให้กับ PHP+MySQL ด้วย xDebug,APC,memcache

In PHP on June 10, 2009 at 1:07 am

เขียนโปรแกรมเล็กๆ ไม่ค่อยมีปัญหาอะไร แต่เมื่อไหร่ก็ตาม ที่งานของเรา ต้องทำงานกับข้อมูลเยอะๆ และ Application ขนาดใหญ่ มีหลาย module โดยเฉพาะ หากใช้ object-oriented ด้วยแล้ว แม้จะมีประโยชน์ในด้านของการออกแบบก็จริง แต่ด้านของ performance ก็มีผลกระทบในแง่ร้ายเช่นกัน ดังนั้น จึงควรที่จะเรียนรู้เกี่ยวกับการ config ค่าต่าง ๆ ทั้งในส่วนของ PHP และ MySQL ค่ะ

blog นี้จะไม่กล่าวถึงการ install ในขั้นต้นนะคะ โดยเป็น Apache Server บน linux ค่ะ

MySQL

เริ่มกันก่อนในส่วน MySQL

ปกติ หากเราลง MySQL แบบ default เราจะใช้ my.ini แบบที่กำหนดมาเป็น default แต่หากเราต้องการจะ modify ให้ใช้งานและรองรับข้อมูลจำนวนมาก ให้เราลองสังเกตใน folder MySQL ของเรา จะมีไฟล์ config อีกมากมายเลย เช่น my-huge.ini, my-innodb-heavy-4G.ini, my-large.ini, my-medium.ini, my-small.ini, my-template.ini ซึ่งใน file พิเศษๆ เหล่านี้ จะมีการ set ค่าเหล่านี้ ยกตัวอย่างจาก my-huge.ini

key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M

ซึ่งแต่ละ File ก็จะมีการตั้งค่าแตกต่างกันไป วิธีการเอาไปใช้งาน ก็แค่เปลี่ยนชื่อไฟล์ที่เหมาะกับเราเป็นชื่อ my.ini (back up อันเดิมไว้ด้วยก็ดีค่ะ เผื่อมีอะไรผิดพลาด)

xDebug

xDebug คือ PHP profiler และช่วยจัด format PHP ให้อ่านง่ายๆ ได้ด้วย

ในส่วนของ profiler จะมีการเก็บ log ของ server เกี่ยวกับเวลาในการรันของแต่ละ class แต่ละ method กันเลยทีเดียว แต่ไฟล์ที่ได้ออกมาจะเป็น text file โง่ๆ ที่อ่านยากมากๆ ต้องลงพวก GUI เป็น WinCacheGrind สำหรับ Windows และ KCacheGrind สำหรับ Linux

ก่อนอื่น ต้องลง xDebug ไว้ที่ server ก่อน

#yum install php-pear
#pecl install xdebug
#vim /etc/php.ini   <– เพิ่มบรรทัด extension = xdebug.so ลงไป และบรรทัดต่อไปนี้

[xdebug]
xdebug.remote_enable=On
xdebug.remote_autostart=On
xdebug.remote_handler=dbgp
xdebug.remote_host=zero.haadthip.com
xdebug.remote_port=9000
xdebug.remote_mode=req
xdebug.profiler_enable=1
xdebug.profiler_output_dir=”/tmp/” <– log เก็บที่นี่
xdebug.profiler_append=On
xdebug.profiler_enable_trigger=On
xdebug.profiler_output_name=%s

ตรวจสอบให้แน่ใจว่ามี file xdebug.so อยู่ใน /usr/lib/php/modules

และ restart mysql + Apache ด้วยค่ะ ลอง echo phpinfo หากสำเร็จแล้วจะได้ผลดังนี้

จากนั้น ก็ลง WinCacheGrind ซึ่งเอา log file ได้จาก path ที่เสร็จไว้ใน php.ini (xdebug.profiler_output_dir) โหลดไฟล์เข้าไป ก็จะเอาไปแสดงในโปรแกรม ดังรูป

คราวนี้เราก็วัด performance ก่อน และ หลัง ได้แล้วค่ะ

APC

คือ Alternative PHP cache เอาไว้ cache code โดยจะ cache มันไว้ ณ compile state ทำให้ overhead ลดลง เอาเป็นว่าไม่เกี่ยวข้องกับ database นะคะ

ดูกระบวนการทำงานของ APC กันสักหน่อย

ขั้นตอนการ install

#yum install httpd-devel

(php-devel ลงเพราะมันต้องการ apxs หากเราไม่มี apxs ก่อนนจะลง APC มันจะ error ว่า

Sorry, I was not able to successfully run APXS.  Possible reasons:

1.  Perl is not installed;
2.  Apache was not compiled with DSO support (–enable-module=so);
3.  ‘apxs’ is not in your path.  Try to use –with-apxs=/path/to/apxs
The output of apxs follows
/tmp/tmpe1LwOh/APC-3.0.19/configure: line 3232: apxs: command not found
configure: error: Aborting
ERROR: `/tmp/tmpe1LwOh/APC-3.0.19/configure –with-apxs’ failed

)
#yum install apc
#pecl install apc
vim /etc/php.ini  เพิ่ม extension=apc.so และเพิ่มบรรทัดต่อไปนี้

[APC]
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.max_file_size = 10M
apc.stat=1

ทำการ restart Apache และลองดู phpinfo.php

และควรจะ download package ของ APC มาด้วย เพราะจะได้ดูทางหน้าเว็บได้ โดยแตกตัว folder เอาไปวางใน root directory นะคะ จะได้หน้าตาเว็บแบบนี้เอาไว้ดู resource เกี่ยวกับ APC ของ server

Memcache

หลังจากที่มีการ cache หน้า page กันแล้ว ตรงส่วน database ก็มีความสำคัญเช่นกัน เพราะ connection database เป็นอะไรอีกอย่างที่ทำให้เกิดความช้า หากเรา query บ่อย ๆ ประกอบกับมี query ที่ซับซ้อนและมีจำนวนข้อมูลที่เป็นผลลัพธ์มาก ใช้ memcache นี่แหละค่ะ เป็นตัวช่วย

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

#wget http://monkey.org/~provos/libevent-1.3e.tar.gz
#tar zxpfv libevent*
#cd libevent*
#./configure
#make install

#wget http://www.danga.com/memcached/dist/memcached-1.2.4.tar.gz
#tar zxpfv memcached*
#cd memcached*
#./configure
#make install

#adduser memcached

หากเกิดปัญหาเกี่ยวกับการหา file libevent ไม่เจอ แก้ไขดังนี้

ค่อยมาเขียน

จากนั้น ต้องลง php-memcache ด้วย

#yum install php-pecl-memcache.i386
#vi /etc/php.ini เพิ่มบรรทัดดังต่อไปนี้

[memcache]
memcache.allow_failover=1
memcache.max_failover_attempts=20
memcache.chunk_size=8192
memcache.default_port=11211

ทำการ restart server แล้วตรวจสอบ phpinfo

การใช้งาน memcache ต้อง run ให้มันทำงานอยู่ด้วย เหมือนกับ run server นั่นแหละ โดยใช้คำสั่ง
memcached -vv -u memcached

ถ้าได้ผลแบบนี้แสดงว่า memcache server ได้ run ขึ้นมาแล้ว พร้อมใช้งานค่ะ

ลองทดสอบว่าสามารถ cache ได้แล้วจริงหรือไม่ โดย copy code ต่อไปนี้ รอไปรันดู

<?php$memcache

 

= new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect"); $version = $memcache->getVersion();
echo
"Server's version: ".$version."<br/>\n"; $tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123; $memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo
"Store data in the cache (data will expire in 10 seconds)<br/>\n"; $get_result = $memcache->get('key');
echo
"Data from the cache:<br/>\n"; var_dump($get_result); ?>

นั่นแสดงว่า วิธีการใช้ memcache คือ เราต้อง new memcache ให้กับ query ที่เราต้องการจะ cache หากคุณมี code อยู่แล้ว และต้องการจะ cache มีทางเดียวที่ทำได้ คือ แก้ code ค่ะ ^O^ งานเข้าล่ะสิ

และจริงๆ memcache เอง ก็สามารถดูประสิทธิภาพทางหน้าเว็บได้เหมือน APC เลย ลอง download code จาก ลิงค์นี้ค่ะ http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/

เรื่องการ config แต่ละตัว อาจจะไม่ละเอียดมาก เรียกได้ว่าพอใช้งานได้แล้วกันค่ะ หากใครอยากจะ modify กันมากกว่านี้ ก็ตามไปอ่าน official website กันได้ค่ะ

หากมีข้อสงสัย ติชม เพิ่มเติม ก็ comment เอาไว้ได้ หากเอาไปอ้างอิง อย่าลืม credit ให้ด้วยนะคะ

ลิงค์น่าอ่านเพิ่มเติม

http://www.thaicyberpoint.com/ford/blog/id/170/
http://www.pantz.org/software/php/phptuningtips.html
http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

  1. แจ่มๆ ขอลอกไปลองใช้เลยครับ

    ตอนนี้ผมกำลังหาเรื่องกับตัว framework และระบบที่พัฒนากันอยุ่ครับ

  2. ถ้าไม่ครบ หรือทำงานไม่ได้ ช่วยบอกด้วยนะคะจะได้แก้ให้ เพราะไม่แน่ใจเหมือนกันว่าครบถ้วนหรือยัง ขอบคุณค่ะ ^_^
    อ่อ ถ้ามีรายละเอียดการ config เพิ่ม ก็บอกได้ค่ะ เพราะทั้งหมดที่ทำนี้ ทำอยู่ประมาณ 2-3 วันเอง เลยทำให้พอใช้งานและเห็นความเปลี่ยนแปลง ยังไม่ optimize

  3. เพิ่งเคยได้ยินชื่อแฮะ ไม่เคยเขียนแอพพลิเคชั่นใหญ่ขนาดที่ต้องมาดูของพวกนี้ 😛

    ไม่แน่ใจว่าของพวกนี้ ไอ้พวก CMS ใหญ่ๆ อย่าง Joomla มันทำไว้ให้ด้วยรึเปล่าหว่า.. เห็นมี Cacheๆ แต่ว่าไม่เคยไปยุ่งเลย

    • อืม เข้าใจถูกแล้วล่ะ เห็นใน drupal มีการทำ cache พวกนี้ให้ใช้ได้สะดวก อยู่แล้ว แบบว่ามีหน้าที่ให้เค้าไป config ได้ และมันก็จัดการในตัวมันเองอยู่แล้ว คิดว่า joomla ก็น่าจะมีเหมือนกันอ่ะ

      • ส่วนมากใน cms opensource จะมี cache แค่ส่วนของ template engine มากกว่าครับ ^^

  4. ไหนๆ ก็เขียนแล้ว เอา performance มาให้ดูด้วยสิ
    performance graph ระหว่างตอนยังไม่ใช้ apc+memcache กับยังไม่ใช้

  5. เขียนดี อ่านเข้าใจง่าย ขอบคุณครับ ^ ^

    อยากดูผลการ tuning performance ด้วยคน

  6. หญิงไทยเราต้องแบบนี้แหละ

  7. ตามมาจาก Google ‘memcache’ น่าสนใจครับ จะเข้ามาติดตามอ่านบ่อยๆ

  8. ฝากไว้นิดนึงละกันนะครับ ผมไม่รู้ว่าแตกต่างกันอย่างไร แต่ในขั้นตอนของ XDebug ที่เพิ่ม Config ลง php.ini เป็น
    extension = xdebug.so
    ใน Official Installation Manual บอกว่าผิดนะครับ ต้องใช้เป็นลักษณะแบบ Zend Extension ซึ่งที่ผมรันแบบข้างบนดู
    จะมี Log WARNING โผล่ใน PHP Error Log ครับ.

    ของผมเป็น Windows สามารถใส่แทนได้ในแบบข้างล่างนี้
    zend_extension_ts = “d:/Service/usr/php/ext/php_xdebug.dll”
    ถ้าเป็น Linux ก็คงจะเป็น
    zend_extension_ts = “php_xdebug.dll”

    ใส่แทนที่บรรทัดของ “extension = xdebug.so” เดิมครับ.

  9. ขอบคุณคร้าบบ มีประโยชน์มาก ๆ เลย

  10. ถ้าใช้กับเว็บที่ไม่มีการแก้ไขไฟล์แล้ว ตั้งค่า apc ให้ไม่ต้องอ่านไฟล์ใหม่ได้ครับ จะเร็วขึ้นเยอะ

    apc.stat = 0
    apc.stat_ctime = 0
    apc.include_once_override = 0

  11. เขียนดี อ่านเข้าใจง่าย ขอบคุณครับ ^ ^

  12. […] เอามาจาก https://nattyait.wordpress.com/2009/06/10/php-mysql-performance/ […]

  13. อยากจะสอบถามว่าลง Xcache แล้ว เราจำเป็นต้องลง Memcache ป่ะครับ

    Memcache นี่ช่วยในส่วน database หรอครับ

    • XCache เอาไว้ cache PHP script ช่วยในกระบวนการของ page loading แต่ memcache เอาไว้ cache ของ จาก database ดังนั้นไม่น่าจะเกี่ยวว่าถ้าลง xcache แล้วจำเป็นจะต้องลง memcache ด้วย อยู่ที่เราเลือกค่ะ

  14. Ceiling…

    […][PHP] การเพิ่ม Performance ให้กับ PHP+MySQL ด้วย xDebug,APC,memcache « Natty’s blog[…]…

  15. learn…

    […][PHP] การเพิ่ม Performance ให้กับ PHP+MySQL ด้วย xDebug,APC,memcache « Natty’s blog[…]…

  16. […] การเพิ่ม Performance ให้กับ PHP+MySQL ด้วย xDebug,APC,memcache Share this:TwitterFacebookLike this:LikeBe the first to like this post. This entry was posted in Uncategorized by sasiikan. Bookmark the permalink. […]

  17. […] [PHP] การเพิ่ม Performance ให้กับ PHP+MySQL ด้วย xDebug,APC,memc… June 2009 13 comments […]

  18. wonderful issues altogether, you simply received a
    logo new reader. What may you suggest in regards to your put up that you simply
    made a few days in the past? Any positive?

Leave a reply to natty Cancel reply