SNS圈子招聘

2007/08/12 15:35 ArthurXF
销售自己的三种方式是:
酒香不怕巷子深;
酒香最怕巷子深;
酒香不在巷子中;
我想文祥做到了第三点,通过建立自己的品牌,每次都是别人来找他,而不是被动的推广自己,这就是品牌的价值

转自:若邻的公告

盼望了一个多月,龚文祥终于在新年到来之际如愿跳槽到美国网站Smarter,任职中国市场高级策划总监。

这是在互联网行业工作了10年的龚文祥的第六次跳槽。跟之前五次相似,这次机会也是他通过在网上“打广告”找来的,不同的是这次见效要快得多。

去年11月底,龚文祥在一个叫Wealink(中文名“若邻”)的网站上,发布了“美国网站在中国失败的十大思路性执行错误”的个人公告。“我这个公告目的性很强,即希望引起美国相关网站管理者的关注。”

去年12月15日,Smarter找到了他,双方谈了两个多星期后达成了合作。“前后只是一个月时间,周期比过去跳槽缩短了。以往是在个人博客或别的BBS上发出针对性很强的研究分析文章,每次也都会成功,不过周期要有3个月到半年。”
 
 “圈子招聘网”想象

“选择在若邻发布公告,是因为它的用户高端一些。通过若邻,其实是通过自己圈子的人际关系寻找跳槽机会。”龚文祥说,若邻网其实可以称为“圈子招聘网”。

此 前,龚文祥在香港上市公司才库企业集团任企业策划总监,负责策划应用蓝海战略创建与推广求职门户1010job精英招聘网。他对招聘的模式与途径,有更多 的认识。“传统招聘渠道,人力经理的主动性无法发挥,尤其在招聘中高层管理人员时效果更差,而通过猎头公司收费又太高。通过人际关系进行招聘,正成为一种 越来越普遍的方式。”

他认为,圈子招聘网至少有以下三个特征:相当数量真实的资料库,包含10个以上注册用户;用户活跃度高,能够 互相沟通;用户以专业的中高端商务人士为主。根据这三个特征判断,目前中国主要的SNS(socialnetworkingservice)网站 “Tianji天际网”、“Linkist联络家”和若邻网中,后两者即可称为圈子招聘网。

去年2月,龚文祥成了若邻网的注册用户,是朋友把他带进去的。在这里,最熟悉的朋友被称为“一度连接”,还有朋友的朋友,按强弱不同总共有“六度连接”。

龚文祥的一度连接是76个,总共连接显示380890个。“一度还有其他度的朋友会帮忙转发,都是在比较高端的商务人士圈子内传播,信息在传播的时候可信度比较高,传播的方向很清晰。”

根 据市场调查公司艾瑞去年10月24日发布的数据,若邻网该频道平均访问量及覆盖数最大,而三个月前若邻网络排名第三。去年第三季度开始,若邻网取代联络家 成为国内SNS的领军。“若邻不会强制要求实名注册,但是你的个人档案包括工作经历、教育经历以及别人对你的评价等,会决定你在若邻网的受信任与受欢迎程 度。”若邻网首席执行官陈浩源告诉《第一财经日报》。

  “XING”刺激

龚文祥认为,招聘将是若邻们以后的主要运营方向,因为可以通过对会员收费盈利。去年12月7日,德国商务社交网站XING(曾用名“OPENBC”)作为Web2.0技术代表公司在法兰克福上市,这也是全球首家商务SNS网站上市。它的主要盈利模式正是对会员收费。

对 会员直接收费,也是联络家目前确定的主要盈利模式。联络家上海分公司市场部汪璐婷向记者介绍:“在联络家搜索到人才的频次非常高。我们的一个优势是国内其 他SNS不具备的——我们在台北有分公司,人脉资源包括台湾地区的。”不过,对于盈利前景,她有些忧虑:“国外和国内情况不一样,在国外向会员收费是一件 很容易做到的事情,但在国内就难很多。”

对此,若邻网的市场负责人士表示:“招聘将是若邻重要的一块,但是不会成为主要创收点。现 在对会员的服务都是免费的,将来一些非常个人化的服务会要求我们收取一定费用,但会保持绝大部分是免费的。我们卖的是我们用户的价值,在合适的时候,会通 过与其他商家合作的方式来创收。”

创办两年来,若邻网注册用户数已突破80万,其间启动的招聘专区几乎吸引了国内所有猎头公司参与。与很多在等待风险投资的SNS网站不同,若邻网从创立之初,就吸引了500万美元的风险投资,投资方维众创业投资集团(中国)有限公司正是分众传媒的风投方。

  Web2.0盈利愿景

若邻网强调圈子的力量与价值,但并不把自己仅仅看作“圈子招聘网”。它的口号是“社会资本银行”,定位是“商务人士社交网站”,是一个SNS。“SNS是有着无限想象空间的,它永远是BETA(测试)版本。”陈浩源说。

2006年,Web2.0引领互联网风潮,但难以找到盈利模式的硬伤,让业界对它的前景不太看好。SNS会成为Web2.0盈利的突破点吗?

2005 年,传媒大亨默多克出资5.8亿美元收购MySpace的母公司。去年,Google以16.5亿美元天价收购YouTobe。这两者都被认为是SNS的 样板。去年7月,美国有统计称MySpace已成为美国流量第一的网站,而在去年9月,MySpace即宣布进军中国,现阶段正紧锣密鼓地组建中国团队。

SNS在中国的纷争迅速升温。但有业内人士认为,在中国要创建超大流量的SNS还很困难,将用户“黏牢”,尽可能发掘用户价值更为重要而可行。

最近,《商业周刊》一篇文章指出,最初由一家无线电台起步的法国免费博客网Skyblog在其国内抵挡住了MySpace的进攻,下一步它打算向整个欧洲地区和美国市场进军。

Skyblog 计划推出“对话营销”的商业广告模式,即以产品为中心来制作博客网站,吸引用户们在网站上围绕某个品牌展开讨论,以提高产品的知名度。对此,有分析师在媒 体上评论:“将用户们牢牢吸引在网站上对于网站来说是相当重要的。用户们在网站上花的时间越长,网站上发出的广告内容就越多。”分析师们称,这种互动广告 的出现可能预示着在线营销的发展方向。

精准性营销正是若邻瞄准的盈利方向。其公司团队认为,要做到这一点,首要的是熟悉用户的个性、口味与习惯,将用户“黏牢”。

