为了解决多并发下写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后。问题解决。

关于Memcached的CAS和Set方法造成Socket泄漏的问题的更多相关文章

  1. 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)

    简介 从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本 ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个 ...

  2. (转)实战Memcached缓存系统(5)Memcached的CAS程序实例

    1. 非CAS 首先看一个不是CAS的Memcached程序实例.实例的问题原型,见上一篇博文. 程序实例: package com.sinosuperman.memcached; import ja ...

  3. (转)实战Memcached缓存系统(4)Memcached的CAS协议

    1. 什么是CAS协议 很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS ...

  4. Memcached(四)Memcached的CAS协议

    1. 什么是CAS协议很多中文的资料都不会告诉大家CAS的全称是什么,不过一定不要把CAS当作中国科学院(China Academy of Sciences)的缩写.Google.com一下,CAS是 ...

  5. Memcached 查看列出所有key方法

    Memcached没有一个比较简单的方法可以直接象Redis那样keys *列出所有的Session key,并根据key get对应的session内容,但是还是可以查看的 memcached 查看 ...

  6. java 多线程使用方法及Socket的使用

    public class newThread implements Runnable{ public void run(){ dosome(); } public void dosome(){ Sys ...

  7. AFNetworking 3.0中调用[AFHTTPSessionManager manager]方法导致内存泄漏的解决办法

    在使用AFNetworking3.0框架,使用Instruments检查Leaks时,检测到1000多个内存泄漏的地方,定位到 [AFHTTPSessionManager manager] 语句中,几 ...

  8. 【python】-- Socket粘包问题 ,解决粘包的几种方法、socket文件下载,md5值检验

    上一篇随笔:“socket 接收大数据”,在win系统上能够运行,并且解决了大数据量的数据传输出现的问题,但是运行在linux系统上就会出现如下图所示的情况: 就是服务端两次发送给客户端的数据(第一次 ...

  9. memcached 原子性操作 CAS模式

    2019独角兽企业重金招聘Python工程师标准>>> 应用场景分析: 如原来MEMCACHED中的KES的内容为A,客户端C1和客户端C2都把A取了出来,C1往准备往其中加B,C2 ...

随机推荐

  1. docker:安装mysql

    文章来源:https://www.cnblogs.com/hello-tl/p/9234429.html 1.添加镜像 docker pull mysql 2.在/data下新建文件夹mysql,进入 ...

  2. 第一章 pyhton基础

    一 .pyhton2与python3的区别 在pyhton2中,其中编码默认使用的是ascii编码,输出格式为print"xxx",输入为raw_input(“请输入”),在整型中 ...

  3. PAT Basic 1042

    1042 字符统计 请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空格组成,至少包 ...

  4. SQL Server on Red Hat Enterprise Linux

    本文从零开始一步一步介绍如何在Red Hat Enterprise Linux上搭建SQL Server 2017,包括安装系统.安装SQL等相关步骤和方法(仅供测试学习之用,基础篇). 一.   创 ...

  5. 彻底解决python cgi 编程出现的编码问题

    Answering this for late-comers because I don't think that the posted answers get to the root of the ...

  6. 九度oj 题目1256:找出两个只出现了一次的数字

    题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的第一行包括一个整数N(1<=N<=1000). 接下来的一行包括N个 ...

  7. shrio注解的方式进行权限控制

    除了通过API方式外,Shiro 提供Java 5+注解的集合,以注解为基础的授权控制.在你可以使用Java 注释之前,你需要在你的应用程序中启用AOP 支持. Shiro注解支持AspectJ.sp ...

  8. iOS学习笔记19-地图(一)定位CoreLocation

    一.定位介绍 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.要实现 ...

  9. [BZOJ3378] [Usaco2004 Open]MooFest 狂欢节(树状数组)

    传送门 开2个树状数组 一个存的是下标,一个存的是数量 细节...看标称吧,懒得说了,好气啊 #include <cstdio> #include <iostream> #in ...

  10. 刷题总结——小z的袜子(bzoj2038)

    题目: Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把 ...