一.Memcached企业服务
Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。
6.1. 之前内存分配的弊端
在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的。但是,这种方式会导致内存碎片,加重操作系统内存管理器的负担,最坏的情况下,会导致操作系统比memcached进程本身还慢。Slab Allocator就是为解决该问题而诞生的。
6.2解决方案
Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定,分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配,以解决内存碎片问题。
Page
分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。
Chunk
用于缓存记录的内存空间。
Slab Class
相同大小的chunk组成的组。
Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。
如图所示,每个slab只存储大于其上一个slab的size并小于或者等于自己最大size的数据。例如:100字节大小的字符串会被存到slab2(88-112)中,每个slab负责的空间是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修改-f参数来修改增长比例。
6.3 带来的新的问题
Slab Allocator解决了当初的内存碎片问题,但新的机制也给memcached带来了新的问题。chunk是memcached实际存放缓存数据的地方,这个大小就是管理它的slab的最大存放大小。每个slab中的chunk大小是一样的,如上图所示slab1的chunk大小是88字节,slab2是112字节。由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。这里需要注意的是chunk中不仅仅存放缓存对象的value,而且保存了缓存对象的key,expire time, flag等详细信息。所以当set 1字节的item,需要远远大于1字节的空间存放。
memcached在启动时指定 Growth Factor因子(通过-f选项), 就可以在某种程度上控制slab之间的差异。默认值为1.25。
6.4 slab的内存分配具体过程如下:
Memcached在启动时通过-m参数指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。
如果一个新的数据要被存放:
首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。
申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。
若没有空闲的page的时候,则会对该slab进行LRU,而不是对整个memcache进行LRU
- wget https://github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz
- tar -zxvf libevent-2.0.19-stable.tar.gz
- cd libevent-2.0.19-stable
- ./configure
- make
- make install
- tar -zxvf memcached-1.4.0.tar.gz
- cd memcached-1.4.0
- ./configure
- make
- make install
/usr/local/bin/memcached
memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 31081/memcached
tcp 0 0 :::11211 :::* LISTEN 31081/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 31081/memcached
udp 0 0 :::11211 :::* 31081/memcached
tar zxvf memcache-2.2.5.tgz
cd memcache-2.2.5
/application/php/bin/phpize
./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
make
make install
ll /application/php/lib/php/extensions/no-debug-zts-20090626/
添加:extension=memcache.so
测试代码:
<?php
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$memcache->set('key001', 'oldboy001');
$memcache->set('key002', 'oldboy002');
$get_value01 = $memcache->get('key001');
$get_value02 = $memcache->get('key002');
echo $get_value02."<br>";
echo $get_value01;
?>
测试结果:
[root@djw3 www]# /application/php/bin/php mem.php
oldboy002<br>oldboy001
网友可以网上测试下,这里我测试是失败的,报错500,想不通为什么,我用的软件是apache,也可以进行nginx的添加。命令行如上,测试是成功的。
web服务器上配置PHP文件,指定缓存服务器作为session服务器
vim /application/php/lib/php.ini php.ini中进行配置
1461:session.save_handler = memcache
1490:session.save_path = "tcp://10.0.0.100:11211"
1. memcached是内存缓存,在读写速度上会比普通files时快很多
2. 可以解决多个服务器公用session的难题
缺点说明:
1. session数据都保存在memory中,持久化方面有所欠缺,但对session数据来说不是问题
2. 也可以用其它的持久化系统存储sessions,例如:redis,ttserver
3. 高性能高并发场景,cookies的效率比session更好很多,因此,很多大网站都会用cookies解决会话共享问题
一.Memcached企业服务的更多相关文章
- 有关memcached企业面试案例讲解
有关memcached企业面试案例讲解 1.Memcached是什么,有什么作用? a. memcached是一个开源的.高性能的内存的缓存软件,从名称上看Mem就是内存的意思,而Cache就是 ...
- PHPCMS v9构建模块 - 实例之企业服务模块
下面开始第一个实例,企业服务模块,这是个比较简单的模块,做一个抛砖的作用. 模块功能分析:企业服务,企业填写招聘申请表,管理审核之后,展示作为招聘通知的功能. ■1.文件分布 modules文 ...
- ESB 企业服务总线
整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David . @肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验.曾参和设计和开发基 ...
- 企业服务总线ESB
# 企业服务总线ESB 由中间件技术实现并支持SOA的一组基础架构,支持异构环境中的服务.消息以及基于事件的交互,并且具有适当的服务级别和可管理性. 通过使用ESB,可以在几乎不更改代码的情况下,以一 ...
- 企业服务的3种模式:On-Premise、SaaS、Mixed,该选哪种?--创业邦
B轮融资二三事 我们从9月份开始启动B轮融资,与这些颇具洞察力的投资人聊天,是非常有挑战的事.他们的很多观点充满智慧,能帮你突破思考局限,受益良多.当然,整个过程虽然有趣但也不轻松,毕竟你的目的是完成 ...
- 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能
完全国人自主研发原创的智能软件路由器即将发布: 完全国人自主研发原创的智能软件路由器BDS即将发布,附带企业服务总线ESB功能 智能软件路由器 BDS 简要介绍 http://kan.weibo.co ...
- [网站日志]当Memcached缓存服务挂掉时性能监视器中的表现
我们用的Memcached缓存服务是阿里云OCS,今天晚上遇到了一次OCS挂掉的情况(计划中的升级),看一下性能监视器中的表现,也许对分析黑色1秒问题有帮助. 应用日志中错误: 2014-06-05 ...
- [转载]Memcached缓存服务的简单安装
1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...
- 七牛云杜江华:让云 + AI 成为企业服务的标配
12 月 5-6 日,2018 创业邦 100 未来领袖峰会暨创业邦年会(以下简称「创业邦 100 未来领袖峰会」)在北京国家会议中心举行.12 月 5 日下午,七牛云执行副总裁杜江华在企业服务论坛上 ...
随机推荐
- git 常见错误
1.pack exceeds maximum allowed size 解决办法:git config http.postBuffer 52428800
- JS高级学习笔记(6)- 事件循环
参考文章:深入理解JS引擎的执行机制 JavaScript 异步.栈.事件循环.任务队列 我的笔记:ES系列之Promise async 和 await Event Loop 前提 js ...
- 201812-2 小明放学 Java
思路: 红绿灯每种灯亮划分区间,在[0,r]区间内红灯亮,在(r,g+r]区间内绿灯亮,在(r+g,r+g+y]区间内黄灯亮,在划分好区间后只需要判断当小明到达红绿灯时是哪个灯在亮,就可以判断出通过红 ...
- SpringBoot学习(四)——配置文件占位符
RandomValuePropertySource:配置文件中可以使用随机数 ${Random.value} ${random.int}, ${random.long}, ${random.int( ...
- redis常用命令--基础
redis默认有个数据库,下标从开始,不支持自定义数据库名字. 使用select index 切换数据库 : select 7 (切换到第八个数据库) dbsize:求当前数据库中键值对的数量. ...
- 运行xv6
我们使用Qemu在Ubuntu下运行 1. 安装Qemu sudo apt-get install qemu 执行 qemu-system-i386 ,如果弹出Qemu界面说明安装成功了 2. 编译x ...
- 瑞士军刀DLib的VS2015编译
Dlib的官方解释是: Dlib is a modern C++ toolkit containing machine learning algorithms and tools for creati ...
- 【每日Scrum】第七天冲刺
一.计划会议内容 界面ui制作,主界面进度 二.任务看板 三.scrum讨论照片 四.产品的状态 无 五.任务燃尽图
- kali由wifi握手包破解密码&&gnuplot使用
1.kali密码破解(WiFi握手包) cap包密码破解,aircrack-ng wifi.cap -w psw.txt(你的字典文件) 2.画图工具gnuplot 1.txt中保存的是坐标,形式为: ...
- i春秋2020新春公益赛WP
Re Factory 主函数fork了一个子进程,父进程添加了一个信号处理器用于比对input,然后死循环挂起.子进程读入input,然后调用了关键函数. 跟进关键函数,发现是从一段内存中读取数据,然 ...