Web 2.0 网站架构、优化 数据库架构

PHP性能分析工具XHProf

XHProf是facebook开源出来的一个php轻量级的性能分析工具,跟 Xdebug类似,但性能开销更低,还可以用在生产环境中,也可以由程序开关来控制是否进行profile。基于浏览器的性能分析用户界面能更容易查看, 或是与同行们分享成果。也能绘制调用关系图。在数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序。它独有的数据计 算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用中每个深度的调用一个有用的命名来避开死循环。
XHProf的轻量级性质和汇聚功能,使得它非常适合用于收集“生产环境”的性能统计数据的统计。

一、编译安装XHProf
[root@localhost src]# wget http://pecl.php.net/get/xhprof-0.9.2.tgz
[root@localhost src]# tar zxf xhprof-0.9.2.tgz
[root@localhost src]# cd xhprof-0.9.2
[root@localhost xhprof-0.9.2]# cp -r xhprof_html xhprof_lib /var/www/html/
[root@localhost xhprof-0.9.2]# cd extension/
[root@localhost extension]# /usr/local/webserver/php/bin/phpize
[root@localhost extension]# ./configure  –with-php-config=/usr/local/webserver/php/bin/php-config

二、配置 php.ini 文件
vi vi /usr/local/webserver/php/etc/php.ini  修改php.ini
[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=<directory_for_storing_xhprof_runs>

OK 重启WEB服务器。为了更加清晰显示程序执行、调用结构,安装Graphviz。

三、安装Graphviz:
[root@localhost src]# wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
[root@localhost src]# tar zxf graphviz-2.24.0.tar.gz
[root@localhost graphviz-2.24.0]# cd graphviz-2.24.0
[root@localhost graphviz-2.24.0]# ./configure
[root@localhost graphviz-2.24.0]# make
[root@localhost graphviz-2.24.0# make install

四、应用XHProf
客户端能很灵活地保存他们从XHProf运行中得到的XHProf原始数据。用户界面层的XHProf提供了一个 iXHProfRuns接口(见xhprof_lib/utils/xhprof_runs.php ),客户端可以利用。这使得客户端能够告诉用户界面层,如何获取XHProf运行后产生的对应数据。
XHProf的UI 库自带的有一个基于文件的iXHProfRUns接口实现,即“ XHProfRuns_Default”(见xhprof_lib/utils/xhprof_runs.php)。这个自带的实现将XHProf运行结 果存在ini配置的xhprof.output_dir参数指定的某个目录下。
一次XHProf运行,必须用一个命名空间和运行编号来唯一确定。
假设使用iXHProfRuns接口的XHProfRuns_Default这个默认实现方式,如:

//xhprofStart.php 文件
<?php
$XHPROF_DEBUG     =   FALSE;
$debugUserIDArray =   array(
123456     =>     1,
456152  =>  1,
);
if (function_exists('xhprof_enable') && !empty($debugUserIDArray[$winduid]))
{
$XHPROF_DEBUG   =   TRUE;
}

if ($XHPROF_DEBUG)
{
include_once “/var/www/html/xhprof_lib/utils/xhprof_lib.php”;
include_once “/var/www/html/xhprof_lib/utils/xhprof_runs.php”;
xhprof_enable(); //start profiling
}

?>

//xhprofEnd.php 文件
<?php
if (TRUE    ==  $XHPROF_DEBUG)
{
//stop profiler
$xhprof_data    =   xhprof_disable();
$xhprof_runs    =   new XHProfRuns_Default();
$run_id         =   $xhprof_runs->save_run($xhprof_data, “xhprof_foo”);
echo “—————\n”.
“<a href=’/xhprof_html/index.php?run=$run_id&source=xhprof_foo’>xhprof</a>\n”.
“—————\n”;
}
echo ‘<!– xhprof –>’;
?>

程序中应用:
include /var/www/html/xhprofStart.php
// run program
….
include /var/www/html/xhprofEnd.php

将profile开关程序放在你所要进行分析的程序部分,就会将运行结果保存在xhprof.output_dir ini参数指定的特定目录下。文件的名称可能会是23dffaa3a3f66.xhprof_foo类似的文件; 两部分分别是运行编号(23dffaa3a3f6)和命名空间(xhprof_foo)。


最后,一些术语解释:
1. Inclusive Time (或子树时间):包括子函数所有执行时间。
2. Exclusive Time/Self Time:函数执行本身花费的时间,不包括子树执行时间。
3. Wall时间:花去了的时间或挂钟时间。
4. CPU时间:用户耗的时间+内核耗的时间
更多:http://mirror.facebook.net/facebook/xhprof/doc.html

搭建mysql master-slave replication

本篇文章记录了如何搭建一个master-slave架构mysql数据库服务器,一般用于读写分离的场景下:master for INSERT/UPDATE/DELETE,slave for SELECT。
根据实战结果,在master-connect-retry=5的情况下,基本可以做到读写同步(可以打开slave的log文件来观察同步结果:tail -f /var/run/mysql/mysql.log)

基本信息

主库:192.168.1.1
从库:192.168.1.2
数据文件存放位置:/data/mysql
待同步数据库:除了mysql、test库以外的所有数据库

一、设置MASTER

1、修改my.cnf

#vi /etc/my.cnf
server-id=1
log-bin
binlog-ignore-db=mysql
binlog-ignore-db=test

2、赋予SLAVE权限帐号,允许用户在MASTER上LOAD TABLE和LOAD DATA

mysql> GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO slave@192.168.1.2 IDENTIFIED BY ‘password’;

3、锁主库表

mysql> FLUSH TABLES WITH READ LOCK;

4、显示主库信息

记录File和Position,从库设置将会用到

mysql> SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File          | Position | Binlog_do_db | Binlog_ignore_db |
+—————+———-+————–+——————+
| hathor-bin.001 | 79   |              | mysql,test         |
+—————+———-+————–+——————+

5、打包主库

# cd /data
# tar cvfz db.tar.gz db/

二、设置SLAVE

1、把数据库文件部署到slave服务器

# cd /data
# scp 192.168.1.1:/data/db.tar.gz
# tar xvfz db.tar.gz

2、解锁主库表

mysql> UNLOCK TABLES;

3、查看修改数据库文件夹权限

# chown mysql:mysql syncdb -R

4、修改my.cnf

# vi /etc/my.cnf
server-id=2
master-host=192.168.1.1
master-user=slave
master-password=password
master-port=3306
#Controls the retry interval. The default is 60 seconds.
master-connect-retry=5

Trouble Shoot

Mysql 5到这一步一般就ok了,如果遇到问题再看下面的

如果报错跟Position相关的错误,再手动设置一下File/Position信息
设置连接MASTER MASTER_LOG_FILE为主库的File,MASTER_LOG_POS为主库的Position

mysql> CHANGE MASTER TO MASTER_HOST=’192.168.1.1′,
MASTER_USER=’slave’,
MASTER_PASSWORD=’password’,
MASTER_LOG_FILE=’mysql-bin.001′,
MASTER_LOG_POS=79;

启动SLAVE服务

mysql> slave start;

查看SLAVE状态

mysql> SHOW SLAVE STATUS;

Q:为何找不到binlog文件?
A:mysql会把binlog、log、errorlog放在与–pid-file相同的目录

返回顶部