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