twitter最近将ruby实现的消息队列服务器starling开源了,这是一个支持memcache协议的轻量级持久化服务器,因此使用php/perl/ruby/java等多种客户端都没问题,可以将较慢的处理逻辑通过消息队列放在后台处理,同时也支持多点分布式处理。周末找了个闲置的centos 5机器搭了一套starling试用,配合php的memcache扩展测试一番,有点意思。
starling安装步骤
centos默认不带ruby,得重新装,以下安装步骤都是以root身份跑的。
yum install ruby ruby-devel rubygems
gem install memcache-client starling
如果你使用yum找不到ruby的相关包,请记得添加epel repository。安装之后新增的程序:
- /usr/bin/starling #一个ruby脚本,starling的服务程序
- /usr/bin/starling_top #starling的状态检查程序,可以查看starling的运行状态,类似memcache的状态显示,不同的是能够显示每个key的状态
starling启动后默认会在22122端口蹲点守候。
为了使用方便,我修改了一个starling在centos下的启动脚本,放在/etc/init.d/starling,下载地址:http://customcode.googlecode.com/files/starling。使用方法:
/etc/init.d/starling start|stop|restart
测试程序
以下是在测试中用的php脚本,说实话php在循环比较大的时候没啥优势,但是关键是简单,几行就搞定了。
写入的测试程序
-
#!/usr/bin/php
-
<?php
-
$m = new Memcache;
-
$m-> addServer ( '127.0.0.1', '22122' );
-
-
$start = microtime (true );
-
-
for ($i = 0; $i < 10000; ++$i ) {
-
//echo $i, "/n";
-
$m-> set ( 'testtesttesttest', '中文测试中文测试中文测试中文测试中文测试中文测试中中文测试中中文中a' );
-
}
-
echo "time:" . (microtime (true ) - $start ), "/n";
读出来的测试程序
-
#!/usr/bin/php
-
<?php
-
$m = new Memcache;
-
$m-> addServer ( '127.0.0.1', '22122' );
-
-
while ( 1 ) {
-
echo $m-> get ( 'test' ), "/n";
-
usleep ( 100 ); // 休息一下,否则容易cpu 100%
-
}
性能测试
测试条件:
- key的长度16B
- value的长度100B,
- 8个并发写入进程
- 每个进程插入10,000条记录
平均每个进程花了7秒完成写入操作,那么照这样计算:
10000 * 8 / 7 = 每秒写入11428次
以上测试进行的比较随意,而且我懒得插入大量数据来测试了,这个比较花时间,所以测试结果仅供参考。由于starling是目前twitter在生产环境中运行的,经过实践检验过,稳定性应该不成问题。