现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。
PHP培训招生简章
Tags: ,
   eAccelerator和memcache,是目前较为主流的两个可使用在PHP之中的缓存加速工具.

 eAccelerator专门为PHP开发,而memcache不仅仅用在PHP之中,其他所有的语言都可以使用.

 eAccelerator的主要功能:
   1. 缓存PHP文件的执行代码:在被缓存的代码再次被调用时,将直接从内存读取,从而在很大程度了PHP运行的速度.
   2. 提供了共享内存操作函数:用户可以将自己的常见非资源对像,保存到内存之中,并可以随时读取出来.

 memcache的主要功能:
 提供共享内存操作函数,可以保存和读取数据

 两者的共同点:
 共同点:都提供了共享内存操作函数,可以用来保存和读取自己的数据

 两者的区别:
 eAccelerator作为PHP的扩展库存在,那么仅在PHP运行时,可以操作和读写共享内存,一般情况,只能由操作共享内存的程序自己调用.
 同时,eAccelerator可以缓存PHP程序的执行代码,提升程序的调入和执行速度.
 memcache主要作为一个共享内存服务器,其PHP扩展库仅仅作为PHP到memcache的连接库存在,类似MySQL扩展库.因而,memcache可以完全脱离PHP,其共享的数据,可以被不同的程序调用.

 根据两者的不同,我们将他们使用在真真需要的地方:
 eAccelerator主要用于单机PHP提速,缓存中间数据.对于实时性高,但数据操作量小的情况下,非常实用.
 memcache用于分布式或者集群系统,多台服务器可以共享数据.对于实时性高,同时数据操作量大的情况下,非常实用.

现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
  上一篇我们看了分布式运算的资料,这次我们来看看分布式内存共享。目前在PHP领域中能够做到分布式内存共享的只有Memcache。

1.memcached详细介绍。
引用
通常的网页缓存方式有动态缓存和静态缓存等几种,在ASP.NET中已经可以实现对页面局部进行缓存,而使用memcached的缓存比 ASP.NET的局部缓存更加灵活,可以缓存任意的对象,不管是否在页面上输出。而memcached最大的优点是可以分布式的部署,这对于大规模应用来 说也是必不可少的要求。
LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memcached作为缓存工具。memcached可以大规模网站应用发挥巨大的作用。

Memcached是什么?
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
Memcached由Danga Interactive开发,用于提升LiveJournal.com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。

如何使用memcached-Server端?
在服务端运行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
这将会启动一个占用2G内存的进程,并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。

如何使用memcached-Client端?
在应用端包含一个用于描述Client的Class后,就可以直接使用,非常简单。
PHP Example:
$options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");
$options["debug"] = false;
$memc = new MemCachedClient($options);
$myarr = array("one","two", 3);
$memc->set("key_one", $myarr);
$val = $memc->get("key_one");
print $val[0]."\n"; // prints 'one‘
print $val[1]."\n"; // prints 'two‘
print $val[2]."\n"; // prints 3

为什么不使用数据库做这些?

暂且不考虑使用什么样的数据库(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 实现事务(ACID,Atomicity, Consistency, Isolation, and Durability )需要大量开销,特别当使用到硬盘的时候,这就意味着查询可能会阻塞。当使用不包含事务的数据库(例如Mysql-MyISAM),上面的开销不存在,但 读线程又可能会被写线程阻塞。
Memcached从不阻塞,速度非常快。

为什么不使用共享内存?
最初的缓存做法是在线程内对对象进行缓存,但这样进程间就无法共享缓存,命中率非常低,导致缓存效率极低。后来出现了共享内存的缓存,多个进程或者线程共享同一块缓存,但毕竟还是只能局限在一台机器上,多台机器做相同的缓存同样是一种资源的浪费,而且命中率也比较低。
Memcached Server和Clients共同工作,实现跨服务器分布式的全局的缓存。并且可以与Web Server共同工作,Web Server对CPU要求高,对内存要求低,Memcached Server对CPU要求低,对内存要求高,所以可以搭配使用。

Mysql 4.x的缓存怎么样?
Mysql查询缓存不是很理想,因为以下几点:
当指定的表发生更新后,查询缓存会被清空。在一个大负载的系统上这样的事情发生的非常频繁,导致查询缓存效率非常低,有的情况下甚至还不如不开,因为它对cache的管理还是会有开销。
在32位机器上,Mysql对内存的操作还是被限制在4G以内,但memcached可以分布开,内存规模理论上不受限制。
Mysql上的是查询缓存,而不是对象缓存,如果在查询后还需要大量其它操作,查询缓存就帮不上忙了。
如果要缓存的数据不大,并且查询的不是非常频繁,这样的情况下可以用Mysql 查询缓存,不然的话memcached更好。

数据库同步怎么样?
这里的数据库同步是指的类似Mysql Master-Slave模式的靠日志同步实现数据库同步的机制。
你可以分布读操作,但无法分布写操作,但写操作的同步需要消耗大量的资源,而且这个开销是随着slave服务器的增长而不断增长的。
下一步是要对数据库进行水平切分,从而让不同的数据分布到不同的数据库服务器组上,从而实现分布的读写,这需要在应用中实现根据不同的数据连接不同的数据库。
当这一模式工作后(我们也推荐这样做),更多的数据库导致更多的让人头疼的硬件错误。
Memcached可以有效的降低对数据库的访问,让数据库用主要的精力来做不频繁的写操作,而这是数据库自己控制的,很少会自己阻塞 自己。

Memcached快吗?

非常快,它使用libevent,可以应付任意数量打开的连接(使用epoll,而非poll),使用非阻塞网络IO,分布式散列对象到不同的服务器,查询复杂度是O(1)。(于敦德)

参考资料:
Distributed Caching with Memcached | Linux Journal
http://www.danga.com/
http://www.linuxjournal.com/article/7451


2.memcached在freebsd下的安装:
引用
步骤1:安装memcached
代码:
# cd /usr/ports/databases/memcached/
# make install

步骤2:启动memcached
代码:
#/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd
参数解释:
-d 以守护程序(daemon)方式运行 memcached;
-m 设置 memcached 可以使用的内存大小,单位为 M;
-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;
-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;
-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。

以上以完成了memcached的安装及启动!
使用时按要求填上IP与端口既可


3.memcached 的工作原理
首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。
点击在新窗口中浏览此图片

4.安装php对memcache支持模块
有两种方法可以使 PHP 作为 memcached 客户端,调用 memcached 的服务进行对象存取操作。

第一种,PHP 有一个叫做 memcache 的扩展,Linux 下编译时需要带上 –enable-memcache[=DIR] 选项,Window 下则在 php.ini 中去掉 php_memcache.dll 前边的注释符,使其可用。
http://pecl.php.net/package/memcache

除此之外,还有一种方法,可以避开扩展、重新编译所带来的麻烦,那就是直接使用 php-memcached-client。
http://nio.infor96.com/wp-content/uploads/2006/04/memcached-client.zip
本文选用第二种方式,虽然效率会比扩展库稍差一些,但问题不大。

5.PHP memcached 应用示例
引用
首先 下载 memcached-client.php,在下载了 memcached-client.php 之后,就可以通过这个文件中的类“memcached”对 memcached 服务进行操作了。其实代码调用非常简单,主要会用到的方法有 add()、get()、replace() 和 delete(),方法说明如下:

add ($key, $val, $exp = 0)
往 memcached 中写入对象,$key 是对象的唯一标识符,$val 是写入的对象数据,$exp 为过期时间,单位为秒,默认为不限时间;

get ($key)
从 memcached 中获取对象数据,通过对象的唯一标识符 $key 获取;

replace ($key, $value, $exp=0)
使用 $value 替换 memcached 中标识符为 $key 的对象内容,参数与 add() 方法一样,只有 $key 对象存在的情况下才会起作用;

delete ($key, $time = 0)
删除 memcached 中标识符为 $key 的对象,$time 为可选参数,表示删除之前需要等待多长时间。

下面是一段简单的测试代码,代码中对标识符为 'mykey' 的对象数据进行存取操作:



//    包含 memcached 类文件
require_once('memcached-client.php');
//    选项设置
$options = array(
   'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
   'debug' => true,  //是否打开 debug
   'compress_threshold' => 10240,  //超过多少字节的数据时进行压缩
   'persistant' => false  //是否使用持久连接
   );
//    创建 memcached 对象实例
$mc = new memcached($options);
//    设置此脚本使用的唯一标识符
$key = 'mykey';
//    往 memcached 中写入对象
$mc->add($key, 'some random strings');
$val = $mc->get($key);
echo "n".str_pad('$mc->add() ', 60, '_')."n";
var_dump($val);
//    替换已写入的对象数据值
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo "n".str_pad('$mc->replace() ', 60, '_')."n";
var_dump($val);
//    删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo "n".str_pad('$mc->delete() ', 60, '_')."n";
var_dump($val);
?>


是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):


