一个程序猿

作者 : admin 于 2010年08月10日, 17:57:55
2010
08-10

使用Lucene 构建强大的discuz 论坛搜索模块

作者 : admin 于 2010年07月27日, 14:21:18
2010
07-27

在我搞完公司的论坛优化后,我一直想写一个圈套的dz性能优化的方案。当时的全文检索使用的是公司内部某人开发的检索系统,没有开源,所以我做此方案来实现。
此文刚打完草稿,处于调试通过的状态。没有形成具体可用的用户文档。希望在这个底稿的基础上,朋友能给予测试和支持,以鼓励我做出一套完整的方案。

下载:lucene_dz

欢迎加入QQ讨论群:41886598

使用XDEBUG进行PHP性能分析

作者 : admin 于 2010年07月22日, 09:47:49
2010
07-22

最近给论坛做性能优化,写了一个文档,在线编辑器不好用,就写了个wps文档。

文件下载:使用XDEBUG进行PHP性能分析

discuz7.2针对session表的分析和优化

作者 : admin 于 2010年07月07日, 17:04:54
2010
07-7

广告时间:新建一个qq群,欢迎大家进来讨论discuz的性能优化 qq群 41886598 接头暗号:dz

引子

最近一个朋友的论坛由discuz转化为phpwind,因为discuz在负载较大的情况下频频当机,但在我观察,瓶颈基本是数据库,并且负载最高的表定位为sessions表。之前我们论坛在进行了大的改进后,除了分表这些基本优化,改动最大的就是sessions表。我们使用张宴写的tcsql来存储用户的session信息,经推算,系统负载应该能支撑10~20w人同时在线。

这个10~20w人只是推测,因为原来我们优化sessions表但没有切换到tcsql的时候,最高支撑到4~6w人-也就是某次游戏临时维护,用户大量涌向论坛,在大概4~6w用户的情况下,论坛崩溃。而tcsq的读写效率远远高于mysql,因此推算tcsql代替sessions表的情况下,论坛至少可以承载10~20w人同时在线。
毕竟tcsql用C进行开发,而且没有开源。去年的文章发表后,一直有朋友在探讨dz的优化问题,但那几个方案都依赖了第三方的应用。这次,我想到的是在不依赖其他应用的前提下,完成dz的sessions表优化。

这里,我对sessions表的访问情况作了一个统计:

一个没访问过的论坛,我作为一个用户:1、进入首页 2、ajax登录 3、进入某板块 4、点击某帖子。4个操作,统计session表的操作:select 5次,insert 2次,delete 2次,update,3次,select联查,4次,一共16次操作。对于一个成熟的网站,大部分用户的操作连起来,统计数据跟我统计的会有区别,但从全局看来,sessions表的确是mysql查询数的一个瓶颈。

以子之矛

对于这个问题,dz程序其实是有解决方案的。

  1. if($pvfrequence && $discuz_uid) {
  2. if($spageviews >= $pvfrequence) {
  3. $pageviewsadd = ', pageviews=\'0\'';
  4. $db->query("UPDATE {$tablepre}members SET pageviews=pageviews+'$spageviews' WHERE uid='$discuz_uid'", 'UNBUFFERED');
  5. } else {
  6. $pageviewsadd = ', pageviews=pageviews+1';
  7. }
  8. } else {
  9. $pageviewsadd = '';
  10. }

这个功能是统计用户浏览量的一个小东西,$spageviews是保存在用户session表的一个变量,如果每次浏览都更新用户表的浏览数,member表的负担是很大的。dz的程序员就用客户端更新数据这种方式,把数据更新动作放在了session表,每$spageviews个周期更新一次,有效降低了member表压力,而且此配置在网站后台作出了用户接口。

为什么这个问题可以解决,只不过把压力进行了转移,而sessions表的压力为什么不能解决一下呢?我百思不得其解。

攻子之盾

member的压力可以转移到sessions表,当然sessions表的压力就不能再转移给别的表了,这样处理,不管转移到哪里,都是数据库的压力,所以,得想办法转移到数据库之外。

