memcache对服务器CPU要求高吗

dognx 发布于 2015/05/16 14:26
阅读 926
收藏 0
在使用阿里云的云服务 需要加一台 高内存的服务器  CPU需要双核或4核吗  是否会影响缓存的速度
加载中
0
eechen
eechen
既然Memcached是多线程的,多核心当然是有利于Memcached性能提升的。

【转】Memcached与Redis的比较
1.网络IO模型
Memcached是多线程非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,
接受请求后,将连接描述字pipe传递给worker线程,进行读写IO,
网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,
比如,Memcached最常用的stats命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗.

Redis使用单线程的IO复用模型,自己封装了一个简单的aeEvent事件处理框架,主要实现了epoll/kqueue/select,
对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序/聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的.

Memcached(libevent):多线程,epoll事件驱动.
Redis(aeEvent):单线程,epoll事件驱动.
SSDB(LevelDB引擎,epoll网络):多线程,epoll事件驱动.
SSDB新版本采用了多线程模型,避免写操作阻塞读操作:
1个主线程,负责网络IO.
10个读线程,负责像scan复杂操作读.
1个写线程,负责写操作磁盘IO.
1个leveldb的compact线程.
也就是set写操作时,一个主线程负责网络,一个写线程负责leveldb操作;而get读操作时只有主线程在工作.

2.内存管理方面
Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文章:
http://timyang.net/data/Memcached-lru-evictions/

LRU(Least Recently Used)即近期最少使用算法.
内存管理的一种页面置换算法,对于在内存中但又不用的数据块叫做LRU.
程序会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据.
Memcached自身并不主动定期检查和标记哪些数据需要被淘汰,只有当再次读取相关数据时才检查时间戳,
或者当内存不够使用需要主动淘汰数据时进一步检查LRU数据.

Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis根据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache.

3.数据一致性问题
Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题.
Redis没有提供cas命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串命令的原子性,中间不会被任何操作打断.

4.存储方式及其它方面
Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能.
Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能.

5.关于不同语言的客户端支持
在不同语言的客户端方面,Memcached和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好地使用.

http://calvin1978.blogcn.com/articles/lru.html
缓存那些事,一是内存爆了要用LRU(最近最少使用),LFU(最少访问次数),FIFO(先进先出)的算法清理一些,
二是设置了超时时间的键过期便要删除,用主动或惰性的方法.
2.6版Redis的LRU算法:
随机找三条记录出来,比较哪条空闲时间最长就删哪条,然后再随机三条出来,一直删到内存足够放下新记录为止.
一直以为它会帮我在整个Redis里找空闲时间最长的,哪想到我有一百万条记录的时候,它随便找三条就开始删了.
3.0版Reids的LRU改进:
每次随机取五条记录出来,插入到一个长度为十六的按空闲时间排序的队列里,然后把排头的那条删掉,
然后再找五条出来,继续尝试插入队列.

Memcached的LRU实现是再标准不过的LRU算法,专门使用了一个教科书式的双向链表来存储slab内的LRU关系.元素插入时把自己放到列头,删除时把自己的前后两个元素对接起来,更新时先做删除再做插入.分配内存超限时,很自然就会从LRU的队尾开始清理.
dognx
dognx
明白了 谢谢5
0
阿水plus
阿水plus
直接用阿里云的OCS不就好了
dognx
dognx
好的 我去了解下
返回顶部
顶部