安下载编程开发

分类分类

Pinpoint(应用性能管理)

Pinpoint(应用性能管理)

v2.2.0 官方版

大小:27.9 MB 更新:2020/12/05

类别:编程工具系统:WinXP, Win7, Win8, Win10, WinAll

立即下载

  Pinpoint提供结构分析功能,可以通过这款软件帮助用户分析应用程序结构,分析分布式系统运行结构,在软件上分析系统运行流程,从而判断是哪里出现问题,立即发现系统运行过程存在的问题,可以在可视化的图表界面分析系统,可以查看运行事务内容,可以显示该事务运行的代码,立即分析事务云心过程代码是否出现错误,在视图界面找到运行错误的信息,从而修复系统故障,新版提供对JDK6的支持,修复在KafkaPlugin中连接SocketChannel状态时的NPE,修复PingStreamContext的竞争条件,如果你需要这款软件就下载吧!

Pinpoint(应用性能管理)

软件功能

  Pinpoint是用于用Java / PHP编写的大规模分布式系统的APM(应用程序性能管理)工具。

  受Dapper的启发,Pinpoint提供了一种解决方案,可通过跟踪跨分布式应用程序的事务来帮助分析系统的整体结构以及其中的组件如何互连。

  你一定要检查精确定位,如果你想

  1、一目了然地了解您的应用程序拓扑

  2、监控应用程序的实时状态

  3、获得每笔交易的代码级可见性

  4、安装APM代理而无需更改任何代码

  5、对性能的影响最小(资源使用量增加约3%)

软件特色

  当今的服务通常由许多不同的组件组成,它们之间相互通信以及对外部服务进行API调用。每笔交易如何执行通常被留在黑匣子中。精确跟踪这些组件之间的事务流,并提供清晰的视图以识别问题区域和潜在瓶颈。

  ServerMap-通过可视化其组件如何互连来了解任何分布式系统的拓扑。单击节点可显示有关组件的详细信息,例如其当前状态和事务计数。

  实时活动线程图表-实时监视应用程序内部的活动线程。

  请求/响应散点图-随时间可视化请求计数和响应模式,以识别潜在问题。可以通过在图表上拖动来选择事务以获取更多详细信息。

Pinpoint(应用性能管理)

  CallStack-在分布式环境中获得每个事务的代码级可见性,从而在单个视图中识别瓶颈和故障点。

Pinpoint(应用性能管理)

  检查器-查看有关应用程序的其他详细信息,例如CPU使用率,内存/垃圾收集,TPS和JVM参数。

Pinpoint(应用性能管理)

安装方法

  为了运行自己的Pinpoint实例,您将需要运行以下组件:

  HBase(用于存储)

  精确收集器(部署在Web容器上)

  精确定位Web(在Web容器上部署)

  Pinpoint代理(附加到Java应用程序进行概要分析)

Pinpoint(应用性能管理)

  快速安装概述

  1、HBase

  a.设置HBase集群-Apache HBase

  b.创建HBase模式-提要HBase /scripts/hbase-create.hbaseShell。

  HBase的

  下载,配置和启动HBase- 1. Hbase。

Pinpoint(应用性能管理)

  2、Build Pinpoint(可选)-如果使用二进制文件,则无需

  a.精确定位- git clone $PINPOINT_GIT_REPOSITORY

  b.将JAVA_HOME环境变量设置为JDK 8主目录。

  c.将JAVA_6_HOME环境变量设置为JDK 6主目录(建议使用1.6.0_45)。

  d.将JAVA_7_HOME环境变量设置为JDK 7主目录(建议使用1.7.0_80)。

  e.将JAVA_8_HOME环境变量设置为JDK 8主目录。

  f.将JAVA_9_HOME环境变量设置为JDK 9主目录。

  g.运行./mvnw clean install -DskipTests=true(或./mvnw.cmd用于Windows)

  3、精确收集器

  a.使用java -jar命令启动pinpoint-collector-boot- $ VERSION.jar。

  例如) java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.1.1.jar

  b.它将以默认设置开始。要了解有关默认值或如何覆盖默认值的更多信息,请参见以下详细信息。

  4、精确定位网站

  a.使用java -jar命令启动pinpoint-web-boot- $ VERSION.jar。

  例如) java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.1.1.jar

  b.它将以默认设置开始。要了解有关默认值或如何覆盖默认值的更多信息,请参见以下详细信息。

  5、精确代理

  a.将pinpoint-agent /提取/移动到方便的位置($AGENT_PATH)。

  b.设置-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jarJVM参数以将代理附加到Java应用程序。

  c.设置-Dpinpoint.agentId和-Dpinpoint.applicationName命令行参数。

  a)如果要在具有动态更改代理ID的容器化环境中启动代理,请考虑添加-Dpinpoint.container命令行参数。

  d.使用上述选项启动Java应用程序。