再考虑为什么member的压力可以转移:因为用户浏览数这个统计项,用户每必要也不需要实时看到更新。

而用户的session信息是用户实时要用,并且有部分权限控制方面的东西,是非常必要的,所以,必须实时获取。既然其他表的压力也都来了sessions表,那更新也必然需要在sessions表中做。这个事情,不就是php的session应该做的事情么?

再考虑sessions表除模拟php的session功能外的其他功能:

1、状态传递:需要把用户的当前状态实时传递给其他用户。在线状态、用户所在位置等。

2、统计分析:在dz可以看到当前多少用户在线,对于单纯使用php session功能是无法满足的,故dz采用sessions表来替代这个功能。

现在就设计一个机制,既满足用户session的功能,又满足统计分析的功能。当然,用php+mysql了。需要及时更新的信息存储于php的session,而需要统计的信息分阶段更新到mysql。

流程如此 用户创建一个mysql记录,创建一个session,session的过期机制类似于mysql表。每次访问,取session信息,如果session信息不存在,取sessions表中的信息。像用户浏览次数这类数据,可以每过一段时间更新到mysql中。用户session每次更新,也只是更新session数据,而session机制的并发性和效率,远远高于mysql的。如此解决,既不阉割原有的功能,又不会对环境造成很严重的依赖,只要支持phpsession的环境即可。

总结

在修改完成后,我又进行了测试,这次session表的访问频度已经降到了原来的1/3之下,我想,对于大型的论坛,起码能节约1/3的服务器吧。这样改动也并不是没有缺点的:统计就会有延迟和偏差。因为中间用户突然离开,会损失sessions表更新的及时性甚至会损失这部分数据。如果严重依赖论坛自己某些统计功能的话,那这种方式欠妥,但对于已经使用第三方统计或者对那部分数据不很敏感的论坛用户,这种方案还是非常适合的。

附言:dz的大多数产品设计都采用sessions表这种设计思路,因此,这个思路可以优化几乎所有的dz产品。

tips:如何定位sessions表的负载: 在mysql数据类的query方法里增加如下代码,数据少可以用肉眼数,数据多可以写个脚本去分析

  1. $handle = fopen("sql.log","a+");
  2. fwrite($handle,str_replace("\r\n","",$sql)."\r\n");
  3. fclose($handle);

附上代码:

dz

最近的感想

作者 : admin 于 2010年06月05日, 20:25:28
2010
06-5

1、我总在努力学习,学习技术。技术好有用么?有用。但能干好活么?态度。

2、第二个目标-让自己坚持。坚持自己的技术方向,这个我做到了,在工作中能不能做到,问号?叹号。做得不够。

3、尊重别人的劳动成果。无论是工作中还是生活中。

4、三人行必有我师。高手往往低调。

5、买书是比较廉价的学习方式。

配置php下的mysql连接池-sqlrelay

作者 : admin 于 2010年05月20日, 22:13:50
2010
05-20

本文主要介绍sqlrelay的配置安装。通过其性能和一些具体环境的测试来帮助开发者应用在相应的场合中去应付大并发的mysql数据库连接。

什么是sqlrelay?

Sqlrelay是一个开源的数据库连接池软件。它可以预建立数据库连接,同时可作为数据库连接代理和负载均衡器使用。

SQL Relay is a persistent database connection pooling, proxying and load balancing system for Unix and Linux.

Sqlrelay项目主页 http://sqlrelay.sourceforge.net/
Sqlrelay源码下载 http://sqlrelay.sourceforge.net/download.html

Sqlrelay原理示意:

连接池示意图:

pool

负载均衡示意图:

router

1、 sqlrelay的安装

