关于Memcached的CAS和Set方法造成Socket泄漏的问题

【信息科学与工程学】计算机科学与自动化——第八十一篇 Java分布式软件高并发/高可用算法01 4. 消息队列(如Kafka的Topic分区,本质是范围)。3. 若是ACCEPT事件,bossGroup线程接受连接,创建SocketChannel,并将其注册到workerGroup的一个EventLoop的Selector上,关注READ事件。1. 分布式缓存分片(如Redis Cluster)。4. 分布式文件存储(如Ceph CRUSH)。6. 调用栈的模拟(如协程)。3. 服务网格(如Istio)的基础。2. 本地缓存与集中式缓存(如Redis)的一致性维护。3. 静态数据(如配置)缓存。 阅读详情

    为了解决多并发下写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方法。但是在项目耐久性测试过程中,我们发现网站后台管理服务器的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是由于服务器异常中断socket通讯后,并未通知客户端,造成的客户端句柄不释放。



    我们知道应用和Memcached直接的通讯是使用NIO的Socket通讯,socket是连接是会产生句柄数的,但是正常关闭通道,句柄是会释放的,除非socket通道被非正常关闭。从这个角度出发,我们对项目代码和异常场景进行了梳理。首先,只有后台管理的进程会产生句柄数增加,而前台的集群报价系统多台服务器上都未发生这种情况。分析后台管理代码,有一个定时任务去定时更新Memcached的值,因为是单线程,使用的是Set方法。但是这个set方法和报价的CAS方法都是对通过值进行修改,根据直觉判断是set方法和CAS方法在同时对一个值进行修改时,如果正好同时触发了,set方法的修改不成功,Memcached自动断开set值得连接,而未通知客户端,造成socket泄漏。我们把Memcached的Set方法修改成CAS后,问题解决。




【信息科学与工程学】计算机科学与自动化——第三百零五篇 数据中心 Scale-Up、Scale-Out、Scale-Across 20 GPU 训练中的各种算子融合技巧、梯度压缩与稀疏通信的高级变体、混合专家模型的负载均衡与通信优化、长序列模型的注意力机制优化、模型量化与蒸馏的联合优化、分布式训练中的容错与恢复、以及一些新兴硬件特性的建模(如 HBM3、GDDR7、CXL 3.0 内存语义、PCIe Gen6 PAM4 信令等)。每条仍然包含四个方程式子节。 阅读详情

相关推荐

gradleps:在 Maven Central 中搜索合适的依赖项并将其自动附加到您的 Gradle 构建文件中

研究生 通过 Maven 中央存储库进行 Npm 式搜索,并轻松向 Gradle 构建文件添加依赖项。 安装和使用 $ npm install gradleps -g 安装后可以通过Maven Central搜索 $ gradleps search guice --limit 5 Found 296 results. Displaying first 5: com.google.inject:guice 4.0-beta com.jolira:guice 3.0.0 org.jvnet.hudson:guice 3.0-rc1 com.mycila.com.google.inject:guice 3.0-20100927 org.mod4j.com.google.inject:guice 1.0-XTEXT-PATCHED 您还可以自动更新build.gradle文件

解决Failed to execute goal com.mycila:license-maven-plugin:2.3

絮絮叨叨 最近针对Apache的组件进行开发,自己已经很小心的按照人家的checkStyle进行开发了 最后编译时,还是报错了: # 报错信息 Failed to execute goal com.mycila:license-maven-plugin:3.0:check (default) on project xxx: Some files do not have the expected license header -> [Help 1] # 编译命令 mvn clean install

lucyLee的博客 4358

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

深度学习基于Resnet18的图像多分类--训练自己的数据集(超详细 含源码)

她是不会无条件的!! 2万+

thingsboard 编译失败,报错 Failed to execute goal com.mycila:license-maven-plugin:3.0

thingsboard 编译失败,报错 Failed to execute goal com.mycila:license-maven-plugin:3.0:check (default) on project thingsboard ERROR] Failed to execute goal com.mycila:license-maven-plugin:3.0:check (default) ...

云腾五洲官方博客 2195

MATLAB仿真实战:双有源桥(DAB)变换器的扩展移相调制(EPS)全流程解析

本文提供了一份详细的MATLAB/Simulink仿真实战指南,手把手解析双有源桥(DAB)变换器在扩展移相调制(EPS)下的全流程建模。内容涵盖从核心原理、主功率电路搭建、EPS驱动信号生成,到仿真运行、波形分析及模型优化的完整步骤,旨在帮助工程师和研究者快速掌握DAB变换器的仿真与性能验证方法。

o4p5q6r7s的博客 503