使用说明

  技术细节

  在本文中,我们描述了Pinpoint的技术,例如事务跟踪和字节码检测。并且我们解释了应用于Pinpoint Agent的优化方法,该方法修改字节码并记录性能数据。

  分布式事务跟踪,以Google的Dapper为模型

  精确定位在单个交易中跟踪分布式请求,该交易以Google的Dapper为例。

  分布式事务跟踪在Google Dapper中的工作方式

  分布式跟踪系统的目的是在消息从节点1发送到节点2(图1)时,确定分布式系统中节点1和节点2之间的关系。

Pinpoint(应用性能管理)

  图1.分布式系统中的消息关系

  问题在于无法识别消息之间的关系。例如,我们无法识别从节点1发送的N条消息和在节点2中接收的N'条消息之间的关系。换句话说,当从节点1发送第X条消息时,无法在N'条消息中识别第X条消息在节点2中收到消息。尝试在TCP或操作系统级别上跟踪消息。但是,实现复杂度高且性能低,因为应针对每个协议分别实现。另外,很难准确地跟踪消息。

  但是,已经在Google的Dapper中实现了解决此类问题的简单解决方案。解决方案是添加应用程序级标签,这些标签可以是发送消息时消息之间的链接。例如,它在HTTP请求中的HTTP标头中包含消息的标记信息,并使用此标记跟踪消息。

  Google的Dapper

  Pinpoint以Google Dapper的跟踪技术为模型,但已被修改为在调用头中添加应用程序级标签数据,以跟踪远程调用中的分布式事务。标签数据包含一组键,这些键被定义为TraceId。

  精确的数据结构

  在Pinpoint中,数据结构的核心由Span,Trace和TraceId组成。

  跨度:RPC(远程过程调用)跟踪的基本单位;它指示RPC到达并包含跟踪数据时已处理的工作。为了确保代码级可见性,Span的子级将SpanEvent标记为数据结构。每个跨度包含一个TraceId。

  跟踪:Span的集合;它由关联的RPC(跨度)组成。同一跟踪中的跨度共享相同的TransactionId。跟踪通过SpanIds和ParentSpanIds被分类为层次树结构。

  TraceId:一组包含TransactionId,SpanId和ParentSpanId的键。TransactionId表示消息ID,SpanId和ParentSpanId都表示RPC的父子关系。

  TransactionId(TxId):从单个事务跨分布式系统发送/接收的消息的ID;它在整个服务器组中必须是全局唯一的。

  SpanId:接收RPC消息时处理的作业的ID。当RPC到达节点时生成。

  ParentSpanId(pSpanId):生成RPC的父范围的SpanId。如果节点是交易的起点,则不会有父跨度-在这种情况下,我们使用值-1表示跨度是交易的根跨度。

  Google Dapper和NAVER Pinpoint之间的术语差异

  Pinpoint中的术语“ TransactionId”与Google Dapper中的术语“ TraceId”具有相同的含义,Pinpoint中的术语“ TraceId”指的是键的集合。

  TraceId如何工作

  下图说明了TraceId的行为,其中在4个节点内进行了3次RPC。