$sql = 'SELECT * FROM users';
$key = md5($sql);   //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
   //    在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
   echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
   $conn = mysql_connect('localhost', 'test', 'test');
   mysql_select_db('test');
   $result = mysql_query($sql);
     while ($row = mysql_fetch_object($result))
       $datas[] = $row;
   //    将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
   $mc->add($key, $datas);
} else {
     echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>


可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。


6.使用memcache情况,计数器、数据压缩的例子
引用

使用情况一:统计
//访问统计
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
if($s=$memcache->get('a')) {
   $s=$s+1;
   $memcache->set('a',$s);
}
else
$memcache->set('a',1);
echo '访问结果为:'.$s;
?>

其实我们可以用increment方法代替上面的做法
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

if($s=$memcache->increment('a',1)) {
   echo $s;    
}
else
$memcache->set('a',1);
?>



数据压缩:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$test=(str_repeat('jetwong',100000));
$memcache->set('b',($test));
?>
使用压缩:
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$test=(str_repeat('jetwong',100000));
$memcache->set('b',($test),MEMCACHE_COMPRESSED);
?>


使用情况说明:

前台比较 目前内存bytes 总共读取bytes_read 总共写入bytes_written

压缩前 700085 700081 416

压缩后 1131 1125 13

可能看到压缩后明显占用内存少了不少



Memcache内存的更新清理(delete flush)
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

/*设置值*/
$status = $memcache->getStats();
echo '设置前内存使用情况'.$status['bytes'].'
';
echo '设置后';
for($i=0;$i<9;$i++) {
   $memcache->set('b'.$i,rand(1,99));    
   echo '
'.$i.'->'.$memcache->get('b'.$i);      
}

/*查看设置的值*/
$status = $memcache->getStats();
echo 'delete前内存使用情况'.$status['bytes'].'
';
echo '
开始delete';
for($i=0;$i<9;$i++) {
   $memcache->delete('b'.$i);    
   echo '
'.$i.'->'.$memcache->get('b'.$i);
}

/*查看flush使用的情况*/
$status = $memcache->getStats();
echo '使用flush前内存使用情况'.$status['bytes'].'
';
echo '使用flush情况:';
for($i=0;$i<9;$i++) {
   $memcache->set('b'.$i,rand(1,99));    
   echo '
'.$i.'->'.$memcache->get('b'.$i);  
}
$memcache->flush();
echo 'flush之后:';
for($i=0;$i<9;$i++) {        
   echo '
'.$i.'->'.$memcache->get('b'.$i);
}
$status = $memcache->getStats();
echo 'flush后内存使用情况'.$status['bytes'].'
';
?>

内存超量的测试(set)

我们把内存设为2M

./memcached -d -m 2 -p 11211 -u root

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

//600K左右
$test1= str_repeat('jetlee',100000);
//600K左右
$test2= str_repeat('jetlee',100000);
//600K左右
$test3= str_repeat('李连杰',200000);
//600K左右
$test4= str_repeat('连杰李',100000);
//200K
$test5= file_get_contents('http://img.pconline.com.cn/images/photoblog/2988177/20068/4/1154688770042_mthumb.JPG');
$test6= file_get_contents('http://img.pconline.com.cn/images/photoblog/1767557/20069/28/1159417108902_mthumb.jpg');

for($i=1;$i<=6;$i++) {
   $j='test'.$i;
   if($memcache->set($j,$$j)) {
       echo $j.'->设置成功
';
       $status = $memcache->getStats();
       echo '内存:'.$status['bytes'].'
';
   }
   else {
       echo $j.'->设置失败
';
   }
}
?>

执行结果:

test1->设置成功
内存:600042
test2->设置成功
内存:1200084
test3->设置失败
test4->设置成功
内存:1200084
test5->设置失败
test6->设置失败

刚好印证我们的计算,不过20万的repeat为什么会失败,不是太了解,,,,,,

总结:
示例:
//设置篇
if($data = $memcache->get('k',$v)) {
   //显示我们的数据
   }
else {
   $data = get_from_database; //得到数据源
   if(!$memcache->set('k',$data), MEMCACHE_COMPRESSED) //开始设置
   log();    //不成功,记录失败信息    
}
?>



现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章

PHP 程序加速探索

2007/08/11 19:17 ArthurXF
- (一)简介
- (二)是否需要加速?
- (三)如何加速?
   -<1> 测试
       ◆ 服务器负载测试 ApacheBench
       ◆ 脚本执行速度测试 PEAR:: Benchmark
   -<2> 加速
       ◆ 代码优化
      ◆ 压缩输出 Gzip
      ◆ 内容缓存输出 PEAR Content cache
      ◆ 函数缓存输出 PEAR Function cache
      ◆ 加速工具软件 APC、Turck MMCache、PHPA、Zend Performance Suite
- (四)总结

(一)简介

  本文尝试对PHP程序加速的各个方面进行探索,包括必要性以及从不同角度采取的具体措施。希望有助于读者了解PHP程序加速,并应用于实际。

(二)是否需要加速?

  这个问题听起来有点愚蠢。在这个时代,很少有人会怀疑时间是最宝贵的财富,尤其是在商业市场上。程序执行越快,用户就节约越多的时间,这样你的程序就可以用更少的时间和服务器资源为用户服务,从而产生更多效益。
我想对于大部份人(包括我自己)来说,很多WEB项目都是在很紧张的时间里完成的,通常没有经过缜密的思考和严格的测试。当开始一个新的WEB项目。很多人都在构建那种“快而乱”的应用,缺乏必要的时间来调整和改良代码,这时优化和加速就是我们必须采取的措施。
  然而需要特别指出的是,并不是所有程序都需要加速。
  优化已完成的代码是很浪费时间的,最好的方法是在写代码的时候就注意到效率,然后完成项目后只优化确实需要优化的那部份。一般一个程序只会有少数几个影响速度的瓶颈,将它们找出来并解决掉,程序就可以很好地运行。另外,当遇到执行效率低下的情况,首先要用大局的眼光来找出影响效率的主要因素,而不要拘泥于细节—例如数据量过大,服务器带宽不够,或硬件配置过低,在这样的情况下,优化代码于事无补。
  另外,在没有发现程序有明显的执行缓慢的迹象时,就不要太吹毛求疵,为了改进一些非常细节的代码而浪费时间。用这些时间,你可以完成另一个项目或为原来的项目完成一个扩展功能。当然你可以笑话我不够负责,没有把工作做得尽善尽好,我也可以说你是完美主义者:-)  
  综上,在你决定为你的PHP程序提速之前,问问自己是否有必要。

