博客地址: http://blog.csdn.net/lgg201/archive/2010/09/11/5877798.aspx由于是在项目基础上测试, 不方便贴出测试代码, 见谅.
如果对测试结果不认同, 请提供测试方法及数据, 互相学习./**
* @author: selfimpr
* @blog: http://blog.csdn.net/lgg201
* @mail: [email protected]
*/系统现有APC存储数据量: 70万条左右.测试数据: key, value都是15字节左右的随机字符串测试方法:
1. 测试每次运行10组, 每组10000次读/写, 使用jpgraph生成折线图.
2. 读/写分别测试, 不会互相影响.使用接口:
//Memcache接口
$mem = new Memcache();
$mem->connect('localhost', 11211);
$mem->get();
$mem->set();
//Apc接口
apc_store();
apc_fetch();
结论:
1. 在nginx+fastcgi的web环境下, apc随着数据量增大, 性能下降明显, 在超过8万条后, 性能低于Memcache
2. 在CLI模式下运行, apc性能稳定, 60万条数据一直远超memcache详细测试过程输出, 请参见博客.
如果对测试结果不认同, 请提供测试方法及数据, 互相学习./**
* @author: selfimpr
* @blog: http://blog.csdn.net/lgg201
* @mail: [email protected]
*/系统现有APC存储数据量: 70万条左右.测试数据: key, value都是15字节左右的随机字符串测试方法:
1. 测试每次运行10组, 每组10000次读/写, 使用jpgraph生成折线图.
2. 读/写分别测试, 不会互相影响.使用接口:
//Memcache接口
$mem = new Memcache();
$mem->connect('localhost', 11211);
$mem->get();
$mem->set();
//Apc接口
apc_store();
apc_fetch();
结论:
1. 在nginx+fastcgi的web环境下, apc随着数据量增大, 性能下降明显, 在超过8万条后, 性能低于Memcache
2. 在CLI模式下运行, apc性能稳定, 60万条数据一直远超memcache详细测试过程输出, 请参见博客.
解决方案 »
- 用户点击下载,弹出另存为的框,选择自己的本地的路径,保存图片,在IE6上可以正常运行的,但是在firefox测试的时候出现 savepic is not defined ? 不知道如何解决,请求高手帮
- apache的url重写
- 请问这个错误是怎么回事???
- php表单提交取不到值。。
- 我对move_uploaded_file是相当的无语
- 牛人快来帮忙
- 空文件夹如何压缩
- 想在浏览器中开发类似桌面的应用程序,用什么工具?
- php 如何提取png图片的内容?
- 为什么我的php中使用了session变量,但如果进入其他目录时如,www.a.com/bbs,一进入
- session问题
- thinkphp无法添加数据到数据库
具体应用?
http://php.net/manual/en/book.memcache.php
http://php.net/manual/en/book.apc.php
这些文档非常浅显易懂的缓存的使用, 本身就是简单的, 因为缓存的目的简单(以Memcache类缓存为例): 把一部分常用数据, 存储在内存中, 以降低硬盘的IO消耗.我觉得复杂的是以下几方面:
1. 对哪些数据使用缓存
2. 缓存数据时采用什么样的结构
3. 对缓存周期的控制而几点, 一方面我自己也不是很能摸得着头脑啊, 另一方面这又多得结合实际的应用情况.
看的文章缓存的过期策略 CSDN新版积分制论坛中,帖子列表缓存会在列表数据缓存达到600时,把它清理到550条数据。
又比如新积分制论坛帖子的缓存过期,则是没有任何列表引用这个帖子后,则这个帖子过期。缓存的同步问题 解决方法很简单,把你的业务逻辑,代码触发情况都考虑清楚,不要遗留没有触底的地方。
简单的方法会导致你的代码逻辑变得非常复杂。
这也就是有些人,在非必要的时候,建议你不要用缓存的原因。一旦开始使用缓存,你就应该准备增加大量的代码来处理数据同步的问题。
//写入测试的相关代码
while($j ++ < $times) { //$times表示组
$memcache_time = 0; //memcache耗时累计
$apc_time = 0; //apc耗时累计
$i = 0;
while($i ++ < $num_per_time) { //每组写入次数
$key = uniqid('test_key'); //生成key
$value = uniqid('test_value'); //生成value
$start = microtime(true); //开始时间
//SharedMemory::create创建的是memcache连接, 这是我们封装的, 封装的东西绝对会比原生的Memcache慢, 所以, 对目前测试结果不产生影响
$memcache = SharedMemory::create(DbConf::$JHX_REMOTE['engin'],DbConf::$JHX_REMOTE['options']);
$memcache->set($key, $value); //设置值
$end = microtime(true);
$memcache_time += $end - $start; //累计Memcache写入耗时, 包括连接耗时
$start = microtime(true);
apc_store($key, $value); //apc写入
$end = microtime(true);
$apc_time += $end - $start; //累计apc写入耗时
}
$memcache_times[] = $memcache_time; //将两个时间分别记录到数组.
$apc_times[] = $apc_time;
}
//最终是用$memcache_times和$apc_times这两个数组使用jpgraph生成图.
$memcache = SharedMemory::create(DbConf::$JHX_REMOTE['engin'],DbConf::$JHX_REMOTE['options']);
while($j ++ < $times) { //$times表示组
$memcache_time = 0; //memcache耗时累计
$apc_time = 0; //apc耗时累计
$i = 0;
while($i ++ < $num_per_time) { //每组写入次数
$key = uniqid('test_key'); //生成key
$value = uniqid('test_value'); //生成value
$start = microtime(true); //开始时间 $memcache->set($key, $value); //设置值
$end = microtime(true);
$memcache_time += $end - $start; //累计Memcache写入耗时, 包括连接耗时
$start = microtime(true);
apc_store($key, $value); //apc写入
$end = microtime(true);
$apc_time += $end - $start; //累计apc写入耗时
}
$memcache_times[] = $memcache_time; //将两个时间分别记录到数组.
$apc_times[] = $apc_time;
}
呵呵, 结果已经是Memcache在超过8万后比apc快了.
而且, memcache的连接耗时是不能忽略的, 因为我们现在系统内的php不可能每几十万数据才创建一次连接(一次连接只为一个用户服务), 所以这个时间要考虑进去
不知你封装memcache的类是怎么写, 但如果要缓存的数据量大, 变化频繁, 应该用长连接再加个守护进程,
如果按php默认的做法, 每次都连接, 那消耗的资源太大了.我对你做的项目感兴趣, 如果不方便分开的话, 在技术和设计上, 可以写私信交流.
用C写一个常驻进程来作为memcache连接池吗?
那php与这个进程的通信以什么方式进行? 这个通信的耗时应该也需要计算的吧.ps: 这方面不太现实, 我们没有用c实现这些功能的人和时间, 呵呵, 谢谢.
--------------------关键还得看你这个进程怎么写, 至少这个通迅不用频繁连接数据库或多个程序, 这样节省时间.php本身设计是以最省资源方式去做, 所以被人称高负载, 但当它超过某一个值, 像你用mem和apc测试那样, 超过了那个临界点就有必要利用其它方法来解决,
我还使不太明白你的意思阿...不管这个进程写的多么精彩, 我们减少了php连接数据库服务进程, 连接memcache服务进程的次数, 但是却增加了php连接这个进程的消耗啊....
呵呵4个nginx, 5个php-cgf, 开发机器..非服务器不明白这跟数据库负载的关系...并发负载不懂.
而memcache则可有单独服务器所以,从这个角度讲memcache或许更快
■□■□■□■□■□■□■□■
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
1: 颜色问题, 是正确的. 理论上来讲, APC是要比Memcache快的, 但是, 我的实验结果是在数据量在8万以上, Apc的性能降低了..
2. 关于图, 其实应该读写各一张就完事了, 不过我用的nginx, 我不会配让他不超时, 就多做了几次出的图, 把读的图连起来, 把写的图连起来, 才能说明问题: 交叉点说明了apc性能低于Memcache的数据量, 而数据量继续增大时, apc性能降低的速度也在降低, 也就是曲线的坡度变缓了..
3. 由于2所说, 这些图其实本应该是连续的, 所以, 能够证明我的结论1.关于你提到的计时算法, 我觉得这个是没有问题的.
首先: 由于对APC和memcache都使用了同样的计时, 并且是单次计时, 在几十万次数量下, 可以认为哪怕有影响, 对两者也是均衡的. 所以对于两者的比较结果不会产生影响(这个我总共跑了大概有差不多5, 6次, 结果是一致的.).
当然, 你提到的首尾计时, 肯定更好, 谢谢.
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
呵呵, 第一张图那个怪异的波动我也没有细究, 呵呵, 只是我们的项目开始使用apc存储了70万条左右的数据, 后来由于要使用一个常驻进程,但又不能和web共享apc, 所以测试了apc和memcache的性能问题, 结果发现数据量大的时候memcache反而快了....
测完证明了可以用memcache了, 也比较忙, 就没有再继续了, 呵呵....你说的内存不够我觉得有可能, 因为我查资料时候看到apc是mmap的, 而memcache是纯内存, 所以, 有可能是内存不足后使用文件导致的.
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
If compiled with MMAP support by using --enable-mmap this is the mktemp-style file_mask to pass to the mmap module for determing whether your mmap'ed memory region is going to be file-backed or shared memory backed.
用来决定mmap映射到文件还是共享内存的.apc.user_entries_hint
这个参数的确是用来调整用户变量缓存数量的, 我刚把这个参数调整到1000000, 跑了50万条, 和CIL模式下运行结果一致.谢谢maquan
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)