• 2009-09-14

    http_load 一个httpd 压力测试工具 - [service]

    到http://www.acme.com/software/http_load/ 下载http_load ,安装也很简单直接make;make instlall 就行。

    http_load的标准的两个例子是:

    1. http_load -parallel 5 -fetches 1000 urls.txt  
    2. http_load -rate 2 -seconds 300 urls.txt  

     

    例子只是个参考,参数其实可以自由组合,参数之间的选择并没有什么限制。比如你写成http_load -parallel 5 -seconds 300 urls.txt也是可以的。我们把参数给大家简单说明一下。-parallel 简写-p 含义是并发的用户进程数。

    -fetches 简写-f 含义是总计的访问次数

    -rate    简写-p 含义是每秒的访问频率

    -seconds简写-s 含义是总计的访问时间


    urls.txt 是一个url 列表,每个url 单独的一行。当然也可以直接跟一个url 而不是url 列表文件。
    实例:
    1. http_load -rate 5 -seconds 10 urls  
    2. 49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds  
    3. 5916 mean bytes/connection  
    4. 4.89274 fetches/sec, 28945.5 bytes/sec  
    5. msecs/connect: 28.8932 mean, 44.243 max, 24.488 min  
    6. msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min  
    7. HTTP response codes:  
    8.   code 200 -- 49  
     
    分析:
    1.49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
    说明在上面的测试中运行了49个请求,最大的并发进程数是2,总计传输的数据是289884bytes,运行的时间是10.0148秒

    2.5916 mean bytes/connection
    说明每一连接平均传输的数据量289884/49=5916

    3.4.89274 fetches/sec, 28945.5 bytes/sec
    说明每秒的响应请求为4.89274,每秒传递的数据为28945.5 bytes/sec

    4.msecs/connect: 28.8932 mean, 44.243 max, 24.488 min
    说明每连接的平均响应时间是28.8932 msecs,最大的响应时间44.243 msecs,最小的响应时间24.488 msecs

    5.msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min

     6、HTTP response codes: code 200 -- 49
    说明打开响应页面的类型,如果403的类型过多,那可能要注意是否系统遇到了瓶颈。
    特殊说明:这里,我们一般会关注到的指标是fetches/sec、msecs/connect
    他们分别对应的常用性能指标参数Qpt-每秒响应用户数和response time,每连接响应用户时间。测试的结果主要也是看这两个值。当然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的cpu、men进行分析,才能得出结论
  • 2009-08-21

    中文全文搜索解决方案sphinx+mysql+mmseg,安装,配置,API调用 - [service]

    最近在研究中文搜索引擎,找了许多解决方案,有JAVA下的的Lucene,还有强大的C++下的fietex,哪些比较复杂,对现在的项目来讲,不是很实用,所以把目光瞄向了轻便的sphinx,今天安装还算顺利,以下备忘。
    首先,Sphinx默认不支持中文索引及检索,以前用补丁搞定,现在,写补丁那个项目组的人又弄了个CSFT,全称是:CoreSeek Fulltext Search Server,CoreSeek 全文检索服务器。于是呢,就把sphinx集成过来,挺好用的。

    1. 去Coreseek官网下载源码,需要mmseg和Coreseek Fulltext Server最好用源码安装,那个RPM文件包反正我没搞定,呵呵。
    2. 装mmseg。
          # tar zxf mmseg3_0b3.tar.gz
          # cd mmseg3_0b4;
          # ./configure –prefix=/Data/apps/mmseg
    (这个目录可以改)
          # make && make install
         运行mmseg,如果成功会有显示
         
    3. 装CSFT   
      # tar zxf csft3_0b4.tar.gz
          # cd csft3_0b3
          # ./configure -prefix=/Data/apps/sphinx  (这个需要mysql和mmseg,别把目录写错了)
          -with-mysql=/Data/apps/mysql        
          -with-mmseg=/Data/apps/mmseg
          -with-mmseg-includes=/Data/apps/mmseg/include/mmseg
          -with-mmseg-libs=/Data/apps/mmseg/lib/
          -with-mysql-includes=/Data/apps/mysql/include/mysql/
          -with-mysql-libs=/Data/apps/mysql/lib/mysql/
          # make && make install


    4. sphinx.conf
        安装完成后,会生成/Data/apps/sphinx/etc/sphinx.conf.dist  要更改为.conf
        #cp /Data/apps/sphinx/etc/sphinx.conf.dist /Data/apps/sphinx/etc/sphinx.conf
       
    5. 生成字典
        因为用到中文分词,需要生成字典,去安装目录,比如我的是 /home/changyou/mmseg.3.0b3/data/
        #mmseg -u unigram.txt 该命令执行后,将会产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完成词典的构造。
        然后,在/Data/apps/sphinx/var/下建立文件夹 dict,然后把uni.lib放进去
       
    6. 配置
        sphinx.conf 文件中需要对charset_dictpath指定uni.lib的路径/Data/apps/sphinx/var/dict/
        还有连接mysql的信息,这个不用说了罢。
        这里有个参数对于中文用户要注意一下:
        charset_type
        字符集编码类型。可选选项,默认为“sbcs”。已知的值包括“sbcs”和“utf-8”。
        对于中文用户,可选的值还可以有“zh_cn.utf-8 ”和“zh_cn.gbk”。当设置charset_type值为上面的两种时,系统默认您开启了中文分词特性。
        但是我设置了zh_cn.utf-8,报错说“unknown charset type 'zh_cn.utf-8'”,不知道为什么。。。。。

    7. 运行
         # /Data/apps/sphinx/bin/indexer
         启动索引服务时,如果报下面的错:
         error while loading shared libraries: libmysqlclient.so.15: cannot open shared object file: No such file or directory
         原因应该是因为mysql的lib文件不在系统的lib搜索路径上导致的。
         运行命令,解决:
         # ln -s /Data/apps/mysql/lib/mysql/libmysqlclient.so.15 /usr/lib/libmysqlclient.so.15
         
    8. 导入测试数据
         # mysql -uroot -p test < /Data/apps/sphinx/etc/example.sql
         这里千万注意,mysql编码一定要为UTF-8 !!!
        
    9. 测试建立索引
         #indexer --all
         出错,Coreseek Full Text Server 3.1
         Copyright (c) 2006-2008 coreseek.com
         FATAL: no readable config file (looked in /usr/local/sphinx/etc/csft.conf, ./csft.conf)
         这是因为 Coreseek 默认要去读 csft.conf,所以要复制一份
         # cp /Data/apps/sphinx/etc/sphinx.conf /Data/apps/sphinx/bin/csft.conf
         ( 或者,也可以指定conf文件,#indexer --config /Data/apps/sphinx/etc/sphinx.conf --all  这里我没有指定,所以用了2个conf文件,很不靠谱)

    10. 然后继续运行 #indexer --all ,应该会看到如下输出:
            Coreseek Full Text Server 2.1
            Copyright (c) 2006-2008 coreseek.com
            using config file '/usr/local/etc/csft.conf'...
            indexing index 'test1'...
            collected 5 docs, 0.0 MB
            sorted 0.0 Mhits, 100.0% done
            total 5 docs, 230 bytes
            total 0.146 sec, 1577.50 bytes/sec, 34.29 docs/sec
            indexing index 'test1stemmed'...
            collected 5 docs, 0.0 MB
            sorted 0.0 Mhits, 100.0% done
            total 5 docs, 230 bytes
            total 0.011 sec, 21879.74 bytes/sec, 475.65 docs/sec

    11. 测试全文检索
        # search doc     应该会看到如下输出:
            Coreseek Full Text Server 3.1
             Copyright (c) 2006-2008 coreseek.com
            using config file './csft.conf'...
            index 'test1': query 'doc ': returned 2 matches of 2 total in 0.000 sec
            
            displaying matches:
            1. document=3, weight=1, group_id=2, date_added=Sat Aug 22 03:54:19 2009
                    id=3
                    group_id=2
                    group_id2=7
                    date_added=2009-08-22 03:54:19
                    title=another doc
                    content=this is another group
            2. document=4, weight=1, group_id=2, date_added=Sat Aug 22 03:54:19 2009
                    id=4
                    group_id=2
                    group_id2=8
                    date_added=2009-08-22 03:54:19
                    title=doc number four
                    content=this is to test groups
            words:
            1. 'doc': 2 documents, 2 hits
            index 'test1stemmed': query 'doc ': returned 2 matches of 2 total in 0.000 sec
            displaying matches:
            1. document=3, weight=1, group_id=2, date_added=Sat Aug 22 03:54:19 2009
                    id=3
                    group_id=2
                    group_id2=7
                    date_added=2009-08-22 03:54:19
                    title=another doc
                    content=this is another group
            2. document=4, weight=1, group_id=2, date_added=Sat Aug 22 03:54:19 2009
                    id=4
                    group_id=2
                    group_id2=8
                    date_added=2009-08-22 03:54:19
                    title=doc number four
                    content=this is to test groups
            words:

            1. 'doc': 2 documents, 2 hits
    12. 启动searchd进程
         # searchd

    PHP接口在源安装包下面的api/下,可以调用测试,很好用,明天继续研究!

    接上一回,调用sphinx,我们先插入一个中文的数据:
    INSERT INTO `test`.`documents` (`id` ,`group_id` ,`group_id2` ,`date_added` ,title` ,`content`)VALUES (NULL , '3', '9', NOW( ) ,'sphinx中文搜索','Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如 PHP,Python,Perl,Ruby等,同时为 MySQL也设计了一个存储引擎插件');

    因为有新数据,所以要重建索引(关于这个问题,以后遇到再研究,如果每天有新数据都要重建索引,很不靠谱)
    先kill searchd进程,运行:
    # searchd --stop    然后
    # indexer --all

    1.调用sphinx:
       一是通过Sphinx官方提供的API接口(接口有Python,Java,Php三种版本)
       二是通过安装SphinxSE(具体见1.2部分),然后创建一个中介sphinxSE类型的表,再通过执行特定的SQL语句实现。
    现在,我们用API接口,在sphinx安装目录有一个API目录,里面有三个PHP文件:test.php,test2.php和 sphinxapi.php。 sphinxapi.php是sphinx调用接口封装文件,test.php是一个在命令行下执行的查询例子文件,test2.php是一个生成摘要的例子文件。
    运行:
    # php /home/changyou/csft-3.1/api/test.php -i test1 doc
    返回结果:
    Query 'doc ' retrieved 2 of 2 matches in 0.000 sec.
    Query stats:  'doc' found 2 times in 2 documents
    Matches:
    1. doc_id=3, weight=100, group_id=2, date_added=2009-08-22 03:54:19
    2. doc_id=4, weight=100, group_id=2, date_added=2009-08-22 03:54:19

    注意:这里,如果不输入参数 -i test1 doc ,那test.php就不会知道你要查那个索引并且搜索什么字句。
    所以,如果想引入生产环境中,我们需要手动修改一下test.php

    a.  注释掉10行-43行,
    b.  然后添加:$search_info = array("1" => "-i", "2" => "test1", "3" => "$keyword");
    c.  foreach ( $search_info as $arg ) 替换原来的foreach
    d.  自己定义下$keyword="设计",记得把文件另存为utf-8
    e.   然后,运行:     # php /home/changyou/csft-3.1/api/test.php
       Query '(乱码)' retrieved 1 of 1 matches in 0.000 sec.
       Query stats:
        '(乱码)' found 8 times in 1 documents
    Matches:
    1. doc_id=5, weight=2, group_id=3, date_added=2009-08-26 20:18:33

    哈哈,OK啦!可以将sphinx文件封装好,就可以用与生产环境了。

    从上面可以看出Query并不能全部取得我们想要的记录内容,比如说Title,Contents字段就没有取出来,根据官方的说明是sphinx 并没有连到mysql去取记录,只是根据它自己的索引内容进行计算,因此如果想用sphinxAPI去取得我们想要的记录,还必须将Query的结果为依据去查询MySQL才可以得到最终我们想要的结果集。

    2.搜索全文时的摘要,高亮显示。
    假设我要搜索关键词"test",通过sphinx可以取到搜索结果,在显示搜索结果时,我希望将含有"test"的进行红色或加粗显示,同时,我不希望全部都显示出来,只需要显示一段摘要,就象google或百度那样,搜出来的结果不是全篇显示,只是部分显示,这个就是摘要的作用。
    以test2.php中为例,可以利用BuildExcerpts方法可以实现摘要的功能。具体可以看看test2.php的代码。这里不说了。

    3.后记
    从网上看到,还可以用SphinxSE方式调用Sphinx。但问题是,我安装的时候,不知道为什么没有安装SphinxSE引擎,在mysql 里用mysql> show engine; 查看。可能是我没有直接编译sphinx然后打2个中文补丁吧,而是用了官网推荐的中文搜索安装包。从索引得到ID号,然后再去查询数据库,也可以实现中文搜索的效果,但是具体效率怎么样就不知道了。
    最后,在sphinx配置文件里,如要用自己的数据,需要修改源数据,这一项:sql_query = \SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \ FROM documents;
    让他自己抓取合适你数据结构的语句即可。

    参考:http://blog.c1gstudio.com/archives/722
            http://www.zhengjinjun.com/index.php/2009/06/28/sphinxmysql%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%AE%89%E8%A3%85-%E5%AE%9E%E7%8E%B0%E4%B8%AD%E6%96%87%E5%85%A8%E6%96%87%E6%90%9C%E7%B4%A2/
            http://www.htmldata.cn/?p=171

     

  • 2009-08-21

    linux 安装Mysql - [mysql]

    很简单,但是,草,过程很痛苦,因为少做一步,最后真是要骂街了。

    # useradd mysql

    # tar zxvf mysql-5.0.56.tar.gz  //解压
    # cd /home/changyou/
    mysql-5.0.56 
    # ./configure --prefix=/Data/apps/mysql  // 指定安装目录,公司的应用都在这里,怪异
    --without-debug //去除debug模式
    --with-extra-charsets=gb2312 //添加gb2312中文字符支持
    --enable-assembler //使用一些字符函数的汇编版本
    --without-isam //去掉isam表类型支持 现在很少用了 isam表是一种依赖平台的表
    --without-innodb //去掉innodb表支持 innodb是一种支持事务处理的表,适合企业级应用
    --with-pthread //强制使用pthread库(posix线程库)
    --enable-thread-safe-client //以线程方式编译客户端
    --with-client-ldflags=-all-static 
    --with-mysqld-ldflags=-all-static //以纯静态方式编译服务端和客户端

    # make
    # make install
    # scripts/mysql_install_db //生成mysql用户数据库和表文件,草,就是这里!!
    # cp support-files/my-medium.cnf /etc/my.cnf  //copy配置文件,有large,medium,small三个环境下的,根据机器性能选择,如果负荷比较大,可修改里面的一些变量的内存使用值
    # cp support-files/mysql.server /etc/init.d/mysqld  //copy启动的mysqld文件
    # chmod 700 /etc/init.d/mysqld
    # cd /web
    # chmod 750 mysql -R
    # chgrp mysql mysql -R

    # chown mysql mysql/var -R    (如果没有var目录,可以自己建一个,记得权限)
    # cd /web/mysql/libexec
    # cp mysqld mysqld.old
    # strip mysqld
    # chkconfig --add mysqld
    # chkconfig --level 345 mysqld on
    # service mysqld start
    # netstat -atln
    看看有没有3306的端口打开,如果mysqld不能启动,看看/web/mysql/var下的出错日志,一般都是目录权限没有设置好的问题
    # ln -s /web/mysql/bin/mysql /sbin/mysql
    # ln -s /web/mysql/bin/mysqladmin /sbin/mysqladmin
    # mysqladmin -uroot password "youpassword"   //设置root帐户的密码
    # mysql -uroot -p
    # 输入你设置的密码
    mysql>use mysql;
    mysql>delete from user where password=""; #删除用于本机匿名连接的空密码帐号
    mysql>flush privileges;
    mysql>quit


    注意,如果mysql服务启动不了,提示:
    Starting MySQL/etc/init.d/mysqld: line 159: kill: (21755) - No such process
    看看是否是启动脚本的问题。
    编辑mysqld:
    #vi /etc/init.d/mysqld
    找到类似这样一行:
    $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &
    改为(加上参数--user=root):
    $bindir/mysqld_safe --user=root --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &

    然后再试:
    service mysqld start

    Tag:linux Mysql
  • 2009-08-20

    php的调试工具XHProf的安装,运用 - [php]

    分了台新服务器做测试,最近很闲,正好拿来练手,哈哈,先拿XHProf玩吧。调试PHP时,XDebug一直是大众的不二选择,搭配上Webgrind,可以获得不错的效果,但是很耗资源,CPU一会就到100%了。最近看别人的blog,发现了XHProf,于是想体验了一下。安装过程很简单,但也遇到不少挫折,因为新服务器,上面有些东西是运维装好了,所以没有仔细了解。都是些小问题,不过折腾死了。

    1.#wget http://pecl.php.net/get/xhprof-0.9.2.tgz  一开始wget用不了,报错:Resolving dada... failed: Temporary failure in name resolution.查明是DNS解析的原因,然后更改 /etc/resolv.conf,问运维,写上正确的IP。

    2.下载完了,解压 #tar zxf xhprof-0.9.2.tgz  然后,#cd cd xhprof-0.9.2/extension/

    3.然后 #phpize   (一般编译安装的PHP都有,没有去下)

    4.#./configure --with-php-config=/usr/bin/php-config

    5.#make    #make install  #make test    就搞定了

    6.然后  更改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=<这里写你要保存xhp生成log的目录>

    7.搞定啦!!  整个过程最郁闷的是,php.ini中的extend扩展地址没写,还是默认的“./”一直没发现,试了半天都不成功,崩溃了,最后还是抽了根烟才发现,呵呵,烟是好东西啊。

    测试下,

    <?php
    function bar($x) {
      if ($x > 0) {
        bar($x - 1);
      }
    }
    function foo() {
      for ($idx = 0; $idx < 2; $idx++) {
        bar($idx);
        $x = strlen("abc");
      }
    }
    // start profiling
    xhprof_enable();
    // run program
    foo();
    // stop profiler
    $xhprof_data = xhprof_disable();
    // display raw xhprof data for the profiler run
    print_r($xhprof_data);

    ?> 


    最后返回数组,就表示安装好了。具体哪些值是什么意思先别管,因为下面有UI的配置。会很直观!

    8.首先,为了好看,装个Graphviz:
    wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
    tar zxf graphviz-2.24.0.tar.gz
    cd graphviz-2.24.0
    ./configure
    make
    make install

    安装完成后,会生成/usr/local/bin/dot文件,你应该确保路径在PATH环境变量里,以便XHProf能找到它。

    9.把上面的测试代码拿过来改改,在最后面,加上几行:

    include_once ("/Data/web/changyou/xhprof_lib/utils/xhprof_lib.php");
    include_once ("/Data/web/changyou/xhprof_lib/utils/xhprof_runs.php");
    $xhprof_runs = new XHProfRuns_Default();
    // Save the run under a namespace "xhprof_foo".
    // **NOTE**:
    // By default save_run() will automatically generate a unique
    // run id for you. [You can override that behavior by passing
    // a run id (optional arg) to the save_run() method instead.]
    //
    $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

    echo "<br>---------------<br>".
    "Assuming you have set up the http based UI for <br>".
    "XHProf at some address, you can view run at <br>".
    "http://192.168.5.148/changyou/xhprof_html/index.php?run=$run_id&source=xhprof_foo<br>".
    "---------------<br>";

    ?>

    然后,好了,运行那个打印出来的URL,OK啦!看看效果,如果你安装了Graphviz,还会有华丽的大图噢


    Tag:php linux
  • 2009-08-13

    中文分词,应用 - [php]

    1.什么是中文分词,以及一些开源项目,见:http://www.williamlong.info/archives/1839.html

    2.中文分词一般在搜索的时候用得较多,分词系统一般是基于词频的,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。

    3.公司现有2个分词系统(开源)
    一个是:SCWS(强大,有PHP接口),开发者:Hightman
    一个是:HJ_SegWord(超轻量,用PHP写的)。

    4.先说Segword,引用类:HJ_SegWord_Class.php,实例化后调用接口:Seg_Word_NM

            include_once('HJ_SegWord_Class.php');
            $HJ_SegWord = new HJ_Segword_Class();
            $keyword = implode(' ', $HJ_SegWord->Seg_Word_NM($keyword));
            $HJ_SegWord->Clear();
            $keyword = empty($keyword) ? $keyword : conutf8($keyword);
            return $keyword;

    5.至于SCWS,安装见官方文档,使用呢:

            $dict = 'lib/pscws/dict/dict.xdb'; //词典
            $version = 3;        // 采用版本
            $autodis = true;    // 是否识别名字
            $ignore  = true;    // 是否忽略标点
            $debug   = false;    // 是否为除错模式
            $stats     = false;    // 是否查看统计结果

            $object = 'PSCWS' . $version;
            require_once('lib/pscws/pscws3.class.php');
            $cws = new $object($dict);
            $cws->set_ignore_mark($ignore); // 是否忽略标点
            $cws->set_autodis($autodis);// 是否识别名字
            $cws->set_debug($debug); // 是否为除错模式
            // 开启统计
            $cws->set_statistics($stats);// 是否查看统计结果    
            $keyword = implode(' ', $cws->segment($keyword, 'words_cb'));
            $keyword = empty($keyword) ? $keyword : conutf8($keyword);

            return $keyword;

  • 2009-07-14

    linux下修改php.ini,重启apache - [linux]

    公司php安装居然没有配置error_display为Off,导致报错时用户清晰看到服务器路径,还贴在了BBS上,太乐了。

    PHP本来安装在/usr/bin/下,但是公司统一安装的时候,是在/Apps/下,找了半天找不到,最后干脆用了php_info(),发现在/Apps/PHP5/zend/php.ini,然后修改,之后,要重启apache,找了下,就在/Apps/apache/bin/下,ls发现,有一堆,如:

    -rwxr-xr-x  1 root root  100399 Nov 26  2008 ab
    -rwxr-xr-x  1 root root    3428 Nov 26  2008 apachectl
    -rwxr-xr-x  1 root root    7001 Nov 26  2008 apr-1-config
    -rwxr-xr-x  1 root root    6201 Nov 26  2008 apu-1-config
    -rwxr-xr-x  1 root root   22597 Nov 26  2008 apxs
    -rwxr-xr-x  1 root root    9562 Nov 26  2008 checkgid
    -rwxr-xr-x  1 root root    8876 Nov 26  2008 dbmmanage
    -rw-r--r--  1 root root     978 Nov 17  2008 envvars
    -rw-r--r--  1 root root     978 Nov 26  2008 envvars-std
    -rwxr-xr-x  1 root root   35852 Nov 26  2008 htcacheclean
    -rwxr-xr-x  1 root root   23529 Nov 26  2008 htdbm
    -rwxr-xr-x  1 root root   16962 Nov 26  2008 htdigest
    -rwxr-xr-x  1 root root   23686 Nov 26  2008 htpasswd
    -rwxr-xr-x  1 root root 1156959 Nov 26  2008 httpd
    -rwxr-xr-x  1 root root   16311 Nov 26  2008 httxt2dbm
    -rwxr-xr-x  1 root root   15869 Nov 26  2008 logresolve
    -rwxr-xr-x  1 root root   20441 Nov 26  2008 rotatelogs

    最后,运行:#./apachectl restart  搞定

    Tag:php linux
  • 2009-06-18

    Linux命令+NFS配置+show processlist - [linux]

    Linux :http://hi.baidu.com/shengit/blog/item/3f61d48a6b4521769e2fb49b.html

     

    NFS:http://www.freebsd.org/doc/zh_CN/books/handbook/network-nfs.html
            http://server.ccw.com.cn/yyjq/htm2008/20080415_407746.shtml

     

    show processlist:http://hi.baidu.com/24xinhui/blog/item/e2947f13621a96d8f7039edb.html

     

    Tag:linux Mysql
  • 2009-05-13

    Linux 下各种查找替换字符串的办法 - [linux]

    1、在vi中使用的查找替换方法
    利用 :s 命令可以实现字符串的替换。具体的用法包括:
    :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
    :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
    :.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
    :1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
    :g/str1/s//str2/g 功能同上从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

    2、在shell中使用find结合grep进行文件的替换
    # find ./ -exec grep 'str1' '{}' \; -exec sed -i.bak s/str1/str2/g '{}' \;
    上面命令可以在当前目录下(包括子目录)查找包含str1的文件,自动替换成str2,并且生成源文件的bak文件

    Tag:linux
  • 2009-05-03

    查看mysql的sleep进程,并且kill掉,可在后台运行 - [mysql]

    <?php
    define('MAX_SLEEP_TIME', 120);

    $hostname = "localhost";
    $username = "root";
    $password = "password";
     
    $connect = mysql_connect($hostname, $username, $password);
    $result = mysql_query("SHOW PROCESSLIST", $connect);
    while ($proc = mysql_fetch_assoc($result))
    {
        
    if ($proc["Command"] == "Sleep" && $proc["Time"] > MAX_SLEEP_TIME)
       {
            @
    mysql_query("KILL " . $proc["Id"], $connect);
        
    }
    }
    mysql_close($connect);
    ?>

    #bash# crontab:

    */2 * * * * php /usr/local/sbin/kill-mysql-sleep-proc.php
    Tag:linux Mysql
  • 2009-04-25

    分布式服务器,查看各台服务器网页内容 - [service]

    /************************
    * 函数用途:同一域名对应多个IP时,获取指定服务器的远程网页内容
    * 创建时间:2008-12-09
    * 参数说明:
    *    $ip   服务器的IP地址
    *    $host   服务器的host名称
    *    $url   服务器的URL地址(不含域名)
    * 返回值:
    *    获取到的远程网页内容
    *    false   访问远程网页失败
    ************************/
    function HttpVisit($ip, $host, $url)  
    {  
       $fp = fsockopen ($ip, 80);
       if (!$fp)  
       {  
            return $erro=$ip." cant connected!!";  
       }  
       else  
       {  
           $out = "GET {$url} HTTP/1.1\r\n";
           $out .= "Host:{$host}\r\n";  
           $out .= "Connection: close\r\n\r\n";
           fputs ($fp, $out);  
           while($line = fread($fp, 4096))
           {
              $response .= $line;
           }
           fclose( $fp );

           //去掉Header头信息
           $pos = strpos($response, "\r\n\r\n");
           $response = substr($response, $pos + 4);
       
           return $response;  
       }  
    }
    //调用方法:
    $server_info1 = HttpVisit("60.28.209.250", "my.molihe.com", "index.php");
    $server_info2 = HttpVisit("60.28.209.245", "my.molihe.com", "index.php");
    $server_info3 = HttpVisit("60.28.209.221", "my.molihe.com", "index.php");
    ?>

    Tag:php linux
  • 2009-04-22

    [linux服务器] 监控系统的平均负载 - [linux]

    为什么要监控系统的平均负载?
         有时我们会感觉到系统响应很慢,但是又找不到原因,这时要查平均负载,是否有大量的进程在排队等待  
    1,平均负载是什么?
               特定时间间隔内运行队列中的平均进程数,好象还不够明白:就是进程队列的长度,有多少个进程在排队等待运行
    2,什么是"进程队列"?
               一个进程满足以下条件就会位于进程队列中
                      1,它没有在等待I/O操作的结果
                      2,它没有主动进入等待状态(即没有调用wait)
                      3,它没有被停止
    3,如何查看平均负载?
      最简单的命令是uptime
      例子:
      [lhd@localhost ~]$ uptime
      00:44:22 up  1:17,  3 users,  load average: 8.13, 5.90, 4,94
    4,显示的内容是什么意思?
              load average:    8.13,5.90,4,94
              显示的是过去的1,5,15分钟内进程队列中的平均进程数量
    5,如何衡量当前系统是否负载过高?
            如果每个cpu(可以按CPU核心的数量计算)上当前活动进程数不大于3,则系统性能良好,
            不大于4,表示可以接受
            如大于5,则系统性能问题严重
            上面例中的8.13,如果有2个cpu核心,则8.13/2=4.065,   此系统性能可以接受
            建议设置严格的报警值为: CPU核心的数量
            比如:CPU核心数量为2,则设置报警值为2
            (这样设置是合理的,因为毕竟不是每个应用都支持多CPU及多核心)
    6,查看平均负载的命令
                     有5个可用:
                     tload    能够绘制出负载变化的图形
                     uptime   同时显示开机以来的时间
                     w        同时显示出已登录的用户
                     top      这个对资源占用太高,不建议使用
                     cat /proc/loadavg   通过/proc系统信息得到平均负载
    注意:如果你要持续的观察平均负载,建议用 watch uptime  或 watch cat /proc/loadavg
    备注:关于watch:每隔一定时间执行指定的程序,并全屏显示结果。时间默认是2秒

    --------------------------------------------------------------------

    uptime

    这个uptime外壳命令产生下列输出:

    [pax:~]% uptime
    9:40am up 9 days, 10:36, 4 users, load average: 0.02, 0.01, 0.00

    它显示自从上次系统重启以来,活动的用户进程数量和所谓的平均负荷指标(load average)。

    procinfo

    在Linux系统上,procinfo命令产生以下输出:

    [pax:~]% procinfo
    Linux 2.0.36 (root@pax) (gcc 2.7.2.3) #1 Wed Jul 25 21:40:16 EST 2001 [pax]

    Memory: Total Used Free Shared Buffers Cached
    Mem: 95564 90252 5312 31412 33104 26412
    Swap: 68508 0 68508

    Bootup: Sun Jul 21 15:21:15 2002 Load average: 0.15 0.03 0.01 2/58 8557
    ...

    平均负载指标出现在这个输出的左下角。

    w

    w(ho)命令产生下列输出:

     [pax:~]% w
      9:40am  up 9 days, 10:35,  4 users,  load average: 0.02, 0.01, 0.00
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    mir ttyp0 :0.0 Fri10pm 3days 0.09s 0.09s bash
    neil ttyp2 12-35-86-1.ea.co 9:40am 0.00s 0.29s 0.15s w
    ...

    请注意,第一行的输出与uptime命令的输出相同。

    top

    top命令是最近加入到UNIX命令集中的,它通过计算进程消耗CPU的时间来给进程排名。它产生下列输出:

      4:09am  up 12:48,  1 user,  load average: 0.02, 0.27, 0.17
    58 processes: 57 sleeping, 1 running, 0 zombie, 0 stopped
    CPU states: 0.5% user, 0.9% system, 0.0% nice, 98.5% idle
    Mem: 95564K av, 78704K used, 16860K free, 32836K shrd, 40132K buff
    Swap: 68508K av, 0K used, 68508K free 14508K cched

    PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND
    5909 neil 13 0 720 720 552 R 0 1.5 0.7 0:01 top
    1 root 0 0 396 396 328 S 0 0.0 0.4 0:02 init
    2 root 0 0 0 0 0 SW 0 0.0 0.0 0:00 kflushd
    3 root -12 -12 0 0 0 SW< 0 0.0 0.0 0:00 kswapd
    ...

    所有这些命令,请注意,输出中都有三个数字报告平均负载。相当普遍的是,这些数字显示出从左至右的降序但是有时,又是升序排列,正如上面的输出。

    Tag:linux
  • 2009-04-11

    linux,gzip, zcat,tar命令 - [linux]

    在test目录下,有test.log文件,想要压缩

    ---------------.gz 文档!-------------------

    #gzip test.log       (会生成一个test.log.gz文档)
    (但是原test.log就没拉,如果想保留原文件,就直接:#gzip test.log >test.log.gz )
    #gzip -d test.log.gz   (解压)

    zcat 查看.gz文档的内容
    #zcat test.log.gz

    ------------------bz2文档!------------------

    #bzip2 test.log       (会生成一个test.log.bz2文档)
    (但是原test.log就没拉,如果想保留原文件,就直接:#bzip2 test.log >test.log.bz2 )
    #bzip2 -d test.log.bz2   (解压)

    bzcat 查看.bz2文档的内容
    #bzcat test.log.bz2

    --------------------tar 打包!-----------------

    tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:
    # tar -cf test.log.tar *.log
    这条命令是将所有.log的文件打成一个名为test.log.tar的包。-c是表示产生新的包,-f指定包的文件名。
    # tar -rf test.log.tar *.log2
    这条命令是将所有.log2的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
    # tar -uf test.log.tar test.log
    这条命令是更新原来tartest.log.tartest.log文件,-u是表示更新文件的意思。

    # tar -tf test.log.tar
    这条命令是列出all.tar包中所有文件,-t是列出文件的意思
    # tar -xf test.log.tar
    这条命令是解出test.log.tar包中所有文件,-x是解开的意思

    ------------------tar调用gzip、bzip2------------------

    -z 调用gzip
    # tar -czf test.log.gz.tar *.log
    这条命令是将所有.log的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,
    # tar -xzf test.log.gztar
    这条命令是将上面产生的包解开。

    -j 调用bzip2
    # tar -cjf test.log.bz2.tar *.log
    这条命令是将所有.log的文件打成一个tar包,并且将其用bzip2压缩,
    # tar -xjf test.log.bz2.tar
    这条命令是将上面产生的包解开。

    Tag:linux bash
  • 2009-02-26

    解决Apache2+PHP上传文件大小限制的问题 - [service]

    在php.ini里面可以设置最大上传文件大小

    解决方法:
    第一:
    在php.ini里面查看如下行:
    upload_max_filesize = 8M
    post_max_size = 10M
    memory_limit = 20M


    另外要确认上传的 <form> 里类似下面的这行

    <input type="hidden" name="MAX_FILE_SIZE" value="500000">

    第二:

    如果是apache 2 需要修改
    /etc/httpd/conf.d/php.conf
    中的LimitRequestBody 524288将524288(=512×1024)改大,比如5M(=5×1024×1024)

    Tag:php linux Apach
  • 2008-12-29

    rsync 使用指南。。。。。留着 - [linux]

    第一步:安装rsync包
        #/usr/ports/net/rsync  (进入安装目录)
        #make install clean   (编译rsync软件包)
    第二步:编辑rsync配置文件
        配置文件在/usr/local/etc/rsyncd.conf
        缺省这个文件是没有写的权限. 
        #chmod u+w rsyncd.conf   (加上写的权限)
        #vi /usr/local/etc/rsyncd.conf  (编辑配置文件,添加用于同步或备份的信息)
           事例:
          [ceshi]               (rsync区段的设定名称)
           path = /data/ceshi   (要同步的文件或用于备份其他文件的路径)
           comment =ceshi       (描述信息)
          read only = false    (把只读权限去掉,用于备份其他服务器的数据是必须要有写的权限)
           auth users = jiang   (用于验证的帐户名)

           secrets file = /usr/local/etc/rsyncd.secrets  (保存用于验证的帐户和密码的路径)
           保存退出

     

    第三步: 创建用于验证的帐户和密码文件
        #vi /usr/local/etc/rsyncd.secrets
          jiang:bjedu    (格式:帐号:密码 ,每行一组,帐号和密码用:号分开)
        保存后,需要保证用户是root,权限是600
        #chown root:wheel /usr/local/etc/rsyncd.secrets
        #chmod 600 /usr/local/etc/rsyncd.secrets
    第四步:启动服务
       在 /etc/rc.conf 中添加 rsyncd_enable="YES"
        #/usr/local/etc/rc.d/rsyncd start
    到此服务器端就全部安装完成。
    下面就是怎么来同步数据或备份数据了
    第一步:客户机设置
    同样需要安装 rsync 包,其他设置不需要做了。
    创建 /usr/local/ceshi.test 里面只写入服务器端的密码. 这样可以使用cron进行自动同步
    命令格式:
    #rsync [option] 源路径 目标路径
    其中:
    [option]:
    a:使用archive模式,等于-rlptgoD,即保持原有的文件权限
    z:表示传输时压缩数据
    v:显示到屏幕中
    e:使用远程shell程序(可以使用rsh或ssh)
    - -delete:精确保存副本,源主机删除的文件,目标主机也会同步删除
    - -include=PATTERN:不排除符合PATTERN的文件或目录
    - -exclude=PATTERN:排除所有符合PATTERN的文件或目录
    - -password-file:指定用于rsync服务器的用户验证密码
    - -update:只同步新的数据
    源路径和目标路径可以使用如下格式:
    rsync://[USER@]Host[:Port]/Path   <–rsync服务器路径
    [USER@]Host::Path             <–rsync服务器的另一种表示形式
    [USER@]Host:Path             <–远程路径
    LocalPath                    <–本地路径
    事例1:服务器端到客户端
        #/usr/local/bin/rsync -avrt - -update - -password-file=/usr/local/ceshi.test jiang@211.153.33.100::ceshi /usr/data
       对上面命令描述一下:
       - -password-file=/usr/local/ceshi.test  (指定本地保存用于验证的密码文件路径)
       jiang@211.153.33.100(服务器端的用于验证的帐号和地址)
       ::ceshi /usr/data (rsync区段的设定名称和本地用来同步备份数据的路径)
    事例2:客户端到服务器端
        #/usr/local/bin/rsync -avrt - -update - -password-file=/usr/local/ceshi.test /usr/data jiang@211.153.33.100::ceshi
       对上面命令描述一下:
       - -password-file=/usr/local/ceshi.test  (指定本地保存用于验证的密码文件路径)
       /usr/data  (把本地/usr/data整个目录同步/备份到服务器上)
       jiang@211.153.33.100(服务器端的用于验证的帐号和地址)
       ::ceshi (rsync区段的设定名称)
    注意 :如果 /usr/data/的话就是把 /usr/data/下的数据全部备份到服务器上,不包括目录本身。

    也可以通过cron定时更新
    #crontab -e
    0 22 * * 1-5 /usr/local/bin/rsync -avrt - -update - -password-file=/usr/local/ceshi.test jiang@211.153.33.100::ceshi /usr/data   (指定星期一到五,每晚十点整进行同步)

    Tag:rsync linux