最近系统出现一个问题,少量Proxy出现故障,群组消息应用服务器会出现内存资源不够导致的崩溃的情况。我们对每个worker做了过载的保护,并且对每个worker的内存使用做了限制。从抓下来的dump来看,内存中的sipc对象占用了过多内存导致的崩溃。sipc请求对象在内存中的数量远远超过设置的数量,说明过载没有起到作用。
现场描述:
群消息服务器会访问多台Proxy给同的用户下行消息。
坏了两台proxy。
群组消息应用worker与zookeeper断掉连接,没有任何请求过来从proxy过来。内存占用设定的2.4G,每颗cpu在20%左右,正常地对进程抓dump抓不下来,得加-F参数。kill进程的操作,需要一段时间后,进程才会消失。
事故原因分析:
SipcHost在做过载保护的机制是这样的:
Sipc请求进来的时候,计数器加1,Sipc应答的时候,计数器减1;
计数器如果到达阈值,对于新请求,直接返回server busy;
但是目前上线的很多应答无内容的应用为了快速响应客户端的请求,都是直接发送应答之后再开始做业务逻辑,群消息就是个典型的例子,先给客户端reponse,再做群消息的分发。
SipcHost的线程池使用的是 java.util.concurrent.Executors.newFixedThreadPool(int nThreads),而这个线程池使用的是无容量限制的LinkedBlockingQueue。
基于以上三点,群消息在做消息分发的时候由于proxy的问题RPC消息发不下去,进入RPC重试机制;由于群消息快速reponse了,所以群消息的Sipc计数器一直为一个比较小的值,群消息的请求一直会进入到SipcHost的Queue中,最终导致内存被使用完毕,所有的线程被hang死。
经验总结:
尽量不要使用计数器做过载保护,因为计数器由于应用多使用异步的原因,不能准确判断事务是否完成,只能根据应用的response来计数,不是很准确。建议使用有一定容量的queue的线程池,queue满了直接报busy来做过载保护。
分享到:
相关推荐
1)service的负载均衡、故障转移、超时处理通常是RPC-client连接池层面来实施的 2)异构服务器负载均衡,最简单的方式是静态权重法,缺点是无法自适应动态调整 3)动态权重法,可以动态的根据service的处理能力来...
rpc远程过程调用的手写简单源码 学习rpc通信的可以下载下来看看 很有帮助 包括客户端和服务端的网络调用 通信 序列化....等等
ONC RPC 协议实现,根据.x接口文档生成JAVA代码,实现不同语言间的RPC调用
jsonrpc是一个基于Java的高性能开源RPC框架
详细讲解RPC
高性能RPC框架 nfs-rpc
RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码...
RPC编程, RPC编程详解RPC编程, RPC编程详解RPC编程, RPC编程详解
Runpower 的手册资料
C语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC...RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPCC语言头文件 RPC
jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例
此插件支持在jmeter中以rpc方式对dubbo接口进行调用、rpc方式调用dubbo,解压包后里面有两个文件,一个是支持rpc的插件,另一个赠送idea中对数据库访问的插件 插件名称:jmeter-plugins-dubbo-2.7.7-jar-with-...
RPC的Java实现,自己一步一步实现,有助于分布式学习的理解。
自定义rpc框架 ,用到了nettty zookeeper等等,模仿dubbo
2、使用Netty进行通讯(同节点RPC不走网络,直接入收件箱队列); 3、路由策略:随机路由、指定Key路由、资源Id路由、强制路由 4、使用ZK进行集群状态管理 备注: 1、使用自定义注解进行服务注册及辅助控制(线程...
使用Java实现简单的RPC调用,解释了接口是如何执行其它服务函数体的。
android-json-rpc是一个在android程序中使用的JSON-RPC客户端类库。它提供了一个简单的API来执行JSON-RPC服务调用
JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在...
JsonRpc-Cpp - JSON-RPC implementation. * Copyright (C) 2008-2011 Sebastien Vincent * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser ...
RPC视频RPC视频RPC视频