March 24th, 2009 by 张磊
Robbin写过一篇《监视Rails进程内存泄漏的技巧》,谈到了“如何监控rails进程的执行性能”。因为production.log文件已经记录了每一次请求执行的时间,所以通过一些命令的组合,把需要的数据提取、排序、输出到文件就可以了。但windows服务器上没有这些命令(如grep, awk等),怎么办呢?这篇文章能给出个解决办法,虽然稍显复杂。 要在windows上拥有linux的命令,Cygwin是一个办法,但我总觉得安装Cygwin太麻烦,于是我找了UnxUtils。下载后解压,然后在环境变量PATH中增加UnxUtils/usr/wbin目录。常用的linux命令已经被移植到windows了,包括但不限于wget, g(un)zip, tail, grep。 robbin在文章中提到的组合命令是这样的: grep “200 OK” production.log | awk ‘{print ”ALL: ” $3 ” View: ” $8 ” DB: ” $12 ” URL: ” $17 }‘ | sort -r | head -n 500 > timing.log 我们需要进行一些修改: 首先,UnxUtils没有提供awk,但有个替代品gawk。同时,在windows上的gawk不能用形如’{…}’这样的参数格式,而只能用”{…}”(两边只能用双引号),相应地,内部的语句如果使用了双引号,就需要进行转义、 其次,UnxUtils没有提供sort命令,不过Windows提供了。但这里要稍作修改,把sort -r 改为sort /r。 修改之后就可以使用了,命令改为: grep “200 OK” production.log | awk “{print \”ALL: \” $3 \” View: \” $8 \” DB: \” $12 \” URL: \” $17 }” | sort /r | head -n 500 > timing.log 如果想要更方便点,可以做一个批处理文件,在生成timing.log以后用记事本打开: grep “200 OK” production.log | awk “{print \”ALL: \” $3 \” View: \” $8 \” DB: \” $12 \” URL: \” $17 }” | sort /r | head -n 500 > timing.log notepad [...]
February 1st, 2009 by 张磊
以前写过三篇关于ultrasphinx和sphinx的文章,都是关于如何更好地利用sphinx来做搜索引擎。最近在我需要在一台windows服务器上部署一个rails系统和相应的sphinx,积累了一些心得写出来与大家分享。如果你的服务器是linux,这篇文章应该对你没什么作用。 首先简单解释下这几个名词,sphinx是一个全文检索软件,类似于lucene;ultrasphinx是一个rails的插件,可以让rails项目轻松使用sphinx;而我使用的sphinx是由coreseek改造过的版本,加入了中文分词的算法(mmseg)。 1、以服务的方式运行sphinx 在开发环境中,只要执行”rake ultrasphinx:daemon:start“,就可以启动一台sphinx服务器。但如果在生产环境还能这么做么?把sphinx安装为服务无疑是个靠谱的办法,这样它可以像mongrel、apache一样随系统启动。sphinx自带了安装为windows服务的命令: searchd –install –config xxxx.conf 不妨把这个加入到rake命令中,于是我hack了一下ultrasphinx插件的任务列表,加入了一个”rake ultrasphinx:daemon:install“命令。名为ultrasphinx.rake的文件我将稍后提供。 既然把sphinx安装为服务,相应的start和stop命令,也需要改改,改为使用”net start/stop searchd”。 2、主索引和增量索引(delta) 对于大量的数据,经常重建主索引很不现实。我的项目中几十万条数据,重建一次索引需要将近10个小时,所以打算以每天多次增量索引+一次合并索引的形式去做。 但javaeye论坛有人发帖说,在windows上要编制索引必须先停止sphinx服务器,因为searchd服务会把索引文件挂住。实际上并非如此:不论在windows还是在linux,sphinx服务器都会锁住索引文件,但只要在编制索引时加上–rotate参数,就可以不停止sphinx服务器来编制索引。sphinx的官方文档解释: –rotate creates a second index, parallel to the first (in the same place, simply including .new in the filenames). Once complete, indexer notifies searchd via sending the SIGHUP signal, and searchd will attempt to rename the indexes (renaming [...]