Spring Authorization Server实战:从零搭建OAuth2.1授权中心(含数据库改造)

本文详细介绍了如何从零开始使用Spring Authorization Server搭建符合OAuth2.1规范的授权中心,并完成关键的数据库持久化改造。内容涵盖微服务架构下的统一认证需求、基础配置、数据库表设计、高级特性(如令牌自定义、性能优化)以及与现有系统(如SSO、Gateway网关)的集成实战,为构建生产级授权服务提供完整指南。

weixin_29315091的博客 253

Failed to execute goal com.mycila:license-maven-plugin:3.0

错误名称:Failed to execute goal com.mycila:license-maven-plugin:3.0:check (default) on project xxx: Some files do not have the expected license header -> [Help 1] 解决方法: mvn license:format

丹凤朝阳 1万+

ZYNQ开发(2)在Linux系统层上PL-PS通过AXI-DMA传输数据详细步骤及注意事项

参考的网络资料 https://github.com/bperez77/xilinx_axidma/tree/master https://gitlab.gnome.org/HosseinBeheshti/UlteraZed7EV/-/tree/master/petalinux/xilinx_axidma https://www.icode9.com/content-3-925319.html https://blog.youkuaiyun.com/weixin_38218267/article/details/1

aizaiyueye的专栏 3448

关于 "can't identify protocol" 问题的定位

转载地址:http://blog.youkuaiyun.com/tspangle/article/details/20543329       转载地址:http://blog.sina.com.cn/s/blog_62ec29160101qus8.html       感谢两位作者! 问题定位步骤:  1、 用root帐户 遍历 /proc/进程ID/fd目录,如果该目录下文件数比较

认知 行动 坚持 1万+

LSTM模型 轨迹经纬度预测

原始时间序列数据如下所示,我们只取前两列纬度和经度作为输入数据 我们设定用前六个位置信息预测下一个位置,则两个样本的输入输出数据如下所示: 创建LSTM网络训练模型: import numpy as np from keras.layers.core import Dense, Activation, Dropout from keras.layers import LS...

Muzi_Water的博客 2万+

电磁场仿真:电磁场基础理论_(13).微波技术基础

微波是指频率在300 MHz到300 GHz之间的电磁波。这一频率范围对应的波长为1米到1毫米。

2401_87715305的博客 1316

运行github上的开源项目,编译打包的时候报错:Some files do not have the expected license header

[ERROR] Failed to execute goal com.mycila:license-maven-plugin:3.0:check (default) on project xxx: Some files do not have the expected license header -> [Help 1] 原因: 因为maven会对license进行检车check...

badkid123的专栏 5390

CarSim仿真快速入门(十八)-CarSim2021中的混合动力和纯电动系统

CarSim和TruckSim包括用于电动汽车(BEV)和混合电动汽车(HEV)的动力总成系统。电动和混合电动系统可与所有现有驱动系统配合使用,例如:FWD,RWD,AWD和多轴驱动系统。混合动力/电动系统模型还包括电池管理控制。CarSim或TruckSim中的默认动力总成是为闭环速度控制器提供的备用动力总成。要安装和使用完整的动力总成,请从Vehicle: Assembly库或Vehicle: Lead Unit 库链接到Powertrain数据集。在“动力总成”界面上,从下拉列表控件中选择以下三个选项

小明师兄的博客 7453

Easydict 按提交移植 MacPaw/OpenAI 0.5.1:SSE 流式传输、Reasoning Effort 与取消竞态的语义迁移实战

