-
2009-09-14
http_load 一个httpd 压力测试工具 - [service]
到http://www.acme.com/software/http_load/ 下载http_load ,安装也很简单直接make;make instlall 就行。
http_load的标准的两个例子是:
- http_load -parallel 5 -fetches 1000 urls.txt
- 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 列表文件。
实例:
分析:- http_load -rate 5 -seconds 10 urls
- 49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
- 5916 mean bytes/connection
- 4.89274 fetches/sec, 28945.5 bytes/sec
- msecs/connect: 28.8932 mean, 44.243 max, 24.488 min
- msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
- HTTP response codes:
- 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 -
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,还会有华丽的大图噢
-
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 搞定
-
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.shtmlshow processlist:http://hi.baidu.com/24xinhui/blog/item/e2947f13621a96d8f7039edb.html
-
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文件 -
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 -
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");
?> -
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
...所有这些命令,请注意,输出中都有三个数字报告平均负载。相当普遍的是,这些数字显示出从左至右的降序。但是有时,又是升序排列,正如上面的输出。
-
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
这条命令是更新原来tar包test.log.tar中test.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
这条命令是将上面产生的包解开。 -
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) -
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 (指定星期一到五,每晚十点整进行同步)