下载源代码(因为不能yum或者apt-get)
#wget http://prdownloads.sourceforge.net/sqlrelay/sqlrelay-0.41.tar.gz?download
解压缩
#tar –zxvf sqlrelay-0.41.tar.gz
配置
#cd sqlrelay-0.41
#./configure –prefix=/opt/sqlrelay –with-mysql-prefix=/opt/mysql-5.0.22 –with-php-prefix=/opt/php-5.2.6 –disable-python
注释:因为我用的python版本跟sqlrelay版本稍有纠结,所以显式得去声明不增加python下的api。
为啥我软件编译目标路径是/opt,我也不知道,也许第一次看见某人这么做的,我也就一直这么做。大家别问了,没啥道理,其实编译到 /shit 下边,也不影响正常的运行。
查看编译好的文件:
#cd /opt/sqlrelay
#ls
Bin etc include lib share var
如果出现下列目录,安装“基本完毕”。
2、 sqlrelay的配置
sqlrelay有个问题,如果指定了prefix,而$prefix/bin/目录如果不在环境变量中,则主进程运行是有问题的。因为,编译完后,我们在/etc/profile中增加一条命令:
PATH=$PATH:/opt/sqlrelay/bin #此目录就是你prefix的目录

配置文件:

  1. < ?xml version="1.0"?>
  2. < !DOCTYPE instances SYSTEM "sqlrelay.dtd">
  3. <instances>
  4. <instance id="mysqlpool" port="9002" socket="/tmp/sqlrelay.socket" dbase="mysql" connections="20" maxconnections="50" maxqueuelength="5" growby="1" ttl="60" maxsessioncount="10" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none" maxquerysize="65536" maxstringbindvaluelength="4000" maxlobbindvaluelength="71680" idleclienttimeout="-1" maxlisteners="-1" listenertimeout="0" reloginatstart="no" timequeriessec="-1" timequeriesusec="-1">
  5. </instance>
  6. </instances>

这样,就配置了一个id为mysqlpool的连接池。
Port=9002 sqlrelay提供服务的端口是 9002
Dbase=mysql 要连接mysql
Connections=20 起始创建20个连接
Maxconnections=50 最大连接数 50
其他参数可以自己琢磨,在具体应用中还需要修改后边的参数,都啥含义,看字面或者看手册皆可。

启动sqlrelay:
#./sqlr-start –id mysqlpool //启动刚才定义的id为mysqlpool的连接池
关闭sqlrelay
#./sqlr-stop

3、 sqlrelayPHP api的配置

sqlrelay的PHP api扩展在编译的时候已经生成,在php的./lib/php/extensions/no-debug-non-zts-20060613/ 目录下,修改php.ini中extension_dir的值:extension_dir=”/opt/php-5.2.6/lib/php/extensions/no-debug-non-zts-20060613/”
而后增加引用声明:extension=sql_relay.so

重启php,执行 php –m 查看是否有 sql_relay 如果有,则证明配置成功。

4、sqlrelay的使用

$con=sqlrcon_alloc(“mysqlpool”,9002,””,”root”,”123456”,0,1);
Var_dump($con);

这样,利用sqlrelay的phpapi,就可以跟mysql建立链接。

————————————————————————————————-

另求高并发的测试环境搭建方案,有经验的朋友可以提供相关信息。注:本人只有非常SB的惠普V3000系列高发热强雪花屏笔记本一台做测试环境。

iostat安装

作者 : admin 于 2010年05月10日, 10:42:30
2010
05-10

原来一直以为iostat跟iftop一样是独立的安装包,后google发现是一个工具包中的工具,叫systat。

下载地址:http://pagesperso-orange.fr/sebastien.godard/download.html

使用说明书 http://pagesperso-orange.fr/sebastien.godard/man_iostat.html

samba配置小结

作者 : admin 于 2010年05月06日, 13:18:07
2010
05-6

最近想把本本彻底改成linux,前期准备就是要适应一切能想到的应用。跟台式的文件交互,ftp、ssh都可以,但还是觉得共享会方便,于是配置了一下samba。

本子上的系统用的是centos5.4 X64,samba软件是使用命令 yum install samba 进行安装。

首先,启动关闭samba命令

  1. service smb start
  2. service smb restart
  3. service smb stop