(三)如何加速?

要回答“如何加速”这个问题前,需要先回答以下两个小问题:
你的程序慢在哪一部份?
PHP可以从哪几个方面考虑加速?
  第一个小问题显然我无法给你答案,但我建议你用“测试脚本执行速度”的方法来解决。只有找出限制速度的瓶颈,才能考虑如何去解决。
  第二个小问题我大概的答案是:代码优化,压缩输出,内容缓存输出,函数缓存输出,加速/缓存工具软件。如果你知道更多请告诉我:-)
  下面我们来详细地研究一下这几个方面的相关技术。当然实际上每个方面都有无数的细节可以讨论,下面的内容难免会有片面的地方,欢迎补充。

<1> 测试
◆ 服务器负载测试


  服务器负载太大而影响程序效率也是很常见的,我们需要对此进行测试。这里我以目前最常用的Apache服务器为例。
  Apache服务器自带有一个叫AB(ApacheBench)的工具,在bin目录下。使用这个轻巧的工具我们可以对服务器进行负载测试,看看在重负荷之下服务器的表现如何。ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求,同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据作为调整服务器设定或程序的依据。
  在命令行下输出:

./ab -n number_of_total_requests \
-c number_of_simultaneous_requests \
http://your_web_server/your_php_app.php

例如:

./ab -n 1000 -c 50 http://www.domain.com/myapp.php

  AB将同时向http://www.domain.com/myapp.php发出50个并发请求,共发出1000次。
  测试结果将可能是这样的:

Server Software: Apache/2.0.16
Server Hostname: localhost
Server Port: 80
Document Path: /myapp.php
Document Length: 1311 bytes
Concurrency Level: 50
Time taken for tests: 8.794 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 1754000 bytes
HTML transferred: 1311000 bytes
Requests per second: 113.71
Transfer rate: 199.45 kb/s received
Connection Times (ms)
min avg max
Connect: 0 0 5
Processing: 111 427 550
Total: 111 427 555

  myapp.php每秒钟可以处理的请求数为113.71个。将请求数增加,看看服务器能否处理更大的压力。你也需要调节Apache的MaxClients, ThreadsPerChild, MaxThreadsPerChild 等参数,基于你的 httpd.conf 中的 MPM 模块选择。
  如果你想得到更详细的信息,请到www.apache.org上查阅一些更深入的文档,包括模块和第三方的提高效率的工具。修改httpd.conf后,要重启Apache服务器,然后再用AB测试。你会看到每秒请求数增加或减少。
  记下每次的参数,最后选择最佳效率的那种配置。
  要指出的是,除了AB,还有许多优秀的服务器性能测试软件。另外,如果你的服务器不是 Apache,请自行寻找测试方法。

◆ 脚本执行速度测试

  前面有提到,只有找到影响速度的代码,我们才有可能进行优化。PEAR的benchmark包中的Benchmark_Timer类和Benchmark_Iterate类,可以用来很方便地测试脚本执行的速度。(关于PEAR的安装与配置请自行查看相关资料)
首先用Benchmark_Iterate类来测试程序中某个函数或类的某个方法的执行时间。

benchmark1.php


require_once('Benchmark/Iterate.php');
$benchmark = new Benchmark_Iterate();

$benchmark->run(10, 'myFunction','test');
$result = $benchmark->get();
echo "

"; print_r($result); echo "
";
exit;

function myFunction($var) {
   // do something
   echo 'Hello ';
}

?>

  建立benchmark Iterate对象$benchmark,这个对象用来执行myFunction函数10次。
  $argument变量每次都传递给myFunction. 多次运行的分析结果存入$result,然后用benchmark对象的get()方法来获取。这个结果用print_r()输出到屏幕。通常会输出这样的结果:
  Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello
Array(
   [1] => 0.000427    [2] => 0.000079    [3] => 0.000072    [4] => 0.000071    [5] => 0.000076    [6] => 0.000070    [7] => 0.000073    [8] => 0.000070    [9] => 0.000074    [10] => 0.000072    [mean] => 0.000108    [iterations] => 10)
  myFunction的每次执行,benchmark对象都会跟踪执行时间。并且会计算平均的执行时间([mean]那一行)。通过多次运行目标函数,你可以得到该函数的平均运行时间。
  在实际测试中,函数的次数应当至少1000次左右,这样可以得到较客观的结果。

  现在我们看看另一个测试脚本运行时间的方法--使用Benchmark_Timer类来测试一段代码执行所消耗的时间及这一段代码中每次调用与下一次调用间的时间。

benchmark2.php

