Memcached分析特点

Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。 

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ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值