php 5.3.x 使用 rrdcached 1.4.x

最近工作需要,碰到一个大量rrd写入的IO问题,决定使用rrdcached。

rrdcached官方文档:http://oss.oetiker.ch/rrdtool/doc/rrdcached.en.html
中文翻译(感谢翻译者):http://blog.chinaunix.net/space.php?uid=17196076&do=blog&id=2817737

本次使用rrdtool的最新版,rrdtool-1.4.7
下载地址:
http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.7.tar.gz

另外业务使用php来读写rrd文件,因此需要调用php的rrdtool extension,注意,一定要1.4.x版本以上,以前用的php_rrdtool.tar.gz和rrdtool.so是不支持rrdcached的。
最新版rrd.so源码下载:
http://pecl.php.net/package/rrd

rrd.so(原来叫rrdtool.so)的编译安装:

tar -zxvf rrd-1.1.0.tgz
cd rrd-1.1.0
/usr/local/php/bin/phpize 
ln -s /usr/local/rrdtool/lib/librrd.so.4 /lib64/librrd.so.4 

#不知是否我的人品问题,如果不做软连接,则会提示:
#error: rrd lib version seems older than 1.3.0, update to 1.3.0+
#configure会直接退出,检查config.log才发现conftest找不到librrd.so.4,故做软链接

./configure --with-php-config=/usr/local/php/bin/php-config
make
cp modules/rrd.so /usr/lib

然后在php.ini里填上extension=rrd.so
之后

[root@localhost rrd-1.1.0]# /usr/local/php/bin/php -i | grep rrd
rrd
rrd tool module => enabled
rrd tool module version => 1.1.0
rrdtool library version => 1.4.7	#看到这行则成功
RRDCACHED_ADDRESS => unix:/dev/shm/rrdcached.sock
PWD => /root/rrd-1.1.0
_SERVER["RRDCACHED_ADDRESS"] => unix:/dev/shm/rrdcached.sock
_SERVER["PWD"] => /root/rrd-1.1.0

然后启动rrdcached,启动参数自己根据需要,参考官方文档进行调整
#注意对sock文件的权限进行修改,否则php将无法读取,web是我启动php的用户,你们改成自己的。

/usr/local/rrdtool/bin/rrdcached -l unix:/dev/shm/rrdcached.sock -s web -F -w 3600 -z 3600 -f 86400
chown web.web /dev/shm/rrdcached.sock

随后添加环境变量
echo 'export RRDCACHED_ADDRESS="unix:/dev/shm/rrdcached.sock"' >> /etc/profile

这样的话,在命令行中使用/usr/local/rrdtool/bin/rrdtool update命令时,数据就会先存储到rrdcached中。

若想要php支持rrdcached,则需在PHP代码的开头加入:
putenv("RRDCACHED_ADDRESS=unix:/dev/shm/rrdcached.sock");

如此,将RRDCACHED_ADDRESS也注册到php的环境变量中,这样才会生效,这一点官方文档和网上都没有明确的说法,自己测试了好久,orz,好吧,我笨。


顺便给出一小段测试代码,初学者随手写的……大牛们勿喷……

<?php
#phpinfo();

putenv("RRDCACHED_ADDRESS=unix:/dev/shm/rrdcached.sock");

$opts_cpu = array( "--step", "1",
           "--start",time()-10,
           "DS:ds0:GAUGE:2:0:90000000000",
           "RRA:MAX:0.5:1:600"
        );

$fname = "/home/web/rrd/Liv.rrd";
$ret = rrd_create($fname, $opts_cpu);
if($ret == 0) {
        $err = rrd_error();
        error_log(time()."|Liv|-1|create|".$err);
}
else{
        for($i = 0; $i < 10; $i++) {
                mt_srand((double)microtime()*1000000*getmypid()); 
                $rrdtime = time();
                $data = mt_rand();
                echo $data."\r\n";
                sleep(2);
                $uret = rrd_update($fname, array("$rrdtime:$data"));
                if($uret == 0) {
                        $err = rrd_error();
                        error_log(time()."|Liv|-1|update|".$err);
                }
        }
}

然后通过 nc -U /dev/shm/rrdcached.sock ,再输入stats回车,即可看到rrdcached是否正常工作,例如:

[root@localhost ~]# nc -U /dev/shm/rrdcached.sock 
stats
9 Statistics follow
QueueLength: 0
UpdatesReceived: 18794128
FlushesReceived: 1
UpdatesWritten: 963771
DataSetsWritten: 17810163
TreeNodesNumber: 98816
TreeDepth: 20
JournalBytes: 0
JournalRotate: 0

没钱,好痛苦…… _(:3」∠)_


PS : 有兴趣的可以google一下这篇论文:Application Buffer-Cache Management for Performance:Running the World’s Largest MRTG


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值