最近公司在进行缓存框架方面的调研,我主要对Memcached在缓存大数据量情况下对系统硬件的影响和需求做了调研,以下是一些测试数据和调研结果:
Memcached缓存不同数据量测试情况:
一、测试环境配置信息
1. 缓存服务器配置信息:一共4台 ,三台是公司服务器,一台是本机
node1: 单核 1G内存
node2: 单核
1G内存
node3: 单核 1G内存
node4: 4核 8G内存
2.运行在每台服务器上的Memcached实例配置信息:
工作线程数量:4个
设置缓存大小:前三个结点是512MB,最后一个结点是4GB,集群总缓存大小时5632MB
最大并发连接数:1024
二、对内存和CPU的影响测试数据及分析:
数据量 | 5千 | 1万 | 10万 | 100万 | 1000万 | 1亿 |
内存 | 1.87MB | 3.65MB | 36.58MB | 366.7MB | 3.62GB | 受测试环境限制,没有测试 |
CPU | 对CPU影响较小,对于1000万条数据,单线程向Memcached中写,占用CPU比率为0.0%,尝试分别在测试程序中启动20个线程和100个线程同时向Memcached写数据,这两种情况下每台Memcached缓存服务器的CPU占用率都不超过1%。 | |||||
- 缓存数据量和占用内存大小成简单线性关系,数据量的增加没有对服务器内存造成特殊影响
- 缓存数据量的大小对CPU没有影响,写缓存的请求数量对CPU有影响且影响较小
三、总结
1.CPU方面:低并发和大数据量下Memcached对CPU要求很低,高并发情况官方说明是其对CPU要求也很低。
2.内存方面:只要内存够用(可横向无限扩展),Memcached缓存大数据量没有问题(1GB可缓存约250万条数据)。
2.Memcached有两个比较重要的限制,一是最大缓存时间为30天,二是一个缓存项目(key-value)的最大容量为1MB,这两个限制可能会对具体项目造成一定影响,一定要注意。
附:一个测试场景的截图
以下是更具体点的描述:
一、对于CPU的需求
Memcached对CPU的依赖是轻量级的,因为它的设计目标就是能够快速响应。Memcached是多线程的,默认会有4个工作线程。对于一般情形,Memcached在CPU低配的情形下也会是高效的。
二、对于RAM的需求
Memcached的设计目标就是能够把分布在多个节点上主机的内存缝合在一起,让我们的应用看到的是一个缝合之后的大块内存,因此,可以这么说:“内存越大越好”,具体大小则根据我们的应用场景来设定即可。
官方建议我们集群各结点的内存大小是一致的,集群的均衡意味着我们可以很容易的增加或删除结点,而不用考虑它们在集群中的权重大小。
分配内存时,不应占用全部物理内存,因为过度的分配内存可能会引起内存Swap,导致效率降低。
对于是否需要高速RAM,官方的回答是:not so much。
三、对带宽的需求
对带宽的需求主要取决于并发量及缓存Item的大小,因此,不同业务情况对带宽的需求差别是比较大的。
四、Memcached在硬件上的部署
1.使用专用服务器:
能用专用服务器当然是最好的了,好处不必多说,但也有一点需要注意,横向扩展比纵向扩展有个好处,就是单个结点宕掉对总体的影响会更小,比如一个单机32G 、4台机器机器构成的集群可靠性就比1台机器128G内存的可靠性要高。
2.部署在应用服务器:
可以部署在应用服务器或其它计算结点上,充分利用它们的空闲内存,比如一个web服务器有4GB的RAM,而运行在上面的App和OS已经占用了2GB,我们可以分配1.5GB给我们的Memcached实例。
但需要注意的是,这样做会有一些风险,如果内存不足时可能会引起Swap,而一个App的内存泄露也会kill掉Memcached实例。
3.部署在Database服务器:
不建议部署在数据库服务器上,尽量给数据库分配最大的内存。
总结:
- Memcached对CPU的依赖很低
- 对内存依赖高,可无限扩展内存,具体占用多大内存可以根据实际需求配置
- 带宽方面可暂不考虑
- 建议采用专用服务器或有较多空闲内存的应用服务器作为缓存服务器
王厚达 (18764287653)