`
hyj_dx
  • 浏览: 101382 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

1、客户端在与 memcached 服务建立连接之后,进行存取对象的操作,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

2、当存入cached的数据超过了cached的容量后会将最长时间没调用的对象挤出,这正好应征了cached的特征。

3、利用memcached常用的做法:在每取得一次cached对象后,重新设置这个对象的cache时间,这样能够使得经常被调用的对象可以长期滞留在缓存中,使得效率增倍。

 

memcached 技术配置参数研究

failover表示对于服务器出现问题时的自动修复。
initConn初始的时候连接数,
minConn表示最小闲置连接数,
maxConn最大连接数,
maintSleep表示是否需要延时结束
nagle是TCP对于socket创建的算法,
socketTO是socket连接超时时间,
aliveCheck表示心跳检查,确定服务器的状态。
Servers是memcached服务端开的地址和ip列表字符串,
weights是上面服务器的权重,必须数量一致,否则权重无效
可从以下几方面考虑优化
1. 重新设置配置参数。
2. 尽量使用小容量的数据内容.
3. 增加memcached提高服务获取的内存总量、提高命中率。
4. 可以采用多个memcache服务进行侦听,分开处理,针对服务提供的频繁度划分服务内存
5. 根据服务器的性能不同设置权重 weights
6. 对需要使用memcache服务的机器ip,服务端做访问限制。
避免memcached里的数据不会被别有心意的人再利用,或责保证服务器的内存不被漫天遍地的垃圾数据所堆积,造成命中极低
7. 优化memcached客户端的代码。
1. synchronized 的问题
java memcached client源文件的大量方法里面都直接使用 synchronized 如 getConnection(), checkin() 等,而SockIOPool类似一个Singleton, 因此造成多线程失去了意义。同时 synchronized 方法里面又大量使用了 Hashtable 等synchronized保护的集合类。

2. InputStream 不优化的用法:

未加Buffer
private DataInputStream in = new DataInputStream( sock.getInputStream() );

一次读一字节
while (in.read(b, 0, 1) != -1)...
虽然说局域网的网速不存在问题,但是这样操作的话速度可想而知。


#59.151.6.168:11213 Field       Value
                   bytes   965623799
              bytes_read 22404152833
           bytes_written 238164862015
                 cmd_get   212516055
                 cmd_set    74288082
   connection_structures        1351
        curr_connections         316
              curr_items     4943569
               evictions       49964
                get_hits   102206841
              get_misses   110309214
          limit_maxbytes  1073741824
                     pid        3825
            pointer_size          32
           rusage_system 358294.510000
             rusage_user 16239.670000
                 threads           1
                    time  1209023021
       total_connections      135815
             total_items    74288082
                  uptime    20711187
                 version       1.2.2

0.48

179==2008.05.04 统计
stats
STAT pid 4355
STAT uptime 5004865
STAT time 1209866040
STAT version 1.2.2
STAT pointer_size 32
STAT rusage_user 197.590000
STAT rusage_system 587.010000
STAT curr_items 741989
STAT total_items 3158492
STAT bytes 922004468
STAT curr_connections 20
STAT total_connections 1380
STAT connection_structures 52
STAT cmd_get 3239347
STAT cmd_set 3158492
STAT get_hits 1765546
STAT get_misses 1473801
STAT evictions 1
STAT bytes_read 3731783494
STAT bytes_written 2126404906
STAT limit_maxbytes 1073741824
STAT threads 1
END

0.54


memcached 1.2.0
-p <num>            port number to listen on
-s <file>               unix socket path to listen on (disables network support)
-l <ip_addr>        interface to listen on, default is INDRR_ANY
-d                          run as a daemon
-r                           maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num>          max memory to use for items in megabytes, default is 64 MB
-M                         return error on memory exhausted (rather than removing items)
-c <num>            max simultaneous connections, default is 1024
-k                          lock down all paged memory
-v                          verbose (print errors/warnings while in event loop)
-vv                        very verbose (also print client commands/reponses)
-h                         print this help and exit
-i                          print memcached and libevent license
-b                         run a managed instanced (mnemonic: buckets)
-P <file>             save PID in <file>, only used with -d option
-f <factor>          chunk size growth factor, default 1.25  growth factor //chunk 块 增长系数
-n <bytes>         minimum space allocated for key+value+flags, default 48
                                  分配
尝试:
启用了PHP memcache_set()函数中的 MEMCACHE_COMPRESSED压缩选项,而memcache_get()可以在后续读取过程中自动对压缩的缓存对象进行解压缩。

效果:
测试了一下,对于博客大巴目前的应用来说,启用压缩后,相同的容量(2G)存储的对象数量增加了约一倍,缓存命中率从50%左右,提高到了60%左右。进一步提高命中率硬件投入还是必须的,又增加了2倍的内存后终于做到了缓存命中率提高到90%;

前提0: 内存缓存有用,且命中率值得提升;
从60%提高到90%,还是从90%提高到95%,要看hit后的性能能够提升是否值得;

前提1:MemCached已经用满
先用memcached-tool查看一下memcached的容量统计,看memcached是不是已经用满了。如果充分运行时MemCached的空间尚未用满,启用一下压缩是没有意义的; 而且:发现没有用满的MemCached,最好减少相应MemCached的容量,空余出更多内存给其他服务做缓存;

前提2: 压缩率
缓存的数据的确有大于几百字节的,如果都是小于100字节的键值对,压缩可能反而带来膨胀。由于缓存对象的大小在Memcached中都是按照固定大小分块存储的,最小也要88 B。所以对于过小数据带来的压缩膨胀并不是太大的问题;

前台应用的CPU损耗:
对数据的额外压缩CPU损耗远远低于缓存命中率提升减少后台数据库访问带来的性能提升,和http的gzip/deflate压缩类似,压缩后数据一般为原数据大小的30%左右,节省了70%的传输性能消耗所得会大于文件压缩带来的性能损耗;


#  Item_Size   Max_age  1MB_pages Count   Full?
  3     128 B   535047 s       1       2      no
  4     160 B  19734117 s     196 1284388     yes
  5     200 B  2753659 s     401 2102042     yes
  6     252 B  1135150 s     321 1335680     yes
  7     316 B  7923261 s       1    3318     yes
  8     396 B  9449969 s       1    2647     yes
  9     496 B  20639438 s     101  213502     yes
 10     620 B  20704497 s       1     509      no
 11     776 B  20711541 s       1     838      no
 12     972 B  20608682 s       1     642      no
 13     1.2 kB 15213297 s       1       7      no
Item_Size是我们储蓄实体大小的范畴
Max_age是所有实体存活的时间集合,单位是秒
Count是实体数目
1MB_pages?
 Full?是存贮空间满了没?

HTTP压缩对于纯文本内容可压缩至原大小的40%一下,从而提供60%以上的数据传输节约,虽然WEB服务器会因为压缩导致CPU占用的略微上升,但是可以节约大量用于传输的网络IO。对于数据压缩带来的用户浏览速度提升(让页面符合8秒定律),这点总体负载5%-10%上升是非常值得的。毕竟通过数据压缩会比通过不规范的HTML代码优化要方便得多。

 

7
7
分享到:
评论
2 楼 roger 2008-12-30  
maintSleep表示是否需要延时结束

lz用的wahlin的memcached client

这个应该是他维护socket pooling的间隔时间吧

另外请教lz有没有碰到wahlin memcached client在red hat下pipe资源泄露的问题?
1 楼 robbin 2008-12-26  
你是blogbus的程序员?这是你的原创?

相关推荐

    Memcached使用--使用

    **五、优化与监控** 1. **缓存策略**:根据业务需求选择合适的缓存策略,如LRU(最近最少使用)或LFU(最不常用)。 2. **过期时间**:合理设置数据的过期时间,避免数据长时间未更新造成内存浪费。 3. **性能...

    MemCached Cache Java Client封装优化历程.docx

    **Java 客户端封装与优化** 在实际使用中,通常会开发 Java 客户端库来封装 Memcached 的操作,提供更方便的 API。封装过程可能包括: 1. **连接池管理**:为了提高性能,客户端可以使用连接池管理多个到 ...

    Memcached实例与文档

    Java开发者可以使用各种库与Memcached进行交互,例如spymemcached。这个库提供了一个简单的API,允许Java应用程序轻松地存取数据到Memcached服务器。以下是一些关键操作: - 添加数据:`MemcachedClient.add(String ...

    Memcached 统计与监控

    例如,通过监控Memcached的各项指标,可以了解其内存使用情况、命中率、请求处理速度等关键性能指标,从而优化配置参数,提升系统整体性能。 #### 三、使用Telnet连接Memcached ##### 3.1 Telnet简介 Telnet是一...

    memcached使用说明.doc

    总的来说,Memcached 是一个强大而高效的缓存工具,对于需要优化数据库性能和实现分布式数据共享的系统,它是理想的选择。不过,在选择是否使用 Memcached 时,应根据实际应用的需求和架构来决定,避免不必要的系统...

    Memcached的封装优化及相关操作api

    **Memcached** 是一款高性能、分布式内存对象缓存系统,常用于加速动态Web应用,通过在内存中存储数据,减少数据库的访问...在实际项目中,结合具体需求对Memcached进行封装和优化,将使缓存系统的使用更加高效和便捷。

    查看、分析memcached使用状态

    通过两篇文章《Memcache 和 mysql 交互流程操作原理》和《让 memcached 和 mysql 更好的工作》,我们可以深入了解如何使用 Memcached 与 MySQL 配合工作。 为了监控和分析 Memcached 的运行状态,我们可以利用其...

    Memcached 原理和使用详解

    **Memcached的安装与使用**: 1. 安装Memcached通常涉及编译源代码并配置服务端。在大多数Linux发行版中,也可以通过包管理器(如apt-get或yum)进行安装。 2. 配置Memcached服务,包括设置监听端口、最大内存使用...

    danga memcached使用

    **标题:“danga memcached使用”** memcached是一款高性能、分布式内存对象缓存系统,它广泛应用于...理解其工作原理,掌握安装、配置和使用方法,以及通过源码学习,能帮助开发者更好地利用这一工具优化应用性能。

    java使用memcached demo

    在Java中,我们可以借助各种客户端库来与Memcached进行交互。本篇文章将深入探讨如何在Java项目中集成并使用Memcached。 1. **安装Memcached服务器** 在开始Java开发之前,首先需要在本地或服务器上安装Memcached...

    memcached缓存使用演示

    **Memcached缓存系统详解与应用实践** ...无论是快速响应高并发请求,还是优化数据库性能,Memcached都能提供有力的支持。在实践中,结合具体业务场景,合理运用缓存策略,能显著提升系统的整体性能。

    memcached使用最佳实践(英文版)

    本书详细介绍了如何利用Memcached这一高性能、分布式内存对象缓存系统来优化网站性能,解决大规模网络应用中的数据存储与访问瓶颈问题。以下是对该书部分关键知识点的深入解读。 ### 一、Memcached概述 #### 1.1 ...

    java使用Memcached简单教程

    ### Java使用Memcached简单教程 #### 一、简介 Memcached是一个高性能的分布式内存对象缓存系统,通过减轻数据库负载来加速动态Web应用,提高网站的浏览速度。它通过在内存中缓存数据和对象来减少读取数据库的次数...

    Memcached缓存机制 用好Cache,优化应用

    **三、使用Memcached优化应用** 1. **减少数据库查询**:将经常访问但更新不频繁的数据存储到Memcached中,避免每次请求都去数据库查找,显著提升性能。 2. **缓存预热**:在应用启动时,可以预先加载常用数据到...

    Memcached_程序与php中应用

    在PHP中,我们可以使用PHP Memcached扩展来与Memcached服务器进行交互。 **PHP Memcached扩展** PHP Memcached扩展提供了与Memcached服务器通信的功能。它支持多种操作,如设置、获取、删除键值对,以及检查键是否...

    memcached 64位 window

    "nginx.txt"可能是一个文档,描述了如何在Nginx web服务器上配置与Memcached的集成。Nginx是另一个流行的高性能HTTP和反向代理服务器,常用于构建高性能的Web服务。通过集成Memcached,Nginx可以缓存动态内容,减少...

    memcached安装及java应用使用memcached

    **标题解析:** “memcached安装及java应用使用...总结,本文应该涵盖了从安装memcached到在Java应用中使用它的全面指南,包括相关配置、操作、最佳实践和优化技巧,旨在帮助开发者充分利用memcached来提升应用性能。

    memcached安装包以及MemCachedClient

    **Memcached 安装与使用详解** Memcached 是一款高性能的分布式内存缓存系统,用于在Web应用中减轻数据库负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcached 使用简单,可...

Global site tag (gtag.js) - Google Analytics