首先配置一个公共的读写目录

  1. mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
  2. touch /etc/samba/smb.conf
  3. #smb.conf 内容为
  4. [global]
  5. workgroup = home
  6. netbios name = notebook
  7. server string = Samba Server
  8. security = share
  9. [public]
  10. path = /home/public
  11. browseable = yes
  12. writeable = yes
  13. guest ok = yes
  14. public = yes
  15. force user = nobody
  16. force group = nobody

重启samba后,在windows中运行(局域网互联) 敲入 \\ip 则可以看到public共享目录

如果增加权限验证,则需要增加用户信息:samba用以下两个命令来增加用户信息

  1. smbadduser   //增加用户
  2. mbpasswd     //增加密码

配置文件如下

  1. [global]
  2. workgroup = ksgdfa
  3. netbios name = ksgfdsa
  4. server string = Samba Server
  5. security = share
  6. encrypt passwords = yes
  7. smb passwd file = /etc/samba/smbpasswd
  8.  
  9.  
  10. [public]
  11. path = /home/public
  12. browseable = yes
  13. writeable = yes
  14. guest ok = yes
  15. public = yes
  16. force user = nobody
  17. force group = nobody
  18.  
  19. [sunboyu]
  20. path = /opt/samba/sunboyu
  21. browseable = yes
  22. writeable = yes

补充:其中,公共目录的权限,用配置成 nobody:nobody 777
而 sunboyu 目录的权限,则配置成 sunboyu:sunboyu 777

tips:如果配置成功后,一直无法写入文件,则检查是否关闭selinux,如果没关闭,关闭即可。

购买了一套得力1022G的套装工具

作者 : admin 于 2010年04月25日, 19:52:11
2010
04-25

小区旁边一个店新开张,特价57块钱。

rsync使用小结

作者 : admin 于 2010年04月17日, 22:28:51
2010
04-17

多台服务器使用,难免用到同步,工作中大量接触的是rsync,简单测试了一下其命令和应用。

rsync官方主页: http://samba.anu.edu.au/rsync/ 下载地址为:http://samba.anu.edu.au/ftp/rsync/rsync-3.0.7.tar.gz

安装:

  1. ./configure --prefix=/opt/rsync-3.0.7
  2. make
  3. make install

默认好像没有生成配置文件,创建

  1. vi /etc/rsync.conf
  2. //填入以下内容
  3. uid=nobody
  4. gid=nobody
  5. max connections=3
  6. use chroot=no
  7. log file=/var/log/rsyncd.log
  8. pid file=/var/run/rsyncd.pid
  9. lock file=/var/run/rsyncd.lock

测试的两台主机:192.168.0.20 192.168.0.30

在192.168.0.30的/etc/rsync.conf下增加以下代码

  1. [test]       //定义一个域
  2. path=/root/test
  3. comment=test folder
  4. uid=root
  5. ignore errors
  6. read only=no
  7. list=no

然后测试两个命令
1、把192.168.0.20上的 /root/source 目录同步到 192.168.0.30 的 /root/test上
/opt/rsync-3.0.7/bin/rsync -vazu –progress /root/source 192.168.0.30::test
2、从192.168.0.30 的 /root/test 同步到 192.168.0.20上的/root/test
/opt/rsync-3.0.7/bin/rsync -vzrtopg –progress 192.168.0.30::test /root/test

配置权限:
在192.168.0.30上vi /etc/rsycnpass 然后 echo test:123456 >> /etc/rsycnpass
配置文件修改为

  1. secrets file = /etc/rsyncpass
  2. [test]       //定义一个域
  3. path=/root/test
  4. comment=test folder
  5. uid=root
  6. ignore errors
  7. read only=no
  8. list=no
  9. auth users=test

则上边命令1修改为 /opt/rsync-3.0.7/bin/rsync -vazu –progress /root/source test@192.168.0.30::test
命令2改为 /opt/rsync-3.0.7/bin/rsync -vzrtopg –progress test@192.168.0.30::test /root/test

 Page 1 of 45  1  2  3  4  5 » ...  Last »