Java 运行时监控,第 3 部分: 监控应用程序生态系统的性能与可用性

Java 运行时监控,第 3 部分: 监控应用程序生态系统的性能与可用性

在本系列(共三篇文章)的 1 部分 2 部分 中,我介绍了监控 Java 应用程序的技巧和模式,在这两部分中我把重点放在了 JVM 和应用程序类上。在这最后一期中,我将介绍从应用程序的依赖项(诸如底层操作系统、网络或者应用程序的后端数据库)收集性能与可用性数据的技巧。在文章结 尾我将论述管理收集数据的模式以及报告和可视化数据的方法。

基于 Spring 的收集器

2 部分 中,我实现了一个用于管理监控服务的基本的基于 Spring 的组件模型。该模型的基本原理及益处有:

  • 使用基于 XML 的配置,使得管理大量用于配置更复杂性能数据收集器的参数集变得更加容易。
  • 采用关注点分离 的结构,这样就可以使用更简单的组件,这些组件之间的相互交互可以通过注入 Spring 的依赖项来实现。
  • Spring 给简单的收集 bean 提供了一个生命周期,该周期由初始化启动 停止 操作组成,还提供了将 Java 管理扩展(Java Management ExtensionJMX)管理接口公开给 bean 的选项,这样就可以在运行时进行控制、监控和故障排除。

下面我将在本文的每个小节中介绍有关基于 Spring 的收集器的更多细节。

监控主机和操作系统

Java 应用程序总是运行于底层硬件和支持 JVM 的操作系统之上。一个全面的监控基础设施中最关键的组成就是从硬件和 OS — 通常是通过 OS 收集那里收集性能、健康状况和可用性指标的能力。本节就涵盖了一些通过在 1 部分 中介绍的 ITracer 类获取这类数据并一直跟踪到应用程序性能管理系统(application performance managementAPM)的技巧。

典型的 OS 性能指标

下面这份摘要列出了典型指标,这些指标跨域操作系统的多个部分相关。虽然数据收集的细节迥异,而且数据的解释也必须在给定的 OS 上下文中进行,但是这些指标在大多数标准主机上基本都是等效的:

  • CPU 使用:表示特定主机上的 CPU 的占用情况。单位通常为百分比的使用率,在较低的级别将 CPU 忙碌时间表示为消逝的时钟时间的某个特定时期的百分比。主机可以有多个 CPU,而 CPU 又可以包含多个内核,但多个内核通常都被 OS 抽象出来代表一个 CPU。例如,一个带有两个双核 CPU 的主机会被说成有四个 CPU。指标通常可以按照每个 CPU 收集或者作为总资源利用率收集,后者表示所有处理器的总体使用情况。到底是要分别监控每一个 CPU 还是监控总体 CPU,通常要取决于软件的本质及其内部架构。标准的多线程 Java 应用程序通常默认平衡所有 CPU 上的负载,所以监控总体较合适。但在某些情况下,个别 OS 进程是特定于特定 CPU 的,这时总体指标可能无法捕获到适当级别的粒度

CPU 的使用通常被拆分成四个范畴:

  •  
    • 系统:执行系统的或者 OS 内核级的活动耗费的处理器时间
    • 用户:执行用户活动耗费的处理器时间
    • I/O 等待:处于空闲状态等待完成某个 I/O 请求耗费的处理器时间
    • 空闲:暗指没有进行任何处理器活动

另外两个相关指标为运行队列长度(即等候 CPU 时间的请求的待处理事项)和上下文转换(即将处理器时间分配从一个进程转换到另一个进程的实例)。

  • 内存:最简单的内存指标为可用或使用中的物理内存的百分比。其他需要考虑的有虚拟内存、内存分配率和重新分配率以及表明内存有哪些区域被使用的更细粒度的指标。
  • 磁盘与 I/O:磁盘指标为每一个逻辑或物理磁盘设备的可用或使用中的磁盘空间的简单(但是至关重要的)报告,还有这些设备的读取和写入速率。
  • 网络:指网络接口上的数据传输速率错误发生率,它通常被分为高级的网络协议范畴,如 TCP IP
  • 进程与进程组:可以说前面所述的指标都是特定主机的总活动。它们也可以划分为相同的指标,但是代表个别进程或相关进程组 的消耗或活动。监控进程对资源的使用情况有助于解释主机上的每一个应用程序或者服务消耗的资源比例。有些应用程序只可以实例化一个进程;在其他情况下,一 个诸如 Apache 2 Web Server 这样的服务可以实例化代表一个逻辑服务的一群进程。

代理与无代理

不同的 OS 有着不同的性能数据获取机制。我将呈现的收集数据的方式很多,但是在监控领域您可能经常要区别的是基于代理 无代理 监控。也就是说在某些情况下,无需在目标主机上安装其他特定的软件也可以收集数据。但显然监控通常都会涉及到某种代理,因为监控总是需要一个接口,数据要 通过它来读取。所以这里真正区别的是是使用通常出现在给定 OS 中的代理诸如 Linux® 服务器上的 SSH — 还是安装其他专用于监控和使收集的数据对外部收集器可用的软件。两种方法都涉及到如下的权衡标准:

  • 代理需要安装其他的软件并可能需要应用定期的维护补丁。在带有大量主机的环境中,管理软件工作不利于使用代理。
  • 如果代理实际上是与应用程序相同的进程的一部分的话,哪怕它是一个单独的进程,代理进程的故障也将会蒙蔽监控。虽然主机本身仍在运行且健康状况良好,但是 APM 一定会因为无法到达代理而假定主机已停机。
  • 安装在主机上的代理可能要比无代理远程监控器的数据收集能力和事件监听能力强得多。而且,报告总体指标可能需要收集好几个原始底层指标,远程收集这些指标的效率会很低。而本地的代理则能够快速地收集数据,再合计数据,然后将合计的数据提供给远程监控器。

