关于Memcached的CAS和Set方法造成Socket泄漏的问题
为了解决多并发下写Memcached的冲突方案,我们项目组引入了CAS机制。类同于Java并发包中的CAS(Compareand set)原子操作,用来处理同一个Item被多个线程更改的并发问题。Memcached的CAS是原理是引入版本概念,每一个存储数据对象都有一个64bit长度的数值作为该key相应value的版本。详细使用代码例如以下:
// 此方法不同于get方法 获取MemcachedItem对象
MemcachedItem item = mc.gets(key);
mc.cas(key, item.getValue() + String.valueOf(sleep), item.getCasUnique());
在项目中对于单线程的场景。我们就使用了Memcached的Set方法。可是在项目耐久性測试过程中,我们发现站点后台管理server的Weblogic进程的句柄数在不断的添加。在Weblogic进行安全备份时,触发了一错误,并造成兴许的线程都Too many open files了。
相关错误信息例如以下:
<2015-5-30 下午11时05分16秒 CST> <Critical> <EmbeddedLDAP> <BEA-000000> <java.io.FileNotFoundException: /weblogic/Oracle/Middleware/user_projects/domains/shch_domain1/servers/shchbdf1/data/ldap/backup/EmbeddedLDAPBackup.zip (Too many open files)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:194)
at java.io.FileOutputStream.<init>(FileOutputStream.java:84)
at com.octetstring.vde.backend.standard.BackupTask.runTask(BackupTask.java:55)
我们通过命令检查了未关闭的句柄,详细未关闭的句柄例如以下。我们知道socke通讯中can’t identify protocol是因为server异常中断socket通讯后,并未通知client。造成的client句柄不释放。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2F2aW5sb28=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
我们知道应用和Memcached直接的通讯是使用NIO的Socket通讯。socket是连接是会产生句柄数的。可是正常关闭通道。句柄是会释放的。除非socket通道被非正常关闭。
从这个角度出发,我们对项目代码和异常场景进行了梳理。首先,仅仅有后台管理的进程会产生句柄数添加。而前台的集群报价系统多台server上都未发生这样的情况。
分析后台管理代码,有一个定时任务去定时更新Memcached的值,由于是单线程,使用的是Set方法。
可是这个set方法和报价的CAS方法都是对通过值进行改动,依据直觉推断是set方法和CAS方法在同一时候对一个值进行改动时,假设正好同一时候触发了,set方法的改动不成功。Memcached自己主动断开set值得连接,而未通知client,造成socket泄漏。
我们把Memcached的Set方法改动成CAS后。问题解决。
最新文章
- channel Golang
- 动态创建 Lambda 表达式
- Hadoop学习笔记—15.HBase框架学习(基础实践篇)
- 网页中的<;th>;<;/th>;是什么意思
- iOS开发零碎知识点
- 在.net中使用aquiles访问Cassandra(一)
- Java的jar文件安装成windows 服务
- ashx 文件 与js文件数据交互
- openstack命令
- 运行Android应用时提示ADB是否存在于指定路径问题
- 今天工作遇到要发短信(ios)的功能,于是随手记录了一下
- springMVC从上传的Excel文件中读取数据
- visual studio 中GIT的用法
- Lake Counting (POJ No.2386)
- 2015-12-27 socket的用法
- 随手记UIKit Dynamics
- Django_xadmin_应用外键搜索功能错误
- jquery pjax 用法总结
- ibm云时代的转型
- 后台管理系统好用的UI框架