今天查看生产环境的sentinel控制台,发现某dubbo应用一共5个节点,有3个失联了。

查看失联节点的应用日志,服务没有挂,各dubbo接口的日志正常在打印。

在应用节点ping/telnet sentinel控制台节点,ip和端口能够连通。

查看应用节点的sentinel-record日志,grep "Heartbeat" sentinel-record.log.2019-01-1*

sentinel-record.log.2019-01-14.0:2019-01-14 16:50:43 [Sentinel InitExecutor] Found init func: com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc
sentinel-record.log.2019-01-14.0:2019-01-14 16:50:43 [SimpleHttpHeartbeatSender] Default console address list retrieved: [/xxx:xxx]
sentinel-record.log.2019-01-14.0:2019-01-14 16:50:43 [HeartbeatSenderInit] HeartbeatSender started: com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender
sentinel-record.log.2019-01-14.0:2019-01-14 16:50:43 [Sentinel InitExecutor] Initialized: com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc with order 2147483647

发现1月14号有日志输出,当时应用程序有改动,构建发布后节点重新启动,日志显示心跳初始化正常。

用jmc查看各节点sentinel定时发送心跳的线程情况,

失联的节点:

正常的节点:

注意到失联节点线程状态全部变成了WAITING,而正常节点有一个线程是TIMED_WAITING

HeartbeatSenderInitFunc类的发送心跳代码:

private void scheduleHeartbeatTask(/*@NonNull*/ final HeartbeatSender sender, /*@Valid*/ long interval) {
pool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
try {
sender.sendHeartbeat();
} catch (Throwable e) {
RecordLog.warn("[HeartbeatSender] Send heartbeat error", e);
}
}
}, 5000, interval, TimeUnit.MILLISECONDS);
RecordLog.info("[HeartbeatSenderInit] HeartbeatSender started: "
+ sender.getClass().getCanonicalName());
}

线程中sender.sendHeartbeat();是捕获了Throwable并记录了异常日志的;

而在日志中并没有搜到异常信息;

由此推断,定时任务的线程已经失效了。

查询资料可能是应用中有内存溢出,会导致线程挂掉。

在最近两周的应用日志里搜索OutOfMemoryError

[ ERROR] [2019-01-14 10:25:29] [6beacd73653e7f50/6beacd73653e7f50]  [DubboServerHandler-xxx:xxx-thread-397] com.alibaba.dubbo.rpc.filter.ExceptionFilter [91] -  [DUBBO] Got unchecked and undeclared exception which called by xxx. service: com.winxuan.services.shopps.service.ShopItemService, method: getShopItemInfoId, exception: java.lang.OutOfMemoryError: GC overhead limit exceeded, dubbo version: 2.6.0, current host: xxx

总结:

JAVA应用如果出现OutOfMemoryError,可能导致ScheduledExecutorService失效。


参考:

ScheduledExecutorService is broken https://community.oracle.com/thread/1144316