require_once 'Benchmark/Timer.php';
$timer = new Benchmark_Timer();
$timer->start();
$timer->setMarker('start_myFunction');

for($i=0; $i<10; $i++){
   myFunction($argument);
}
$timer->setMarker('end_myFunction');
$timer->stop();
$profiling = $timer->getProfiling();

echo '
Time elapsed: ' .
$timer->timeElapsed('start_myFunction','end_myFunction') .'
';
echo '
'; print_r($profiling); echo '
';
exit;

function myFunction($var) {
   static $counter = 0;
   // do something
   echo $counter++ . ' ';
}
?>


  首先,建立一个benchmark timer对象$timer。然后调用start()方法,表示开始计时。 SetMaker()方法用来标记要测试的代码段。MyFunction()函数在循环中被调用,表示一段要执行的代码(当然实际中不会这么简单)。然后再用$timer对象的setMarker()方法标记程序执行终点。分析信息用getProfiling()来获取。在两个标记间程序执行消耗的时间用timeElapsed()方法计算出来(就像例子中的循环)。最后,用print_r()输出信息到屏幕:
Array(    [0] => Array        (            [name] => Start            [time] => 1085730111.27175200            [diff] => -            [total] => 1085730111.271752        )     [1] => Array        (            [name] => start_myFunction            [time] => 1085730111.27203800            [diff] => 0.000286            [total] => 1085730111.272038        )     [2] => Array        (            [name] => end_myFunction            [time] => 1085730111.27263200            [diff] => 0.000594            [total] => 1085730111.272632        )     [3] => Array        (            [name] => Stop            [time] => 1085730111.27271800            [diff] => 0.000086            [total] => 1085730111.272718        ))
0 1 2 3 4 5 6 7 8 9
Time elapsed: 0.000594

  通过这种方法,你可以在代码中设置大量时间段标记,获取每段代码执行时消耗的时间,很容易可以看出到底是哪一部份的代码影响了整个程序的运行效率。然后开始着手对这部份代码进行改进。
  用以上两种方法,你可以找出代码中最影响速度的部份代码。另外还可以用来对优化后的代码进行测试,看看到底执行速度提高了多少。通过测试->优化->测试->优化 …这样不断循环,你可以最终确定提供最佳效率的代码。

<2> 加速

◆ 代码优化
  掌握了PEAR::BenchMark,现在你已经知道如何测试你的代码,知道如何判断你的代码是快是慢,是哪一部份比较慢。那么接下来我要说的就是如何消灭或优化那部份慢的代码。
这一点上我个人最主要的经验只有两点,一是消除错误的或低效的循环;二是优化数据库查询语句。其实还存在一些其它的优化细节,比如“str_replace比ereg_replace快”、“echo比print快”等等。这些我暂时都放在一边,稍后我会提到用缓存来对付过于频繁的IO。
下面我们将三个功能相同,但程序写法不同的函数的效率(消耗的时间)进行对比。

badloops.php

require_once('Benchmark/Iterate.php');
define('MAX_RUN',100);
$data = array(1, 2, 3, 4, 5);

doBenchmark('v1', $data);
doBenchmark('v2', $data);
doBenchmark('v3', $data);
function doBenchmark($functionName = null, $arr = null)
{
   reset($arr);
   $benchmark = new Benchmark_Iterate;
   $benchmark->run(MAX_RUN, $functionName, $arr);
   $result = $benchmark->get();
   echo '
';
   printf("%s ran %d times where average exec time %.5f ms",$functionName,$result['iterations'],$result['mean'] * 1000);
}

function v1($myArray = null) {
   // 效率很差的循环
   for ($i =0; $i < sizeof($myArray); $i++)
   {
       echo ' ';
   }
}

function v2($myArray = null) {
   // 效率略有提高
   $max = sizeof($myArray);
   for ($i =0; $i < $max ; $i++)
   {
       echo ' ';
   }
}

function v3($myArray = null){
   //最佳效率
   echo " ";
}
?>

  程序输出的结果大概是这样的:

v1 ran 100 times where average exec time 0.18400 ms
v2 ran 100 times where average exec time 0.15500 ms
v3 ran 100 times where average exec time 0.09100 ms

  可以看到,函数的执行时间变少,效率上升。
  函数v1有个很明显的错误,每一次循环的时间,都需要调用sizeof()函数来计算。函数v2则在循环外把$myArray数组的元素个数存到$max变量中,避免了每次循环都要计算数组的元素个数,所以效率提高了。函数v3的效率最高,利用了现成的函数,避免循环。
  这个例子只是给你一个感性的认识,明白什么是相对高效的代码。在实际开发中,我相信会有很多人会迷迷糊糊地写出很多低效率的代码。要把代码写得精炼而高效,恐怕需要时间去锤炼:-) 但这是另一个话题了,我们略过不谈。
  数据库应用基本上每个PHP程序都会用到,在实际开发中我发现最影响整个系统效率的就是数据库这部份。至于数据库的优化和数据查询语句的优化,在此限于篇幅不详细讨论。你可以参看这两篇文章:
http://www.phpe.net/articles/340.shtml
http://www.phpe.net/articles/323.shtml
  及这篇讨论:
http://club.phpe.net/index.php?s=&act=ST&f=15&t=4783&st=0(前面几篇贴子总结不错),主要是针对MySQL的。

◆压缩输出 gzip

  利用Apache中的mod_gzip模块,我们可以利用gzip的压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端的浏览器。如果是纯文本的内容,效果非常明显,大约可以压缩到原来的30%-40%,使用户的浏览速度大大加快。
  Gzip需要客户端浏览器支持,目前大部份浏览器都支持gzip,如IE,Netscape,Mozilla等,所以这种方法值得一试。我们可以利用PHP中的预定义变量$_SERVER[‘HTTP_ACCEPT_ENCODING’]来判断客户端浏览器是否支持gzip。

gzip1.php


