Xmemcached的FAQ和性能调整建议

  一些常见的关于xmemcached的问题,收集整理,集中解答在此。事实上这里的大部分问题都可以在用户指南里找到。

一、XMemcached是什么?
经常碰到的一个问题是很多朋友对memcached不了解,误以为xmemcached本身是一个缓存系统。Memcached是一个开源的,C写的分布式key-value缓存,XMemcached只是它的一个访问客户端。Memcached通过网络协议跟客户端交互,通过客户端你才可以去使用memcached,xmemcached是它的java客户端之一。

二、为什么要选择xmemcached?

memcached的java客户端有多个选择,为什么要选择xmemcached?理由如下:

1、支持所有的文本协议和二进制协议,支持连接KestrelTokyoTyrant等memcached协议兼容的系统并作特殊处理。
2、支持动态添加和删除memcached节点。
3、支持客户端统计
4、支持JMX监控和统计,可以通过JMX增删节点。
5、高性能
6、支持节点的权重设置
7、支持nio的连接池,在高负载环境下提高吞吐量。

三、对jdk版本有什么要求?

Xmemcached仅支持jdk1.5及以上版本。

四、使用的时候需要创建多个MemcachedClient对象吗?MemcachedClient是不是线程安全?

MemcachedClient是线程安全的,由于xmemcached的网络层实现是基于nio长连接的,因此你并不需要重复创建多个MemcachedClient对象,通常来说将MemcachedClient设置为全局的唯一单例的服务使用,如果是使用spring配置,那更是简单,在spring配置文件里配置一个MemcachedClient,其他对象引用即可使用。

五、为什么会抛出java.util.TimeoutException?

这是由于xmemcached的通讯层是基于非阻塞IO的,那么在请求发送给memcached之后,需要等待应答的到来,这个等待时间默认是1秒,如果超过1秒就抛出java.util.TimeoutExpcetion给用户。如果你频繁抛出此异常,可以尝试将全局的等待时间设置长一些,如我在压测中设置为5秒:

MemcachedClient  memcachedClient=……
memcachedClient.setOpTimeout(5000L);

请注意,setOpTimeout设置的是全局的等待时间,如果你仅仅是希望将get或者set等操作的超时延长一点,那么可以通过这些方法的重载方法来使用:

<T> T get(java.lang.String key,long timeout)

boolean set(java.lang.String key, int exp,java.lang.Object value,
            long timeout)

……

六、Kestrel和TokyoTyrant不支持flag字段,xmemcached是怎么解决的?

Xmemcached在存储的value前面自动加上和去除4个字节的flag,这一切对应用来说是透明的。具体请看用户指南。


七、连接memcacheq,取出来的消息比放进去的多?

这是由于memcacheq和kestrel一样,不支持multi get协议,因此只要关闭xmemcached的multi get优化就可以了。

memcachedClient.setOptimizeGet(false);

所谓multi get优化是指xmemcached会将连续的单个get请求合并成一个multi get请求作批量获取,提高效率。

八、连接kestrel,为什么过一段时间会自动断开并重连?

你可能使用的是kestrel 1.2以下版本,kestrel 1.2才支持version协议,xmemcached是基于version协议做心跳检测,因此当使用kestrel 1.2以下版本的时候会发生心跳检测失败并断开连接重连的情况,你可以升级kestrel,也可以关闭心跳检测:

memcachedClient.setEnableHeartBeat(false);

九、我使用maven,怎么引用xmemcached?

xmemcached 1.2.5已经加入了maven的中心仓库,因此你可以直接引用

  <dependency>
      <groupId>com.googlecode.xmemcached</groupId>
      <artifactId>xmemcached</artifactId>
      <version>1.2.5</version>
 </dependency>

如果是之前版本,我推荐你升级,或者自己手工加入私人的maven仓库。

十、连接池是怎么回事?设置多大为好?

在高负载环境下,nio的单连接也会遇到瓶颈,此时你可以通过设置连接池来让更多的连接分担memcached的请求负载,从而提高系统的吞吐量。设置连接池通过

MemcachedClientBuilder builder = new    XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000"));

builder.setConnectionPoolSize(5);
MemcachedClient client=builder.build();

或者通过spring配置也可以。

连接池通常不建议设置太大,我推荐在0-30之间为好,太大则浪费系统资源,太小无法达到分担负载的目的。

十一、性能建议及优化手段

    性能的调整只能给出一般性的原则,实际情况千差万别,每次调整都需要做实际的测量才能确定是否带来期望的效果。

1、如果你的数据较小,如在1K以下,默认的配置选项已经足够。如果你的数据较大,我会推荐你调整网络层的TCP选项,如设置socket的接收和发送缓冲区更大,启用Nagle算法等等:   

            MemcachedClientBuilder builder = new XMemcachedClientBuilder(
                    AddrUtil.getAddresses(servers));
            builder.setSocketOption(StandardSocketOption.SO_RCVBUF, 32 * 1024); // 设置接收缓存区为32K,默认16K
            builder.setSocketOption(StandardSocketOption.SO_SNDBUF, 16 * 1024); // 设置发送缓冲区为16K,默认为8K
            builder.setSocketOption(StandardSocketOption.TCP_NODELAY, false); // 启用nagle算法,提高吞吐量,默认关闭

默认如果连接超过5秒没有任何IO操作发生即认为空闲并发起心跳检测,你可以调长这个时间: 

  builder.getConfiguration().setSessionIdleTimeout(10000);  // 设置为10秒;

更多网络层配置选项请参见Configuration类。