定位ScheduledExecutorService过了一段时间不执行问题的更多相关文章

  1. js让程序暂停一段时间再执行

    function sleep(d){ for(var t = Date.now();Date.now() - t <= d;); } sleep(5000); //当前方法暂停5秒

  2. mouseover 移入某个元素后停留一段时间再执行函授,我用于解决轮播图下面计数用的元素快速移入后会出BUG的问题。

    var stop; $(this).bind("mouseover",function(){ stop= setTimeout(function(){ },200); }).bin ...

  3. setTimeout() 实现程序每隔一段时间自动执行

    定义和用法 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 语法 setTimeout(code,millisec) 参数 描述 code 必需.要调用的函数后要执行的 Ja ...

  4. 关于ScheduledExecutorService执行一段时间之后就不执行的问题

    在项目中使用java的定时任务时,有的时候执行一段时间后没任何反应了.这里有篇文章说了这个问题.猛击下面的链接. http://blog.163.com/scuqifuguang@126/blog/s ...

  5. 记一次TOMCAT一段时间自动关闭

    最近同事开发的一个项目部署上线后用过几天就TOMCAT自动关闭,并且该项目没有开通对外访问.通过阿里云监控台查看,从升级后系统内存占用上升趋势,CPU等信息没有太大变化. 打印服务器日志后发现全是线程 ...

  6. 关于EF第一次加载慢或过一段时间不访问时再次访问加载慢问题的总结

    优化方案 1.安装Application Initialization 这是在iis8出来后才有的,iis8内置的功能,而对于iis7.5也提供了一个扩展以支持这个功能. Application In ...

  7. 从配置读取一段时间(TimeSpan)

    C#的TimeSpan表示一段时间,DateTime表示一个时间点.TimeSpan可正可负,可与DateTime相加减,很方便,我喜欢. 代码中我们经常要表示一段时间,用一个统一的单位(时 或者 分 ...

  8. Win8.1开机黑屏一段时间才能登录

    最近发现开机后有一段时间黑屏过后才能进人登录界面,并且时间越来越长,网上查询了很多方法都没有效果,只能自己找了. 网上有一种方法提到用msconfig诊断判断或者安全启动来查看是否有黑屏,于是试了一下 ...

  9. 这段时间对c#和java的感受

    这段时间对c#和java的感受 虽然很多书上说语法相似,但实际这是一个接近于门外汉的看法 真正的不同是 c#对更贴近系统API,      而java倡导跨平台 因而c#语法关键字更多,更细, 而ja ...

随机推荐

  1. S2-045、S2-046

    前言 S2-045依然是一个Ognl表达式注入导致的RCE漏洞,且漏洞很严重.另外,还是建议读者阅读本篇文章前先看下系列文章的第一篇. 正文 依然是第一篇文章中讲过,StrutsPrepareFilt ...

  2. iframe内嵌页面——跨域通讯

      <template> <div class="act-form"> <iframe :src="src" ref=" ...

  3. MySQL无法启动问题解决Warning: World-writable config file ‘/etc/my.cnf’ is ignored

    今天重启一台内网服务器,发现mysql无法正常重启,执行systemctl start mysql,报错如下 Starting LSB: start and stop MySQL... Dec 11 ...

  4. Visual Studio 2017使用

    常用快捷方式 Ctrl + KK插入书签 取消书签Ctrl + KP 上一个书签Ctrl + KN 下一个数千Ctrl + F3 先一个关键词Shift + F3 上一个关键词 Ctrl + KC 添 ...

  5. 用arduino的uno开发板为nano板子烧写bootloader

    这篇文章,是为了记录下某宝上淘到的一个没有bootloader的nano开发板的历程(比较坑),自己搜索资料而记录的. 如果没有bootloader,板子就不能接收上传的程序,什么也干不了. 烧写bo ...

  6. linux 、 CentOs ---> 环境变量设置

    Linux下环境变量设置 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似的错 ...

  7. toolbox 中创建nginx服务器,使用localhost不能访问

    使用toolbox 工具使用docker创建nginx 容器,使用localhost不能访问? 使用docker run --rm -d --name dweb  -p 80:80 nginx 命令执 ...

  8. Codeforces 1179 D - Fedor Runs for President

    D - Fedor Runs for President 思路: 推出斜率优化公式后,会发现最优点只可能来自凸斜率中的第一个元素和最后一个元素, 这两个元素不用维护凸斜率也能知道,就是第一个和上一个元 ...

  9. APP微信登录 服务器处理代码

    采用框架THINKPHP5 需要客户端传的参数有  udid openid nickname avatar_path /* * @param 第三方微信登录 * @param openid udid ...

  10. 大数据之路week04--day06(I/O流阶段一 之异常)

    从这节开始,进入对I/O流的系统学习,I/O流在往后大数据的学习道路上尤为重要!!!极为重要,必须要提起重视,它与集合,多线程,网络编程,可以说在往后学习或者是工作上,起到一个基石的作用,没了地基,房 ...