if(ereg('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])) {
   //浏览器支持
} else {
   //浏览器不支持,输出其它内容
}
?>

  接下来我们对上面这个PHP程序进行扩展,使用ob_start(ob_gzhandler)来将网页内容压缩,存入缓冲并发送给支持gzip的浏览器,浏览器会自动将压缩后的内容解压,显示。

gzip2.php

define('MAX',100);

if(ereg('gzip',$_SERVER['HTTP_ACCEPT_ENCODING']))
{
   //浏览器支持gzip,将内容压缩并缓冲输出
   ob_start("ob_gzhandler");
   $output = '';

   for($i=0;$i<=MAX;$i++)
   {
       $output .= "This is line $i
";
   }
   echo "浏览器支持gzip压缩输出
";
   echo $output;
}
else
{
   //浏览器不支持,直接输出
   for($i=0;$i<=MAX;$i++)
   {
       $output .= "This is line $i
";
   }

   echo "浏览器不支持gzip压缩输出
";
   echo $output;
}
?>


  使用gzip压缩生成的网页的HTTP头信息与一般的网页相比中会多出这样的信息:

Content-Encoding: gzip
Content-Length: 270

  如果你想得到更详细的信息,请参看mod_gzip项目主页:
http://sourceforge.net/projects/mod-gzip/

  类似地,我们也可以利用mod_deflate,压缩率比mod_gzip略低一些。调用zip函数需要耗用服务器内存,所以要慎用,视需求而定。

◆ 内容缓存输出 PEAR cache

  接下来我们开始探索更常用的缓存技术,这也是本文的重点部份。首先我们使用PEAR中的cache包。PEAR可以将内容缓存于文件,数据库或者内存中,我们以文件为例。
  下面是一个没有使用缓存的PHP小程序:

pear_content_cache1.php

echo "这是内容。

";
echo "当前时间是" . date('M-d-Y H:i:s A', time()) . "
";
?>

  上面这个程序非常简单,现在我们为其加上缓存。

pear_content_cache2.php

require_once 'Cache/Output.php';

//设置缓存目录,必须是可写的
$cacheDir = './pear_cache';
$cache = new Cache_Output('file',array('cache_dir' => $cacheDir));

//如果nocache变量为空,使用缓存中的内容
//如果想获得最新的内容,就要赋值给nocache变量
if (empty($_REQUEST['nocache']))
{
   // 建立一个独一的cache标识
   // 请求+Cookie信息
   $cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS));
}
else
{
   //想获得最新的内容,ID为空
   $cache_id = null;
}


//看cache ID对应的缓存内容是否可用
if ($content = $cache->start($cache_id))
{
   //缓存已存在,直接输出,并结束脚本
   echo $content;
   exit();
}

// 缓存中不存在该内容,生成新内容并写入缓存
echo "这是内容。

";
echo "当前时间是" . date('M-d-Y H:i:s A', time()) . "
";
// 把内容写入缓存
echo $cache->end();
?>

  分别刷新这两个文件,你会发现pear_content_cache1.php中的“当前时间是”这一行中的时间是随着刷新而变化的,而pear_content_cache2.php中的这一行则不变。这是由于pear_content_cache2.php使用了缓存,将用户请求的内容存入静态文件中。当用户再次请求时,它直接从文件中输出,而不需要用程序动态生成内容。
  对于pear_content_cache2.php,如果用户想要读取最新的信息,而不是缓存中成旧的信息。那么可以用http://…/pear_content_cache2.php?nocache=1 来访问,这将禁用缓存功能。刷新一下看看,你将发现时间会随之变化。
  总结一下PEAR内容缓存类的使用:
  1.包含PEAR包 要注意设对路径。
  2.包含Output.php中的cache类
require_once 'Cache/Output.php';
  3.设置缓存目录
$cacheDir = './pear_cache';
  确认这个目录是可写的。Cache数据将会写入这个目录的子目录中。
  4.建立一个输出缓存对象
$cache = new Cache_Output('file',array('cache_dir' => $cacheDir));
  第一个参数表示我们使用基于“文件”方式的缓存,第二个参数是一个与缓存目录相关联的数组。
  5.产生一个唯一的cache ID
$cache_id = $cache->generateID(array('url' => $_REQUEST,'post' =>$_POST,'cookies' => $HTTP_COOKIE_VARS));
  这里$cache对象的generateID()方法通过提供一个信息数组(URL, HTTP POST data, 和 HTTP cookie)来独一无二地标识这个请求,与其它请求区分开来。
  6.增加一个逻辑判断语句看是否对应于cacheID的缓存数据是否已经存在,如果存在,获取数据并结束脚本。
if ($content = $cache->start($cache_id))
{   echo $content;
   exit();
}
  7. 将产生内容的代码放在以上逻辑语句之后,并结束使用cache对象。
echo $cache->end();

◆ 函数缓存输出 PEAR cache

  PEAR除了可以对输出的内容进行缓存处理外,还可以将对某个函数的调用结果缓存起来。这是个很有趣的功能,如果你的程序要频繁使用到某个函数,而且调用的结果相同的话,我建议你不妨试试,特别是当这个函数运行起来比较慢的时候。

  下面我们实现对一个执行起来很慢的函数slowFunction()的缓冲调用。

require_once 'Cache/Function.php';


$cacheDir = './pear_cache/';
$cache = new Cache_Function('file',array('cache_dir' => $cacheDir));
$arr = array('苹果', '梨','西瓜');
$cache->call('slowFunction', $arr);
echo '
';

$arr = array('苹果', '梨','西瓜');
slowFunction($arr);

function slowFunction($arr = null)
{
   echo "一个执行起来很慢的函数 :(
";
   echo "当前时间是 " . date('M-d-Y H:i:s A', time()) . '
';
   foreach ($arr as $fruit)
   {
       echo "我吃了一个 $fruit
";
   }
}
?>

      以下是示例的脚本执行结果:
