memcached 异常 : 单数据项超过默认值1m

众所周知,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。

最近自己开发的一个小网站www.dmvcd.com也使用上了它.主要是用于保存动漫和漫画信息,可以方便快速查询和搜索,减少DB交互,以提高搜索性能.

但是最近发生了异常,虽然不会导致网站挂掉,但是对数据方面还是有影响的.异常信息如下:

[2015-05-2411:36:46]ERROR~Error:Toolarge.

[2015-05-2411:36:46]INFO~Reconnectionduetoexceptionhandlingamemcachedoperationon{QAsa=localhost/127.0.0.1:11211,#Rops=1,#Wops=2,#iq=0,topRop=Cmd:1Opaque:10Key:source_comics_1_v1Cas:0Exp:3600Flags:3DataLength:1063648,topWop=Cmd:1Opaque:10Key:source_comics_1_v1Cas:0Exp:3600Flags:3DataLength:1063648,toWrite=786434,interested=5}.Thismaybeduetoanauthenticationfailure.

OperationException:SERVER:Toolarge.

atnet.spy.memcached.protocol.BaseOperationImpl.handleError(BaseOperationImpl.java:164)

atnet.spy.memcached.protocol.binary.OperationImpl.getStatusForErrorCode(OperationImpl.java:211)

atnet.spy.memcached.protocol.binary.OperationImpl.finishedPayload(OperationImpl.java:173)

atnet.spy.memcached.protocol.binary.OperationImpl.readFromBuffer(OperationImpl.java:162)

atnet.spy.memcached.MemcachedConnection.handleReads(MemcachedConnection.java:463)

atnet.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:380)

atnet.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:242)

atnet.spy.memcached.MemcachedConnection.run(MemcachedConnection.java:833)

[2015-05-2411:36:46]WARN~Closing,andreopening{QAsa=localhost/127.0.0.1:11211,#Rops=1,#Wops=2,#iq=0,topRop=Cmd:1Opaque:10Key:source_comics_1_v1Cas:0Exp:3600Flags:3DataLength:1063648,topWop=Cmd:1Opaque:10Key:source_comics_1_v1Cas:0Exp:3600Flags:3DataLength:1063648,toWrite=786434,interested=5},attempt0.

[2015-05-2411:36:46]INFO~Nobufferforcurrentwriteop,removing

[2015-05-2411:36:46]WARN~Discardingpartiallycompletedop:Cmd:1Opaque:10Key:source_comics_1_v1Cas:0Exp:3600Flags:3DataLength:1063648

[2015-05-2411:36:48]INFO~Reconnecting{QAsa=localhost/127.0.0.1:11211,#Rops=0,#Wops=1,#iq=0,topRop=null,topWop=Cmd:1Opaque:11Key:source_comics_2_v1Cas:0Exp:3600Flags:1DataLength:58,toWrite=0,interested=0}

从异常信息来看,在保存数据到memcached时,数据量过大1063648字节(超过了1m),只写了786434字节),导致部分数据没写成功.初步怀疑是保存的数据量过大,那么memcached应该是可以调整这个大小的(因为我没有在启动memcached的参数中,增加调整单据项大小的参数,所以使用的还是memcached的默认值)

解决方案:

在memcached启动参数中,调整单个数据项的最大值,由默认值1m调整为2m:-I2m

这里,顺便把memcached的启动参数和状态作一个简单的记录,以便以后查阅:

1.参数说明(注意大小写):

-d启动一个守护进程

-p是设置Memcache监听的端口,推荐1024以上的端口

-s<file>用于监听的UNIX套接字路径(禁用网络支持)

-a<mask>UNIX套接字访问掩码,八进制数字(默认:0700)

-m分配给Memcache的最大内存数量,单位是MB,默认64MB

-t线程数,默认为4

-c选项是最大运行的并发连接数,默认是1024

-f块大小增长因子,默认是1.25

-n<bytes>最小分配空间,key+value+flags默认是48

-k锁定所有内存页。注意你可以锁定的内存上限。

-l绑定的ip地址,可以设置内外网IP,如果设置为外网IP,则要注意安全隐患.如果设置为127.0.0.1,则只有本机能访问

-dstart启动memcached服务

-drestart重起memcached服务

-dstop|shutdown关闭正在运行的memcached服务

-u指定运行Memcache的用户,只有root用户才能使用这个参数

-v提示信息(在事件循环中打印错误/警告信息。)

-vv详细信息(还打印客户端命令/响应)

-vvv超详细信息(还打印内部状态的变化)

-h打印这个帮助信息并退出。

-i打印memcached和libevent的许可。

-U<num>UDP监听端口(默认:11211,0时关闭)

-P设置保存Memcache的pid文件,需要与-d一起使用.

-M内存耗尽时返回错误,而不是删除项

-L尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。www.2cto.com

为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。

-D<char>使用<char>作为前缀和ID的分隔符。

这个用于按前缀获得状态报告。默认是":"(冒号)。

如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"statsdetailon"来开启。

-R每个连接可处理的最大请求数。

-C禁用CAS。

-b设置后台日志队列的长度,默认为1024

-B绑定协议-可能值:ascii,binary,auto(默认)

-I重写每个数据页尺寸。调整数据项最大尺寸,默认为1m,最小是1K,最大值128M

2.memcached连接测试

telnet127.0.0.111211

如果能连接上,说明memcached运行正常,如果要查看memcached运行状态,则需要使用命令stats来查看:

STATpid25587进程ID

STATuptime419763服务器运行秒数

STATtime1432439858服务器当前unix时间戳

STATversion1.4.4服务器版本

STATpointer_size64操作系统字大小(这台服务器是64位的)

STATrusage_user13.125004进程累计用户时间

STATrusage_system25.086186进程累计系统时间

STATcurr_connections11当前打开连接数

STATtotal_connections25曾打开的连接总数

STATconnection_structures12服务器分配的连接结构数

STATcmd_get134524执行get命令总数

STATcmd_set1081执行set命令总数

STATcmd_flush7指向flush_all命令总数

STATget_hits132495get命中次数

STATget_misses2029get未命中次数

STATdelete_misses0delete未命中次数

STATdelete_hits0delete命中次数

STATincr_misses0incr未命中次数

STATincr_hits0incr命中次数

STATdecr_misses0decr未命中次数

STATdecr_hits0decr命中次数

STATcas_misses0cas未命中次数

STATcas_hits0cas命中次数

STATcas_badval0使用擦拭次数

STATauth_cmds0

STATauth_errors0

STATbytes_read144972396读取字节总数

STATbytes_written4772215913写入字节总数

STATlimit_maxbytes67108864分配的内存数(字节)

STATaccepting_conns1目前接受的链接数

STATlisten_disabled_num0

STATthreads4默认线程数

STATconn_yields0

STATbytes1155631存储item字节数

STATcurr_items0item个数

STATtotal_items1081item总数

STATevictions0为获取空间删除item的总数

3.memcached命中率:

memcached命中率=get_hits/cmd_get,也可以是命中率=get_hits/(get_hits+get_misses).(我网站使用的memcached的命中率为98.49%,还可以.呵呵...)

4.memcached启动参数使用举例:

/usr/bin/memcached-d-m68-uroot-l192.168.5.80-p11222-c256-I2m-P/tmp/memcached.pid

相关推荐