pinpoint agent线程模型

以下分析基于pinpoint1.7.1版本

pinpoint agent主要使用到的异步线程有4个

DeadlockMonitorThread : 死锁监测线程,执行一次休眠60s

public DeadlockMonitorThread(DeadlockThreadRegistry deadlockThreadRegistry, long intervalMillis) {
this.deadlockMonitorTask = new DeadlockMonitorTask(deadlockThreadRegistry, intervalMillis);
this.deadlockMonitorThread = new Thread(deadlockMonitorTask, "Pinpoint-deadlock-monitor");
this.deadlockMonitorThread.setDaemon(true);
// for preload
deadlockMonitorTask.doTask();
}

AgentInfoSender: agent信息上报定时任务,是个timer,3秒上报一次

DefaultAgentStatMonitor: agent状态信息上报(jvm状态等),线程数为1的定时线程池(ScheduledExecutorService),延迟5秒执行,每5秒上报一次

private final ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1, new PinpointThreadFactory("Pinpoint-stat-monitor", true));

TcpDataSender: 调用链数据上报通道,单线程,数据队列(LinkedBlockingQueue)大小5120,重试队列(LinkedBlockingQueue)大小1024,底层通迅使用的Netty

以上除了数据上报较为复杂外,其它几个都是定时执行的单线程程序

调用链数据上报分为两种

  1. API、sql、String常量,这类数据上报如果失败会先放到重试队列,后续进行重试,默认重试3次
  2. 调用链详情数据上报失败不会重试

数据上报流程

  1. 数据先被添加到上报队列中,返回添加成功or失败
public boolean execute(T data) {
if (data == null) {
if (isWarn) {
logger.warn("execute(). data is null");
}
return false;
}
if (!isRun.get()) {
if (isWarn) {
logger.warn("{} is shutdown. discard data:{}", executorName, data);
}
return false;
}
boolean offer = queue.offer(data);
if (!offer) {
if (isWarn) {
logger.warn("{} Drop data. queue is full. size:{}", executorName, queue.size());
}
}
return offer;
}
  1. 数据上报线程循环从队列中获取数据发送到收集器
private void doExecute() {
drainStartEntry:
while (isRun()) {
try {
Collection<T> dtoList = getDrainQueue();
int drainSize = takeN(dtoList, this.maxDrainSize);
if (drainSize > 0) {
doExecute(dtoList);
continue;
} while (isRun()) {
T dto = takeOne();
if (dto != null) {
doExecute(dto);
continue drainStartEntry;
}
}
} catch (Throwable th) {
logger.warn("{} doExecute(). Unexpected Error. Cause:{}", executorName, th.getMessage(), th);
}
}
flushQueue();
}

还有一个UDP的数据上报通道,除了底层协议不同外,其它和TCP上报一样

数据上报流程

总结

agent使用的异步线程都是单线程

数据上报都是先把数据放入队列中,立即返回,队列大小可配置,默认5120

底层数据上报通迅是基于Netty的NIO

由于调用链监控的粒度非常细,所以过多的日志打印会对应用造成影响,要避免不必要的日志,合理设置日志级别,线上使用的日志级别要配置高一些

pinpoint agent线程模型的更多相关文章

  1. 看我是如何处理自定义线程模型---java

    看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoar ...

  2. HBase的Write Ahead Log (WAL) —— 整体架构、线程模型

    解决的问题 HBase的Write Ahead Log (WAL)提供了一种高并发.持久化的日志保存与回放机制.每一个业务数据的写入操作(PUT / DELETE)执行前,都会记账在WAL中. 如果出 ...

  3. Netty学习三:线程模型

    1 Proactor和Reactor Proactor和Reactor是两种经典的多路复用I/O模型,主要用于在高并发.高吞吐量的环境中进行I/O处理. I/O多路复用机制都依赖于一个事件分发器,事件 ...

  4. Mina、Netty、Twisted一起学(十):线程模型

    要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器.但是如果不了解它 ...

  5. WPF QuickStart系列之线程模型(Thread Model)

    这篇博客将介绍WPF中的线程模型. 首先我们先来看一个例子,用来计算一定范围内的素数个数. XAML: <Grid> <Grid.RowDefinitions> <Row ...

  6. servlet的生命周期与运行时的线程模型

    第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...

  7. eventloop & actor模式 & Java线程模型演进 & Netty线程模型 总结

    eventloop的基本概念可以参考:http://www.ruanyifeng.com/blog/2013/10/event_loop.html Eventloop指的是独立于主线程的一条线程,专门 ...

  8. 理解RxJava线程模型

    RxJava作为目前一款超火的框架,它便捷的线程切换一直被人们津津乐道,本文从源码的角度,来对RxJava的线程模型做一次深入理解.(注:本文的多处代码都并非原本的RxJava的源码,而是用来说明逻辑 ...

  9. Hbase WAL线程模型源码分析

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/257 来源:腾云阁 https://www.qclo ...

随机推荐

  1. d3.js封装文本实现自动换行和旋转平移等功能

    我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...

  2. vue created 生命周期

    在实例创建完成后被立即调用.在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调.然而,挂载阶段还没开始,$el属性目前不可见. ...

  3. TCP/IP详解 卷一(第十七章 TCP:传输控制协议)

    与UDP协议相比,TCP提供一种面向连接的.可靠的字节流服务. TCP首部 跟UDP一样,TCP数据被封装在一个IP数据报中,下面显示TCP的首部数据格式 每个TCP段都包含源端和目的端的端口号,用于 ...

  4. Mybatis 存在多个日志时设置日志

    mybatis默认使用log4j,当有self4j这个日志jar包存在时会无法打印sql,请移除或者在工程启动时显示设置mybatis使用的日志类 log4j.logger.org.apache.ib ...

  5. Jmeter3.0-插件管理

    本文转自推酷:http://www.tuicool.com/articles/UV7fI3V JMeter ,老牌,开源,轻量,Apache基金会的顶级项目,光是这些关键字就足以让大量用户将其纳入自己 ...

  6. 【转】mongoDB命令行和客户端访问

    一.客户端 mongodb客户端常用的是mongoVUE  下载mongoVUE:网上下载地址,并且是破解版.[若没分,可以单独找我].因为非破解版的只有15天的使用限制.         打开界面如 ...

  7. docker pull net/http: TLS handshake timeout错误解决

    docker pull  net/http: TLS handshake timeout  出现这个错误,原因很明显,我们在围城里,有两种解决办法,一种是用梯子爬围墙,一种是用国内源,下面用国内源 e ...

  8. webstore 与 热编译的配置冲突

    这个勾去掉就会自动编译了!

  9. uboot和内核分区的改动

    随着内核的更新,内核越来越大,uboot给nand的kernel分区默认是2M的 device nand0 <nandflash0>, # parts = 4  #: name       ...

  10. Ubuntu 16.04下编译安装Apache2.4和PHP7结合

    Ubuntu 16.04下编译安装Apache2.4和PHP7结合,并安装PDOmysql扩展. 1.编译安装apache2.4.20 1 第一步: ./configure --prefix=/usr ...