2、Xmemcached默认会做两个优化:将连续的单个get合并成一个multi get批量操作获取,将连续的请求合并成socket发送缓冲区大小的buffer发送。
如果你对响应时间比较在意,那么可以将合并的因子减小,或者关闭合并buffer的优化:

    memcachedClient.setMergeFactor(50);   //默认是150,缩小到50
    memcachedClient.setOptimizeMergeBuffer(false);  //关闭合并buffer的优化

如果你对吞吐量更在意,那么也可将合并因子调大,默认是150。但是也不可太大,太大可能导致平均响应时间延长。

3、如果你对心跳检测不在意,也可以关闭心跳检测,减小系统开销

memcachedClient.setEnableHeartBeat(false);

这个关闭,仅仅是关闭了心跳的功能,客户端仍然会去统计连接是否空闲,禁止统计可以通过:

builder.getConfiguration().setStatisticsServer(false);

文章转自庄周梦蝶  ,原文发布时间2010-07-08

时间: 2024-10-03 04:02:33

Xmemcached的FAQ和性能调整建议的相关文章

websphere应用服务器性能调整建议,针对运行一段时间后当机

最近项目的websphere经常当机,运行一段时间后变慢然后当掉.查找了下网上的资料,尽管不是我在负责服务器,但是也是个学习的机会. 主要针对的症状:           平台:was5.1   base,http   server   1.3.28,oracle   8i,9i           症状:用户响应突然变慢,然后并连接不上80端口,重启后正常,一段时间后反复           解决方式:调整服务器参数,增加服务器的处理能力               1,更改http   se

ORA FAQ 性能调整系列之——Oracle 9与Oracle 8中CPU

oracle|性能 What is the difference between cpu_costing in Oracle 9 and the old costing of Oracle 8 ?Oracle 9与Oracle 8中CPU_COSTING有什么变化? Author's name: Jonathan LewisAuthor's Email: Jonathan@jlcomp.demon.co.ukDate written: 15th Dec 2002 Oracle version(s

ORA FAQ 性能调整系列之——当索引第一列由序列产生,一个逆序索引有什么用?

索引|性能 ORA FAQ 性能调整系列之--The Oracle (tm) Users' Co-Operative FAQWhy would a reverse index be useful when the leading column of the index is generated from a sequence ?当索引第一列由序列产生,一个逆序索引有什么用?--------------------------------------------------------------

Docker最新安全性能调整分析

本文讲的是Docker最新安全性能调整分析,[编者的话]作者通过对Docker的最新安全更新的深入分析与探索,总结了四条有关Docker安全更新的调整建议,包括调整能力.调整SELinux的标签.多级安全模式.调整命名空间. 自我发表前两篇有关Docker安全系列的文章之后,至今已有一段时间.本文更新了自那以后有关Docker的新增内容,并且介绍了全新功能,其中涵盖了与上游Docker的合并过程. 调整能力 在前面的文章中,我介绍了基于Linux功能的容器分离. 借助Linux功能,你可以分离根

《Scala机器学习》一一3.5 Spark的性能调整

3.5 Spark的性能调整 虽然数据管道的高效执行是任务调度器优先考虑的,这是Spark驱动的一部分,有时Spark需要人为给出一些提示.Spark调度主要与两个参数有关:CPU和内存.当然其他资源(如磁盘和网络I/O)也在Spark性能方面发挥重要作用,但目前Spark.Mesos或YARN都不能主动管理它们. 要监控的第一个参数是RDD的分区数,可以从文件中读取RDD时明确指定.常见的Spark错误是分区太多,这样做需要提供更多的并行性.当任务开始/结束时间相对较小的情况下,这样做也可以工

Oracle性能调整的三把利剑--ASH,AWR,ADDM

Oracle性能调整的三把利剑--ASH,AWR,ADDM ASH (Active Session History)ASH以V$SESSION为基础,每秒采样一次,记录活动会话等待的事件.不活动的会话不会采样,采样工作由新引入的后台进程MMNL来完成.ASH buffers 的最小值为1MB,最大值不超过30MB.内存中记录数据.期望值是记录一小时的内容. 生成ASH报告:SQLPLUS>@?/rdbms/ashrpt.sql ASH内存记录数据始终是有限的,为了保存历史数据,引入了自动负载信息

Servlet和JSP 性能调整技术

js|servlet|性能 概述 在本文中, Rahul Chaudhary将描述性能调整技术 (PTT performance-tuning techniques) 的使用,来提升servlets 和JSP 的性能,以此来提升你的J2EE应用的性能.笔者假设读者具有基础的servlets 和JSPs知识. 你的J2EE应用程序运行缓慢么?它们可以满足足够的压力么?本文将会描述如何在开发高性能的应用和JSP以及servlets中使用性能调整技术 (PTT performance-tuning t

InnoDB 中文参考手册 --- 9 性能调整技巧

参考|参考手册|技巧|性能|中文 InnoDB 中文参考手册 --- 犬犬(心帆)翻译 9 性能调整技巧(Performance tuning tips)1. 如果 Unix top 或 Windows 任务管理器(Task Manager) 显示服务的 CPU 占用率小于 70%,(shows that the CPU usage percentage with your workload is less than 70 %,)你的系统瓶颈可能在磁盘读写上.或许你提交了大量的事务,或者是缓冲池

Oracle性能调整的指导纲要

讲优化时大致写的一个提纲,内容分db的物理设计和逻辑设计,主要以物理设计为主,逻辑设计介绍的内容不多,提纲里把物理结构设计和实例优化有机的结合在一起,把逻辑结构设计和应用调整结合在一起...... Oracle性能调整指导纲要 数据库物理结构设计和实例级别的调整 一.Oracle性能优化方法论 1.为什么(what)要优化(系统慢了?慢是表象) 2.怎样(how)优化?(需要找到慢的原因) a.是系统的问题? b.是数据库的问题? 3.谁(who)来优化? a.系统架构师(系统架构设计的有问题,