dubbo-线程池监控

Posted 青乡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo-线程池监控相关的知识,希望对你有一定的参考价值。

代码

//dubbo线程池数量监控 Class<?> clazz = Class.forName("com.alibaba.dubbo.rpc.protocol.dubbo.status.ThreadPoolStatusChecker"); Method check = clazz.getMethod("check"); Object result = check.invoke(clazz.newInstance()); logger.info(JSONObject.toJSONString(result));

原理
1.获取dubbo提供的类的对象
2.读数据即可

dubbo提供的类

/** * ThreadPoolStatusChecker */@Activatepublic class ThreadPoolStatusChecker implements StatusChecker {
@Override public Status check() { DataStore dataStore = ExtensionLoader.getExtensionLoader(DataStore.class).getDefaultExtension(); Map<String, Object> executors = dataStore.get(Constants.EXECUTOR_SERVICE_COMPONENT_KEY);
StringBuilder msg = new StringBuilder(); Status.Level level = Status.Level.OK; for (Map.Entry<String, Object> entry : executors.entrySet()) { String port = entry.getKey(); ExecutorService executor = (ExecutorService) entry.getValue();
if (executor != null && executor instanceof ThreadPoolExecutor) { //校验是否是线程池 ThreadPoolExecutor tp = (ThreadPoolExecutor) executor; boolean ok = tp.getActiveCount() < tp.getMaximumPoolSize() - 1; Status.Level lvl = Status.Level.OK; if (!ok) { level = Status.Level.WARN; lvl = Status.Level.WARN; }
if (msg.length() > 0) { msg.append(";"); } msg.append("Pool status:" + lvl + ", max:" + tp.getMaximumPoolSize() + ", core:" + tp.getCorePoolSize() + ", largest:" + tp.getLargestPoolSize() + ", active:" + tp.getActiveCount() + ", task:" + tp.getTaskCount() + ", service port: " + port); } } return msg.length() == 0 ? new Status(Status.Level.UNKNOWN) : new Status(level, msg.toString()); }
}

字段说明

测试数据

2020-07-09 17:27:02.893|INFO |dlct2FhXhVFR-39-81|xxx.common.filter.dubbo.AccessLogExtFilter.invoke:175||{"level":"OK","message":"Pool status:OK, //线程池状态:正常max:500, //最大数量core:500, //core数量largest:51, //线程池线程数量的峰值,线程池中曾经有过的最大线程数量active:1, //活跃数量,一直在变化task:51, //总任务数量=已完成任务数量+未完成任务数量service port: 12029"}

dubbo源码-ThreadPoolStatusChecker

msg.append("Pool status:" + lvl + ", max:" + tp.getMaximumPoolSize() + ", core:" + tp.getCorePoolSize() + ", largest:" + tp.getLargestPoolSize() + ", active:" + tp.getActiveCount() + ", task:" + tp.getTaskCount() + ", service port: " + port);

jdk源码-ThreadPoolExecutor

1、getLargestPoolSize largest:51, //线程池线程数量的峰值,线程池中曾经有过的最大线程数量

/** * Returns the largest number of threads that have ever * simultaneously been in the pool. * * @return the number of threads */ public int getLargestPoolSize() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { return largestPoolSize; } finally { mainLock.unlock(); } }

2、getTaskCount 总的任务数量=已完成任务数量 + 任务集合里未完成任务数量

/** * Counter for completed tasks. Updated only on termination of * worker threads. Accessed only under mainLock. */ private long completedTaskCount; //已完成任务数量 /** * Returns the approximate total number of tasks that have ever been * scheduled for execution. Because the states of tasks and * threads may change dynamically during computation, the returned * value is only an approximation. * * @return the number of tasks */ public long getTaskCount() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { long n = completedTaskCount; for (Worker w : workers) { n += w.completedTasks; if (w.isLocked()) ++n; } return n + workQueue.size(); //已完成任务数量 + 任务集合里未完成任务数量 } finally { mainLock.unlock(); } }

官方api

long getTaskCount() 返回曾计划执行的近似任务总数。

https://doc.yonyoucloud.com/doc/jdk6-api-zh/java/util/concurrent/ThreadPoolExecutor.html


以上是关于dubbo-线程池监控的主要内容,如果未能解决你的问题,请参考以下文章

简历写着熟悉 Dubbo,居然连 Dubbo 线程池监控都不知道?

dubbo-客户端请求连接并发数量监控

如何使用Spring开发和监控线程池服务

DynamicTp v1.0.7版本发布。还在为Dubbo线程池耗尽烦恼吗?还在为Mq消费积压烦恼吗?

一次线程池引发的线上故障分析

为什么一段看似正确的代码会导致DUBBO线程池被打满