问题:
最近测试服务器老是报memcached连接超时的错误:
Operation timed out. - failing node: /xx.xx.xx.xx:11211
检查网络,进程又都没问题。因为是三个tomcat共用一个memcached,于是想起是不是并发太大造成的等待超时。于是自己搭环境测试一下。
memcached官网下载:http://memcached.org/downloads
测试使用版本:memcached-1.4.20 + spymemcached-2.9.0
采用并发线程进行测试:
2000个线程 × 每个线程10次操作(get/put),运行没问题,没有出异常。因为10次get/put操作是很快的,可能达不到并发的效果,于是改为:
2000个线程 × 每个线程100次操作(get/put),终于运行1-2秒没问题,后面开始狂报异常:
Exception in thread "Thread-1913" java.lang.RuntimeException: Exception waiting for value
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1130)
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1148)
at memcached.MemcachedDao.get(MemcachedDao.java:38)
at memcached.StressTest$Get.run(StressTest.java:68)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.util.concurrent.ExecutionException: net.spy.memcached.internal.CheckedOperationTimeoutException: Operation timed out. - failing node: /10.12.256.156:11211
at net.spy.memcached.internal.OperationFuture.get(OperationFuture.java:173)
at net.spy.memcached.internal.GetFuture.get(GetFuture.java:62)
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1123)
... 4 more
Caused by: net.spy.memcached.internal.CheckedOperationTimeoutException: Operation timed out. - failing node: /10.12.256.156:11211
... 7 more
memcached启动服务时,有个参数是表示“并发连接数”的,默认是 1024 ,于是改大这个参数重启服务:
#./memcached -d -u root -m 1024 -c 2048
再进行测试,发现没有报错了,于是重启memcached服务,改小并发连接数,再测试又开始报错了,呵呵,大概原因就是并发太大,等待超时了吧。
解决:
1、改动“并发连接数”参数,调到满足系统并发量。
2、memcached集群,集群的时候需要用到“一致性哈希算法”。
总结:
这个超时异常的原因之一是并发量太大造成的,遇到这个异常不妨往这个方面思考下。欢迎补充其他原因。
memcached超时异常