本文基于 Easydict 仓库中的移植执行文档 [2026-09-08-macpaw-openai-semantic-port.md](https://link.gitcode.com/i/18047791c88dc3c42100c77fb722d5b6),完整还原 Easydict 将 OpenAI 依赖从既有 SDK 按四个上游提交(`58451b5fd`、`283dc6b9b`、`3d47

gitblog_00163的博客 747

为什么我的 Spark Executor / Yarn Container 只有一个vCore?

在很多集群里,在关闭了Spark的DynamicAllocation的前提下(避免自动申请空闲资源,干扰测试结果),都会观察到:提交Spark作业时,申请 1 个 driver + n 个 executor 会在Yarn上会对应创建 n+1 个 container,但是每个container只有一个vCore,通过--driver-cores和--executor-cores设定的vCore数都未奏效。有人会因此错误的认为Yarn上的一个vCore对应一个Spark的executor,这是非常错误的,正确的

Laurence的技术博客 916

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Golang基础面试题汇总

channel、goroutine、slice、map、反射、内存、GC、Musql、Redis、ELK、K8s、Http、Https

weixin_41760738的博客 5696

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++ 知识点清单_Blog导航

三次握手(建立连接)、四次挥手(断开连接)、滑动窗口(流量控制)、拥塞控制(慢启动 / 拥塞避免 / 快重传 / 快恢复)、超时重传、粘包 / 拆包问题(解决方案:固定长度 / 分隔符 / 长度字段)。IPv4/IPv6、IP 地址分类(A/B/C 类)、子网划分(子网掩码)、路由协议(RIP/OSPF/BGP)、ARP(地址解析协议)、ICMP(互联网控制报文协议,ping/tracert)。先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度、多级反馈队列。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 795

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++键值数据库ddkv:从哈希表到多线程Reactor的深度实现

键值存储(Key-Value Store)是现代软件架构中处理高速数据访问的核心组件,其原理是通过哈希表、跳表等数据结构实现键到值的快速映射。在系统编程领域,高效的内存管理、并发控制和持久化机制是其技术价值的关键,直接决定了数据库的吞吐量和延迟。这些技术广泛应用于缓存、会话存储和实时数据处理等场景。本文聚焦于使用C++实现一个高性能键值数据库(ddkv)的工程实践,深入探讨了分片哈希表、多线程Reactor网络模型和AOF持久化等核心模块的设计与优化,特别是通过分片锁和缓冲写入机制来应对高并发挑战,为理解底

weixin_33749131的博客 324

2.4 java面试题:Netty

Netty 是一个,用于快速开发高性能、高可靠性的网络 IO 程序。它在 Java 领域中的地位,就像“网络编程的 Spring”,几乎统治了所有需要自定义协议的中间件和分布式组件。老练的 Java 工程师说 Netty,不仅要讲“是什么”,还要讲清它,以及。

你是人间四月天 219

java八股文极速版

时间和空间的权衡 值越高空间开销小但是增加了查找开销服务于从Key映射到index的Hash算法,在性能和内存的使用上取平衡,实现一个尽量均匀分布的Hash函数,选取16,是通过位运算的方法进行求取的。线程安全:当多线程执行同一段程序的时候,如果发生了和预期结果不一致的情况,就是线程不安全的,如果和预期结果一致就是线程安全的,可以加锁解决(把并行运行的线程变成串行化执行)。1.加锁 利用Synchronized或者ReenTrantLock来对不安全对象进行加锁。

PassionAnytime的博客 382

memcached 常见问题 翻译

现阶段正在研究memcached,心血来潮把memcached官方网站上的FAQ翻译了一把,希望对想要使用memcached的同学们有帮助。由于兄弟我对数据库不是很熟,有些关于数据库概念的没有翻译,有些可能直接翻错了,望大家指出。谢谢!     基本问题 什么是 memcached ? memcached 是一个高性能的分布式内存的缓存系统。本质上它是通用的,但其目的是为了加速动态 ...

weixin_33859665的博客 234

什么是死锁及死锁产生条件和解决办法

什么是死锁及死锁产生条件和解决办法1.死锁的概念死锁是进程死锁的简称,是由Dijkstra于1965年研究银行家算法时首先提出来的。它是计算机操作系统乃至并发程序设计中最难处理的问题之一。实际上,死锁问题不仅在计算机系统中存在,在我们日常生活中它也广泛存在。2.什么是死锁我们先看看这样一个生活中的例子:在一条河上有一座桥,桥面较窄,只能容纳一辆汽车通过,无法让两辆汽车并行。如果有两辆汽车A和B分别...

LzwGlory的专栏 527

memcached(十九)并发原语CAS与GETS操作

最近笔者自己的项目中,遇到了乐观锁的需求。但是redis没有这个操作,无奈,看了memcache天然的支持这种并发原语,即:GETS和CAS操作。因此准备打算继续使用REDIS,业务没有那么强的时序执行要求,因此可以使用没有CAS的算法在某种程度上解决。 我们为什么要使用这种并发原语呢?如果是单机版的,我们可以通过通过加锁同步就可以解决执行时序的问题。但是我们的应用是分布式的,无...

报喜鸟 369

Memcached expire 设置错误引起的set(key,exp,value)为true而get(key)为null的问题

最近项目中使用到了Memcached,而客户端选择了XMemcached ,在设置过期时间时,因对Memcached 不熟悉,将expire 设置为1000000000,本意表示尽量长的时间不要过期,但在测试时发现,memcachedClient.set(key,exp,value)结果返回true,即代表该项已成功存入缓存,但当调用memcachedClient.get(key)时始终返...

小云 451
上一篇: 基于Pushlet实现的Web版报价系统
下一篇: Oralce如何修改间隔分区
gavinloo
博客等级 码龄21年 48粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值