Pinpoint(应用性能管理)

  图2. TraceId行为的示例

  TransactionId(TxId)表示三个不同的RPC在图2中作为单个事务彼此关联。但是,TransactionId本身无法明确描述RPC之间的关系。为了识别RPC之间的关系,需要使用SpanId和ParentSpanId(pSpanId)。假设一个节点是Tomcat。您可以将SpanId视为处理HTTP请求的线程。ParentSpanId指示进行RPC调用的父级的SpainId。

  精确定位可以使用TransactionId查找关联的n个跨度,并可以使用SpanId和ParentSpanId将它们分类为分层树结构。

  SpanId和ParentSpanId是64位长的整数。因为该数字是任意生成的,所以可能会发生冲突,但是考虑到从-922337203685477575808到9223372036854775807的值范围,这不太可能发生。如果键之间存在冲突,Pinpoint以及Google的Dapper会让开发人员知道发生了什么,而不是解决冲突。

  TransactionId由AgentId,JVM(Java虚拟机)启动时间和SequenceNumbers组成。

  AgentId:JVM启动时用户创建的ID。在已安装Pinpoint的整个服务器组中,它必须是全局唯一的。使其唯一的最简单方法是使用主机名($ HOSTNAME),因为主机名通常不会重复。如果需要在服务器组中运行多个JVM,请在主机名中添加一个后缀,以避免重复。

  JVM启动时间:需要保证以零开头的唯一SequenceNumber。当用户错误创建重复的AgentId时,该值用于防止ID冲突。

  SequenceNumber:精确代理发布的ID,其编号从零开始按顺序递增;它是按消息发出的。

  Twitter上的分布式系统跟踪平台Dapper和Zipkin生成随机的TraceId(Pinpoint中的TransactionId),并将冲突情况视为正常情况。但是,我们希望在Pinpoint中尽可能避免这种冲突。为此,我们有两个可用的选项:一种使用数据量少但发生冲突的可能性高的方法;另一种是数据量大但冲突可能性低的方法。我们选择了第二个选项。

  可能有更好的方式处理交易。我们提出了一些想法,例如中央密钥服务器发出密钥。但是由于性能问题和网络错误,我们没有在系统中实现此功能。我们仍在考虑批量发行密钥作为替代解决方案。因此,也许将来会开发这种方法。但是现在,采用一种简单的方法。在Pinpoint中,TransactionId被视为可变数据。

  字节码检测,不需要修改代码

  之前,我们解释了分布式事务跟踪。一种实现方式是开发人员自行修改其代码。制作RPC时,允许开发人员添加标签信息。但是,即使这样的功能对开发人员有用,也可能是修改代码的负担。

  Twitter的Zipkin使用修改后的库及其容器(Finagle)提供了分布式事务跟踪的功能。但是,如果需要,它需要修改代码。我们希望功能能够在不修改代码的情况下工作,并希望确保代码级可见性。为了解决这些问题,在Pinpoint中采用了字节码检测技术。Pinpoint代理会干预代码以制作RPC,以便自动处理标签信息。

  克服字节码检测的缺点

  分布式事务跟踪有两种方法,如下所示。字节码检测是一种自动方法。

  手动方法:开发人员使用Pinpoint提供的API开发用于在重要点记录数据的代码。

  自动方法:开发人员无需进行代码修改,因为Pinpoint决定要干预和开发的API。

  每种方法的优缺点如下:

  表1每种方法的优缺点

Pinpoint(应用性能管理)

  字节码检测是一种包括高难度级别和风险的技术。但是,使用此技术有很多好处。

  尽管它需要大量的开发资源,但几乎不需要任何资源即可应用该服务。例如,下面显示了使用字节码检测的自动方法和使用库的手动方法之间的成本(在此情况下,为清楚起见,成本是随机数)。

  自动方式:总计100

  精确开发成本:100

  应用的服务成本:0

  手动方式:总计30

  精确开发成本:20

  应用的服务成本:10

  上面的数据告诉我们,手动方法比自动方法更具成本效益。但是,由于我们有成千上万的服务,因此不能保证NAVER具有相同的结果。例如,如果我们有10项服务需要修改,则总费用将计算如下:

  精确开发成本20 +应用服务成本10 x 10服务= 120

  如您所见,自动方法对我们来说更具成本效益。

  我们很幸运在Pinpoint团队中拥有许多精通Java的优秀开发人员。因此,我们认为克服Pinpoint开发中的技术难题只是时间问题。

  字节码检测的价值

  我们选择实现字节码检测(自动方法)的原因不仅是我们已经说明的原因,还包括以下几点。

  隐藏的API

  API是否公开给开发人员使用。作为API提供者,我们被限制根据需要修改API。这样的限制会给我们施加压力。

  我们可能会修改API以纠正错误的设计或添加新功能。但是,如果这样做有限制,我们将很难改善API。解决此类问题的最佳答案是可扩展的系统设计,这不是众所周知的简单选择。创建完美的API设计几乎是不可能的,因为我们无法预测未来。

  使用字节码检测,我们不必担心由于公开跟踪API而引起的问题,并且可以在不考虑依赖关系的情况下不断改进设计。对于计划使用Pinpoint开发应用程序的用户,请注意Pinpoint开发人员可以更改API,因为提高性能和设计是我们的首要任务。

  易于启用或禁用

  使用字节码检测的缺点是,当库的分析部分或Pinpoint本身发生问题时,它可能会影响您的应用程序。但是,由于您无需更改任何代码,因此只需禁用Pinpoint即可轻松解决此问题。

  通过将以下三行(与Pinpoint代理的配置相关联)添加到JVM启动脚本中,可以轻松地为应用程序启用Pinpoint:

Pinpoint(应用性能管理)

  如果由于Pinpoint出现任何问题,则只需删除JVM启动脚本中的配置数据。

  字节码检测如何工作

  由于字节码检测技术必须处理Java字节码,因此往往会增加开发风险,同时会降低生产率。另外,开发人员容易犯错误。在Pinpoint中,我们通过使用拦截器进行抽象来提高了生产力和可访问性。Pinpoint通过在类加载时插入应用程序代码来注入必要的代码,以跟踪分布式事务和性能信息。由于将跟踪代码直接注入到应用程序代码中,因此可以提高性能。

Pinpoint(应用性能管理)

  图3.字节码检测的基本原理

  在Pinpoint中,API拦截部分和数据记录部分是分开的。拦截器被注入到我们要跟踪的方法中,并调用了负责数据记录的before()和after()方法。通过字节码检测,Pinpoint Agent只能通过必要的方法记录数据,这使概要分析数据的大小变得紧凑。

  优化精确代理的性能

  最后,我们将描述如何优化Pinpoint Agent的性能。

  使用二进制格式(节余)

  您可以使用二进制格式(Thrift)提高编码速度。尽管很难使用和调试,但它可以通过减少生成的数据大小来提高网络使用效率。

  优化记录数据以进行可变长度编码和格式

  如果将长整数转换为固定长度的字符串,则数据大小将为8个字节。但是,如果使用可变长度编码,则数据大小可以从1到10个字节不等,具体取决于给定数字的大小。为了减小数据大小,Pinpoint通过节俭压缩协议将数据编码为可变长度的字符串,并记录要针对编码格式进行优化的数据。Pinpoint Agent通过将基于根方法的剩余时间转换为向量值来减小数据大小。

  可变长度编码

Pinpoint(应用性能管理)

  图4.固定长度编码和可变长度编码之间的比较

  如图4所示,您需要测量6个不同点的时间,以获取有关何时调用和完成三种不同方法的信息(图4);使用固定长度编码时,此过程需要48个字节(6个点×8个字节)。

  同时,Pinpoint Agent使用可变长度编码,并根据其相应格式记录数据。并根据根方法的开始时间计算其他点的差异(向量值)上的时间信息。由于向量值很小,因此它消耗的字节数很少,因此仅消耗了13个字节,而不是48个字节。

  如果执行方法需要更多时间,则即使使用可变长度编码,也会增加字节数。但是,它仍然比固定长度编码更有效。

  用常量表替换重复的API信息,SQL和字符串

  我们希望Pinpoint启用代码级跟踪。但是,它在增加数据大小方面存在问题。每次将高精度数据发送到服务器时,由于数据量大,它将增加网络使用率。

  为了解决这个问题,我们采取了一种在远程HBase服务器中创建常量表的策略。由于每次将“方法A”的数据发送到Pinpoint Collector都会产生过载,因此Pinpoint Agent将“方法A”数据转换为ID,并将此信息存储为HBase中的常量表,并继续使用ID跟踪数据。当用户在网站上检索跟踪数据时,Pinpoint Web会在常量表中搜索相应ID的方法信息并重新组织它们。使用相同的方法来减少SQL或常用字符串中的数据大小。

  处理批量请求的样本

  Naver提供的对在线门户服务的需求量很大。一项服务每天处理超过200亿个请求。跟踪此类请求的一种简单方法是根据需要扩展网络基础结构和服务器,以适应请求的数量。但是,这不是处理这种情况的经济有效的方法。

  在Pinpoint中,您只能收集采样数据,而不能跟踪每个请求。在请求很少的开发环境中,将收集每个数据。在需求量很大的生产环境中,仅收集全部数据的1〜5%,这足以分析整个应用程序的状态。通过采样,您可以最大程度地减少应用程序中的网络开销,并降低网络和服务器等基础架构的成本。

  精确的采样方法

  Pinpoint支持计数采样器,如果设置为10,该采样器仅收集10个请求之一的数据。我们计划添加新的采样器,以更有效地收集数据。

  最小化使用异步数据传输中止的应用程序线程

  精确定位不会干扰应用程序线程,因为编码数据或远程消息是由另一个线程异步传输的。

  通过UDP传输数据

  与Google的Dapper不同,Pinpoint通过网络传输数据以确保数据速度。当数据流量突然爆发时,与服务共享网络可能是一个问题。在这种情况下,Pinpoint代理开始使用UDP协议为您的服务提供网络连接优先级。

  注意

  由于数据传输API作为接口分开,因此可以替换。可以将其更改为以不同方式存储数据的实现,例如本地文件。

  精确定位示例

  这是一个如何从应用程序中获取数据的示例,以便您可以全面了解前面所述的内容。

  图5显示了在TomcatA和TomcatB中安装Pinpoint时可以看到的内容。您可以将单个节点的跟踪数据视为单个事务,它表示分布式事务跟踪的流程。

