1、介绍
(1)说明
Memcached是分布式的,基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序。Memcached使用libevent库实现网络连接服务,理论上可以处理无限多的连接,但是它和Apache不同,它更多的时候是面向稳定的持续连接的,所以它实际的并发能力是有限制的。在保守情况下memcached的最大同时连接数为200,这和Linux线程能力有关系,这个数值是可以调整的。
memcachd有自己的内存分配算法和管理方式,通常情况下,每个memcached进程可以管理2GB的内存空间,如果需要更多的空间,可以增加进程数。
(2)本地缓存与memcached
Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。
在之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共享内存方式都和直接数组差不多。可见,如果只是本地级缓存,使用memcached是非常不划算的。
(3)作为cache
Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。
memcached使用内存管理数据,所以它是易失的,当服务器重启,或者memcached进程中止,数据便会丢失,所以memcached不能用来持久保存数据。
应用上,memcached可作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。
(4)性能
memcached使用内存并不会得到成百上千的读写速度提高(跟硬盘相比)。它和使用磁盘的数据库系统相比,好处在于没有过多的io开销,进程本身也不占用多少cpu资源,利于处理非常大的数据交换量。
实际瓶颈在于网络连接,所以经常会出现两条千兆网络带宽都满负荷了。
2、工作方式
(1)守护进程
Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行。
创建守护进程,代码如下(daemon.c,版本1.2.1):
fork 子进程,退出父进程,重定向 到空设备文件(STDIN 、 STDOUT 、 STDERR )
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int daemon(int nochdir, int noclose)
{
int fd;
switch (fork()) {
case -1://fork错误
return (-1);
case 0: //子进程
break;
default://父进程
_exit(0);
}
//调用setsid函数的进程成为新的会话的领头进程,并与其父进程的会话组和进程组脱离。
//由于会话对控制终端的独占性,进程同时与控制终端脱离
if (setsid() == -1)
return (-1);
if (!nochdir)//设置当前目录到根目录
(void)chdir("/");
if (!noclose && (fd = open("/dev/null", O_RDWR, 0)) != -1) {//获取空设备文件句柄
(void)dup2(fd, STDIN_FILENO);//重定向STDIN到空设备文件
(void)dup2(fd, STDOUT_FILENO);//重定向STDOUT到空设备文件
(void)dup2(fd, STDERR_FILENO);//重定向STDERR到空设备文件
if (fd > STDERR_FILENO)
(void)close(fd);
}
return (0);
}
(2)启动过程
main 函数中执行步骤(memcached.c):
1>调用 settings_init() 设定初始化参数2 >从启动命令中读取参数来设置 setting 值
3 >设定 LIMIT 参数
4 >开始网络 socket 监听(如果非 socketpath 存在)(1.2 之后支持 UDP 方式)
5 >检查用户身份( Memcached 不允许 root 身份启动)
6 >如果有 socketpath 存在,开启 UNIX 本地连接(Sock 管道)
7 >如果以 -d 方式启动,创建守护进程(如上调用 daemon 函数)
8 >初始化 item 、 event 、状态信息、 hash 、连接、 slab
9 >如设置 managed 生效,创建 bucket 数组
10> 检查是否需要锁定内存页
11 >初始化信号、连接、删除队列
12 >如果 daemon 方式,处理进程 ID
13 >event 开始,启动过程结束, main 函数进入循环。
启动方式
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,这里是10MB,
-u是运行Memcache的用户,这里是root,
-l是监听的服务器IP地址,如果有多个地址的话,这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,这里设置了12000ÿ