归根结底,最佳的解决方案可能就是既实现无代理的监控又实现基于代理的监控:本地代理负责收集大多数指标而远程监控器负责检查诸如服务器的运行情况和本地代理的状态这样的基本内容。

代理也可以有不同的选项。自治 代理按照自己的计划收集数据,反之,响应 代理按请求递送数据。此外,有些代理只将数据提供给请求程序,而有些则直接或间接地跟踪数据一直到 APM 系统。

接下来我将呈现监控带有 Linux UNIX® OS 的主机的技巧。

监控 Linux UNIX 主机

监控代理可以用来实现专门的本机库以从 Linux UNIX OS 收集性能数据。但是 Linux 和大多数 UNIX 变体都有很多内置数据收集工具,这些工具使得数据可以通过称为 /proc 的虚拟文件系统进行访问。该文件看起来像是普通文件系统目录里面的普通文本文件,但其实它们是常驻内存型数据结构,是通过文本文件抽取的。由于这种数据可 以很容易地通过大量标准命令行的实用工具或自定义的工具来读取和解析,所以这些文件较易于使用,而且它们的输出既可以是通用的也可以是专用的。而且它们的 性能也非常好,因为本质上它们是直接来源于内存的数据。

常见的用于从 /proc 中抽取性能数据的工具是 pssariostat vmstat(参见 参考资料 查阅有关这些工具的参考文献)。因此,一个有效地监控 Linux UNIX 主机的方法就是执行 shell 命令并解析响应。类似的监控器可以用于很多种 Linux UNIX 实现;虽然它们之间都有着些许差异,但是,使用一种可以完全重用收集过程的方式格式化数据是很简单的。相反,专用的本机库可能要根据每一个 Linux UNIX 发行版而进行重编码或重构(但它们正在读取的 /proc 数据有可能相同)。而编写专用于监控某一特定情况或可以标准化返回数据的格式这样的自定义 shell 命令很容易,并且开销较低。

现在我将展示几种调用 shell 命令和跟踪返回数据的方法。

Shell 命令的执行

要在一个 Linux 主机上执行数据收集监控,就一定要调用一个 shell。它可以是 bashcshksh 或其他任何允许调用目标脚本或命令并可以检索输出的、受支持的 shell。最通常的选择包括:

  • 本地 shell:如果目标主机上运行着 JVM 的话,那么线程可以通过调用 java.lang.Process 来访问这种 shell
  • 远程 Telnet rsh :这两个服务都允许调用 shell shell 命令,但由于它们的安全性相对较低,所以很少使用它们。它们在大多数现代发行版上的默认状态为禁用。
  • 安全 ShellSSHSSH 是最为常用的远程 shell。它提供了对 Linux shell 的完全访问,而且被公认是安全的。在文中基于 Shell 的例子里,我将主要使用该机制。大多数 OS 都提供 SSH 服务,包括所有 UNIX 系列、Microsoft® Windows®OS/400 z/OS

1 展示了本地 shell 与远程 shell 的基本差异:


1. 本地 shell 与远程 shell

要用服务器启动一个无人值守的对话需要进行一些设置。首先必须要创建一个由私钥公钥组成的 SSH 密匙对。然后将公钥置于目标服 务器,私钥置于远程监控服务器 —— 数据收集器可以在此获取该私钥。完成上述操作之后,数据收集器便能够提供私钥及其密码短语(passphrase),并能够访问目标服务器上的安全远程 shell 了。使用了密匙对之后,目标帐户的密码就是多余的了,根本不需要它。具体设置步骤如下:

  1. 确保目标主机在本地的已知主机的文件中有入口。这个文件列出了已知 IP 地址或名称以及为每一个已知 IP 地址或名称验证的相关 SSH 公钥。在用户级别,该文件通常为用户主目录中的 ~/.ssh/known_hosts 文件。
  2. 用监控帐户(例如,monitoruser)连接到目标服务器。
  3. 在主目录中创建一个名为 .ssh 的子目录。
  4. 将目录改为 e .ssh 目录并发布 ssh-keygen -t dsa 命令。该命令提示密钥名和密码短语。然后会生成两个叫做 monitoruser_dsa(私钥)和 monitoruser._dsa.pub(公钥)的文件。
  5. 将私钥复制到一个安全的可访问的位置,数据收集器将从这个位置运行。
  6. cat monitoruser_dsa.pub >> authorized_keys 命令将私钥内容追加到 .ssh 目录中名为 authorized_keys 的文件中。

清单 1 展示了我刚才所描述的过程:


清单 1. 创建一个 SSH 密匙对

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值