Pinpoint(应用性能管理)

  图5.精确定位示例

  下面介绍Pinpoint对每种方法的作用。

  1、当请求到达TomcatA时,Pinpoint代理会发出TraceId。

  TX_ID:TomcatA ^ TIME ^ 1

  SpanId:10

  ParentSpanId:-1(根)

  2、从Spring MVC控制器记录数据。

  3、干预HttpClient.execute()方法的调用,并在HttpGet中配置TraceId。

  创建一个子TraceId。

  TX_ID:TomcatA ^ TIME ^ 1-> TomcatA ^ TIME ^ 1

  SPAN_ID:10-> 20

  PARENT_SPAN_ID:-1-> 10(父SpanId)-在HTTP标头中配置子TraceId。

  HttpGet.setHeader(PINPOINT_TX_ID,“ TomcatA ^ TIME ^ 1”)

  HttpGet.setHeader(PINPOINT_SPAN_ID,“ 20”)

  HttpGet.setHeader(PINPOINT_PARENT_SPAN_ID,“ 10”)

  4、将标记的请求传输到TomcatB。

  TomcatB从传输的请求中检查标头。

  HttpServletRequest.getHeader(PINPOINT_TX_ID)-TomcatB成为子节点,因为它在标头中标识了TraceId。

  TX_ID:TomcatA ^ TIME ^ 1

  SPAN_ID:20

  PARENT_SPAN_ID:10

  5、记录来自Spring MVC控制器的数据并完成请求。

Pinpoint(应用性能管理)

  1、当来自TomcatB的请求完成时,Pinpoint Agent将跟踪数据发送到Pinpoint Collector,以将其存储在HBase中。

  2、终止来自TomcatB的HTTP调用后,来自TomcatA的请求完成。Pinpoint代理将跟踪数据发送到Pinpoint Collector,以将其存储在HBase中。

  UI从HBase读取跟踪数据,并通过对树进行排序来创建调用堆栈。

  结论

  Pinpoint是与您的应用程序一起运行的另一个应用程序。使用字节码检测使Pinpoint看起来不需要修改代码。通常,字节码检测技术使应用程序容易受到风险的影响。如果Pinpoint中出现问题,也将影响您的应用程序。但是目前,我们没有摆脱这种威胁,而是专注于提高Pinpoint的性能和设计。因为我们认为这使Pinpoint更具价值。因此,是否使用Pinpoint由您决定。

  我们仍然需要做大量工作来改善Pinpoint。尽管不完善,Pinpoint还是作为一个开源项目发布的。我们一直在努力开发和改进Pinpoint,以满足您的期望。

精品推荐
同类推荐
相关下载
  • 最新排行
  • 最热排行
  • 评分最高
编程开发排行榜
实时热词