一个执行起来很慢的函数 :(
当前时间是 Jul-28-2004 17:15:57 PM
我吃了一个 苹果
我吃了一个 梨
我吃了一个 西瓜

一个执行起来很慢的函数 :(
当前时间是 Jul-28-2004 17:17:55 PM
我吃了一个 苹果
我吃了一个 梨
我吃了一个 西瓜
  代码中,Cache/Function.php类用来执行函数缓冲功能。$cache变量是一个Cache_Function对象,使用基于文件的函数缓存,存入$cacheDir目录。要缓存一个函数调,Cache_Function对象$cache的call()方法要像这样使用:$cache->call(‘slowFunction’, $arr);
  这里,slowFunction()函数被调用,参数为一个数组$arr,这个函数被缓存在$cacheDir目录下的一个文件里。任何在此之后的对这个函数的调用,将会由$cache->call()返回该函数执行的结果。
  函数缓存和使用方法和内容缓存很相似,不再多说,具体请查看PEAR手册。

  以上我们都是利用优化代码的方法对程序进行提速,接着我们要关注一下PHP加速的另一个领域—缓存工具软件。这类软件都是从优化PHP运行环境来提速的,不需要改变任何代码。我们可以大概地将它们称为“执行码优化/缓存工具”,你可以理解为它们用来实现比较底层的优化/缓存。

  以下列出目前比较常用的此类工具,具体哪种效果最好,请用自己的服务器环境测试:
(一)APC Alternative PHP Cache
http://apc.communityconnect.com/
  APC运行于Linux和FreeBSD,你需要自己编译安装。按照其开发人员的说法,在他们的测试环境下可以提高脚本速度50%-400%。并且APC是个开源项目,已经加入了PHP的PECL库,很值得一试。
(二)Turck MMCache
http://turck-mmcache.sourceforge.net/
  Turck MMCache似乎是此类软件中目前最受欢迎的一种,它开放源代码,完全免费。它将PHP代码预编译并缓存起来,同时也对PHP运行环境进行一定优化。按照其官方文档的说法,MMCache可以明显地减轻服务器的负载,并提高脚本执行速度1-10倍。
  MMCache与另一个知名的加速软件Zend Optimizer兼容,但注意必需先安装MMCache(php.ini中设置)。除了加快PHP程序的速度,MMCache还可以将PHP代码加密。
  Turck MMCache同时支持Linux和Win32平台。
(三)PHPA  the PHP Accelerator
http://www.php-accelerator/
  PHPA又是另一个流行的PHP加速软件。在其官方网站上有分别使用PHPA与APC、Zend Cache的PHP脚本执行测试对比,其表现略优于APC,略逊于Zend Cache。
   PHPA支持Linux, FreeBSD, OpenBSD, BSDi和Solaris系统.
(四)Zend Performance Suite
http://www.zend.com/
   Zend Performance Suite是老牌的PHP加速/优化软件,依托于PHP领域最知名的Zend公司。目前已经推出4.0版本,它可以为PHP应用提供程序加速,内容缓存,文件压缩,下载服务等,功能十分强大,获得好几个PHP杂志的推荐奖—但是不得不提起,它也很昂贵,目前的价格是1875美元。
以上几种加速软件,希望读者按照服务器环境自行测试并选择其中最适用的,因为我没有办法提供一个普遍适用的测试标准来判断哪种方案是最有效的。综合起来看,我个人认为Turck MMCache是个值得推荐的选择,免费而且功能相当出色。

(四)总结

  以上从多个角度较为全面细致地阐述了PHP加速的相关技术,包括测试技术,加速技术(压缩,缓存等),基本上都有附代码和范例。希望本文有助于读者全面了解PHP程序加速并在实际应用中选择合适的加速方案。

Tags: ,
  随着信息技术的应用和发展,未来单台计算机的处理能力是越来越不能满足要求了,势必将发展成为众多计算级组成的集群来做服务,不断的将更多的计算机加入集群就可以满足更大压力需求。
  我这里说的集群是概念上的集群,最终这种大型的集群势必需要解决分布式运算(即众多CPU协同运算)和分布式存储(即文件分布在各个计算机中)和分布式内存共享(即形成了数据共享使用),这些问题都解决了,其实就是由很多分布在各地的计算机组成了一台超级计算机,由这台超级计算机去完成一定的服务。我觉得这势必是未来计算机发展的方向,当然这里还需要解决很多问题。
  目前已经有了很多很成熟分布式的系统,我针对上面3个大方向,收集了一些资料,仅供参考。
  先提供的分布式运算,也叫平行运算的资料。
引用
LAM/MPI CLuster System With FreeBSD 5.3 HOWTO
tonnyom < tonnyom # hotmail.com >

版权声明:可以任意转载,转载时请务必以文字形式标明文章原始出处和作者信息及本声明.

前言
MPI(Message Passing Interface)消息传送接口
它不是一个协议,但它的地位已经实际上是一个协议了。它主要用于在分布式存储系统中的并行程序通信。MPI是一个函数库,它可以通过Fortran和C程序进行调用,MPI的好处是它速度比较快,而且移植性比较好。

Cluster
目前常见的Cluster(集群)架构有两种,一种是Web/Internet Cluster System,这种架构主要是将资料放置在不同的主机上面,亦即由多部主机同时负责一项服务;而另外一种则是所谓的平行运算了(Parallel Algorithms Cluster System)!平行运算其实就是将同一个运算的工作,交给整个Cluster里面的所有CPU来进行同步运算的一个功能。由于使用到多个CPU的运算能力,所以可以加快运算的速度。

此文档所安装架设的LAM/MPI Cluster System属于后者,由于实验环境条件以及自身能力的限制,可能文档有部分解释不详尽,如有疑问请来信与我联系,我将尽力完善此文档,谢谢!

软件及平台
Server \\ FreeBSD 5.3 Stable
IP:172.18.5.247
Hostname: center.the9.com

Client \\ FreeBSD 5.3 Release
IP:172.18.5.80
Hostname: node1.the9.com

apache_1.3.29 \\ All Ports Install
php4-4.3.10
php4-gd-4.3.10
php4-extensions-1.0
lam-6.5.9
ganglia-monitor-core-2.5.6
ganglia-webfrontend-2.5.5

目的
架设一套基于FreeBSD 5.3的LAM/MPI Cluster System.

安装及配置

一,各节点系统 /etc/hosts 的基本配置 \\ 如果内网有DNS,则配置好系统中的 /etc/resolv.conf 即可!
center.the9.com
#more /etc/hosts
172.18.5.247 center.the9.com
172.18.5.80 node1.the9.com

node1.the9.com

#more /etc/hosts
172.18.5.247 center.the9.com
172.18.5.80 node1.the9.com

二,Apache+PHP Server 的架设
center.the9.com

#cd /usr/ports/www/apache13-modssl
#make install clean \\ 安装 APACHE

#cd /usr/ports/lang/php4-extensions
#make install clean \\ 安装 PHP. 切记这里一定要选择安装GD库

#vi /usr/local/etc/apache/http.conf \\ 加入以下相关参数

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

三,NFS Server-Client 的架设
NFS Server(center.the9.com)

#vi /etc/rc.conf \\ 加入以下相关参数

nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4 -h 172.18.5.247"
mountd_enable="YES"
mountd_flags="-r -l"
rpcbind_enable="YES"
rpcbind_flags="-l -h 172.18.5.247"

#vi /etc/exports \\ 配置NFS共享目录

/cluster -maproot=0:0 -network 172.18.5.0 -mask 255.255.255.0

#/etc/rc.d/rpcbind start #/etc/rc.d/mountd start #/etc/rc.d/nfsd start \\ 启动NFS Server

NFS Client(node1.the9.com)

#vi /etc/rc.conf \\ 加入以下相关参数

nfs_client_enable="YES"

#vi /etc/fstab \\ 加入以下相关参数 172.18.5.247:/cluster /cluster nfs rw 0 0

#mount /cluster \\ Mount /Cluster 目录

四,LAM/MPI Cluster System的架设
Step 1: 基本安装
center.the9.com

#cd /usr/ports/net/lam
#make install clean \\ 安装 LAM

#cd /usr/ports/sysutils/ganglia-monitor-core
#make install clean \\ 安装Cluster System 所需的Monitor Core

#cd /usr/ports/sysutils/ganglia-webfrontend
#make install clean \\ 安装上面Monitor Core 所需的WEB GUI

node1.the9.com
#cd /usr/ports/net/lam
#make install clean \\ 安装 LAM

#cd /usr/ports/sysutils/ganglia-monitor-core
#make install clean \\ 安装Cluster System 所需的Monitor Core

Step 2: 配置

center.the9.com

#cd /usr/local/etc/
#cp gmond.conf.sample gmond.conf
#cp gmetad.conf.sample gmetad.conf

#vi gmond.conf \\ 修改name和mcast_if 的参数

# The name of the cluster this node is a part of
# default: "unspecified"
name "BSDCluster"

# The multicast interface for gmond to send/receive data on
# default: the kernel decides based on routing configuration
mcast_if lnc0

#vi gmetad.conf \\ 修改data_source 的参数

# data_source "my cluster" 10 localhost my.machine.edu:8649 1.2.3.5:8655
# data_source "my grid" 50 1.3.4.7:8655 grid.org:8651 grid-backup.org:8651
# data_source "another source" 1.3.4.7:8655 1.3.4.8

data_source "BSDCluster" 10 center.the9.com:8649 node1.the9.com:8649

#vi /usr/local/etc/lam-bhost.def \\ 加入各node 的hostname

center.the9.com
node1.the9.com

node1.the9.com \\ 基本上,每个新增节点的配置都要和以上center.the9.com 的配置一致.
node2.the9.com
nodeX.the9.com ........

五,Monitor WEB GUI 的配置
center.the9.com

#vi /usr/local/etc/apache/http.conf \\ 加入以下相关参数,配置Cluster Monitor Web的路径

Alias /ganglia/ "/usr/local/www/ganglia/"

Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all

#vi /etc/rc.conf \\ 加入以下参数

apache_enable="YES"
apache_flags="-DSSL"
apache_pidfile="/var/run/httpd.pid"

#/usr/local/etc/rc.d/apache.sh start \\ 启动APACHE

六,启动并调试Cluster System以及检查测试
center.the9.com node1.the9.com nodeX.the9.com etc....

#/usr/local/etc/rc.d/gmetad.sh start #/usr/local/etc/rc.d/gmond.sh start \\ 启动Cluster 各Node的Monitor Core

center.the9.com

$lamboot -dv \\ 启动各节点的lam daemon

LAM 6.5.9/MPI 2 C++/ROMIO - Indiana University

lamboot: boot schema file: /usr/local/etc/lam-bhost.def
lamboot: opening hostfile /usr/local/etc/lam-bhost.def
lamboot: found the following hosts:
lamboot: n0 center.the9.com
lamboot: n1 node1.the9.com
lamboot: resolved hosts:
lamboot: n0 center.the9.com --> 172.18.5.247
lamboot: n1 node1.the9.com --> 172.18.5.80
lamboot: found 2 host node(s)
lamboot: origin node is 0 (center.the9.com)
Executing hboot on n0 (center.the9.com - 1 CPU)...
lamboot: attempting to execute "hboot -t -c lam-conf.lam -d -v -I " -H 172.18.5.247 -P 53433 -n 0 -o 0 ""
hboot: process schema = "/usr/local/etc/lam-conf.lam"
hboot: found /usr/local/bin/lamd
hboot: performing tkill
hboot: tkill
hboot: booting...
hboot: fork /usr/local/bin/lamd
[1] 28338 lamd -H 172.18.5.247 -P 53433 -n 0 -o 0 -d
hboot: attempting to execute
Executing hboot on n1 (node1.the9.com - 1 CPU)...
lamboot: attempting to execute "/usr/bin/ssh node1.the9.com -n echo $SHELL"
lamboot: got remote shell /bin/sh
lamboot: attempting to execute "/usr/bin/ssh node1.the9.com -n (. ./.profile; hboot -t -c lam-conf.lam -d -v -s -I "-H 172.18.5.247 -P 53433 -n 1 -o 0 " )"
hboot: process schema = "/usr/local/etc/lam-conf.lam"
hboot: found /usr/local/bin/lamd
hboot: performing tkill
hboot: tkill
hboot: booting...
hboot: fork /usr/local/bin/lamd
[1] 43110 lamd -H 172.18.5.247 -P 53433 -n 1 -o 0 -d
topology done
lamboot completed successfully

$lamhalt -dv \\ 停止各节点的lam daemon

LAM 6.5.9/MPI 2 C++/ROMIO - Indiana University

Shutting down LAM
lamhalt: sending HALT to n1 (node1.the9.com)
lamhalt: waiting for HALT ACKs from remote LAM daemons
lamhalt: received HALT ACK from n1 (node1.the9.com)
lamhalt: sending final HALT to n0 (center.the9.com)
lamhalt: local LAM daemon halted
LAM halted

$lamnodes \\ 查看node info $lamexec N echo "hello" \\ 查看node run status

center.the9.com

#ps ax
28338 ?? I 0:00.04 /usr/local/bin/lamd -H 172.18.5.247 -P 53433 -n 0 -o 0 -d

node1.the9.com

#ps ax
43110 ?? S 0:00.05 /usr/local/bin/lamd -H 172.18.5.247 -P 53433 -n 1 -o 0 -d

Cluster Monitor WEB GUI

http://center.the9.com/ganglia/ \\ 用这个查看系统数据,还是很直观的,是以RRDTool 生成的 images. :)

CPUs Total: 2
Hosts up: 2
Hosts down: 0
Avg Load (15, 5, 1m):
1%, 4%, 0%
Localtime:
2004-12-31 10:50

Total CPUs: 2
Total Memory: 0.2 GB
Total Disk: 8.0 GB
Most Full Disk: 61.2% Used

参考
http://lam-mpi.org/ lam-mpi http://www.beowulf.org/ beowulf FAQ http://www.lasg.ac.cn/cgi-bin/forum/topic.cgi?forum=4&topic=2247 MPI Cluster With RH9 http://lists.freebsd.org/mailman/listinfo/freebsd-cluster freebsd cluster maillist



现在ArthurXF本人正在搞PHP等技术培训,如果想学习的人可以跟我联系。另外培训的招生简章在这个网址,想了解的可以去看看。加我QQ:29011218交流也可。
PHP培训招生简章
分页: 96/128 第一页 上页 91 92 93 94 95 96 97 98 99 100 下页 最后页 [ 显示模式: 摘要 | 列表 ]