php中使用memcache扩展的性能问题
2015-10-01 19:18
567 查看
http://www.cnblogs.com/sunli/archive/2010/08/28/php_memcache_memcache_chunk_size.html
php中使用memcache扩展的性能问题
[文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-08-28]
Memcached是一个高性能分布式缓存系统,目前估计是很多公司的标配了,因为他被非常广泛的使用,在各种语言下都有其丰富的client,所以很多后端服务也采用了兼容的memcached协议,比如memcachedb, ttserver等等。所以最近我开发的队列服务器也采用了memcached协议,底层是基于磁盘的存储,单独测试底层存储的性能非常好,在我台式机能达到每秒写入3万1K的数据。
今天用php测试了下往刚刚开发的队列服务器(icqueue)插入数据,代码如下:
<?php
$mem=new Memcache();
$mem->addServer ("127.0.0.1",12001,false,1,100);
$start=microtime(true);
$str= str_repeat ("a",1024);//1k数据
for($i=0;$i<100000;$i++){
$mem->add("bbs_password_",$str,0,0);//入队,bbs为队列名称,password为密码
}
echo microtime(true)-$start;
?>
执行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php
5.6957609653473
花了5秒,感觉速度还是挺快,还是单进程跑的。接着我想测试大一点的数据,把其中的
$str= str_repeat ("a",1024);//1k数据
改为
$str= str_repeat ("a",1024*10);//10k数据
执行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php发现速度非常的慢,等了1分钟也没有成功。怀疑是队列服务(icqueue)有问题,又换成memcached服务器写数据测试,发现速度同样的慢。
这就排除了是服务端的问题。经过调整数据的大小,发现只要达到8K就非常慢。
然后怀疑是不是到了8K memcach自动进行了压缩,是压缩很慢呢?又去telnet进去,发现数据是没有压缩的。
剩下的问题应该就是网络问题了,翻看了memcach扩展的手册,发现其中memcache.chunk_size的大小默认是8K,灵感一现,希望就是这这个问题导致的。
然后又改代码:
<?php
ini_set('memcache.chunk_size',1024*15);//设置到15K
$mem=new Memcache();
$mem->addServer ("127.0.0.1",12001,false,1,100);
$start=microtime(true);
$str= str_repeat ("a",1024*10);//10k数据
for($i=0;$i<100000;$i++){
$mem->add("bbs_password_",$str,0,0);//入队,bbs为队列名称,password为密码
}
echo microtime(true)-$start;
?>
执行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php
10.800881147385
跑了10完成,OK,问题解决了。
memcache.chunk_size在php.ini设置的。大小推荐设置为你的数据的常规大小。
新浪微博:http://t.sina.com.cn/sunli1223
php中使用memcache扩展的性能问题
[文章作者:孙立 链接:http://www.cnblogs.com/sunli/ 更新时间:2010-08-28]
Memcached是一个高性能分布式缓存系统,目前估计是很多公司的标配了,因为他被非常广泛的使用,在各种语言下都有其丰富的client,所以很多后端服务也采用了兼容的memcached协议,比如memcachedb, ttserver等等。所以最近我开发的队列服务器也采用了memcached协议,底层是基于磁盘的存储,单独测试底层存储的性能非常好,在我台式机能达到每秒写入3万1K的数据。
今天用php测试了下往刚刚开发的队列服务器(icqueue)插入数据,代码如下:
<?php
$mem=new Memcache();
$mem->addServer ("127.0.0.1",12001,false,1,100);
$start=microtime(true);
$str= str_repeat ("a",1024);//1k数据
for($i=0;$i<100000;$i++){
$mem->add("bbs_password_",$str,0,0);//入队,bbs为队列名称,password为密码
}
echo microtime(true)-$start;
?>
执行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php
5.6957609653473
花了5秒,感觉速度还是挺快,还是单进程跑的。接着我想测试大一点的数据,把其中的
$str= str_repeat ("a",1024);//1k数据
改为
$str= str_repeat ("a",1024*10);//10k数据
执行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php发现速度非常的慢,等了1分钟也没有成功。怀疑是队列服务(icqueue)有问题,又换成memcached服务器写数据测试,发现速度同样的慢。
这就排除了是服务端的问题。经过调整数据的大小,发现只要达到8K就非常慢。
然后怀疑是不是到了8K memcach自动进行了压缩,是压缩很慢呢?又去telnet进去,发现数据是没有压缩的。
剩下的问题应该就是网络问题了,翻看了memcach扩展的手册,发现其中memcache.chunk_size的大小默认是8K,灵感一现,希望就是这这个问题导致的。
然后又改代码:
<?php
ini_set('memcache.chunk_size',1024*15);//设置到15K
$mem=new Memcache();
$mem->addServer ("127.0.0.1",12001,false,1,100);
$start=microtime(true);
$str= str_repeat ("a",1024*10);//10k数据
for($i=0;$i<100000;$i++){
$mem->add("bbs_password_",$str,0,0);//入队,bbs为队列名称,password为密码
}
echo microtime(true)-$start;
?>
执行:[root@sunlitest1 bbs]# /usr/local/php/bin/php mem.php
10.800881147385
跑了10完成,OK,问题解决了。
memcache.chunk_size在php.ini设置的。大小推荐设置为你的数据的常规大小。
新浪微博:http://t.sina.com.cn/sunli1223
相关文章推荐
- Ehcache与Memcached比较
- Redis与Memcached比较
- Memcached java 简单实例
- memcached之数据优化(转)
- memcached之java客户端:spymemcached与spring整合
- memcache原理
- Nginx+Tomcat+Memcached集群实践
- C#调用Couchbase中的Memcached缓存
- memcache学习使用
- memcache
- memcache的线程模型
- Memcached-Java-Client 如何开启一致性hash?
- 使用memcache处理Session信息
- php使用MemCache查询数据库
- 分布式缓存系统Memcached简介与实践
- memcached 使用
- repcached实现memcached主从复制
- Memcache与MySQL并肩作战
- CentOS安装Memcached
- Memcached源码分析