MTool:多平台系统性能监控

作者:Andrej Sostaric,

对于这样一个小型软件包来说,标题显得相当长,但它准确地描述了本文的内容。在我们的网络世界中,信息量正在增长且变得越来越难以管理。开发性能工具的最初想法来自于 CERT 工程师 (Gygi),他为欧洲的学术网络之一——SWITCH,瑞士学术与研究网络工作。SWITCH 的总部位于苏黎世。不到二十几位高素质的工程师在瑞士各地约 50 个站点以及苏黎世联邦理工学院计算中心的中央 SWITCH 系统中工作。

虽然 SWITCH 已经在使用一些性能监控工具,但其过程远非令人满意。每次工程师想要监控远程系统时,他们都必须登录并使用常见的工具,如 toppsdf 等。这引入了不必要的安全风险。

SWITCH 需要的是一个简单、可靠、安全的工具,可以从网络(或互联网)中任何授权的地方轻松使用。该工具应该是紧凑的——它不能占用太多系统资源。此外,它应该是面向多平台的。尽管 SWITCH 主要维护 Sun 工作站,但他们监控的 Linux 机器和其他 UNIX 系统的数量也不容忽视。作为第一步,我们对监控基本的系统资源感兴趣:CPU/内存/交换空间使用情况和一些特定的进程(如 inetd 等守护进程)。这些资源提供了被监控系统的快照。在第二阶段,我们决定观察一些额外的参数,如网络流量、磁盘使用情况、用户/ftp 连接以及其他一些进程。

图 1. MTool 的三层架构

三层架构和 Java

对于多平台、安全工具的需求,我们做出了一个简单的决定——Java。由于我们的实验室拥有一支强大的学生 Java 团队,因此选择 Java 作为基本开发工具。Java 是一种面向网络、健壮的工具,并为我们的需求提供了足够的安全性。我们不会深入探讨该语言的细节,但很明显,Java 不适合访问系统资源所需的系统级编程。因此,我们选择了三层架构(见图 1)。这种架构代表了对标准两层客户端/服务器网络架构的一些缺点的回应。客户端/服务器应用程序非常容易编程;问题是如何管理客户端软件。当我们需要多平台环境时,问题甚至更大。三层架构引入了所谓的中间件(例如,图 1 中的 Java 服务器)。基本上,驻留在服务器上的中间软件代表了客户端和服务器之间的桥梁。中间层不仅能够处理更多的客户端连接,而且还提供了一种更安全的通信方法。由于中间件和客户端部分都可以用 Java 编写,我们得出了一个非常重要的问题——平台独立性。

不再期望客户端使用平台相关的代码。更重要的是,一个启用 Java 的网络浏览器(如 Netscape)就足够了。开发人员现在可以休息一下了,因为他们不必编写大量平台相关的软件版本。这个基本思想也用于网络计算机 (NC)。每当开发人员更改客户端代码时,都可以为中间层服务器上的分发提供新版本。然后,客户端下次运行程序时,会自动下载新版本。通过中间件向客户端提供信息的平台相关软件是用 ANSI C 编写的。中间件和服务器之间的通信是使用套接字完成的。

Linux

正如我们已经提到的,我们为 Sun 工作站编写了一个守护进程 (mtoold),因为它们在瑞士的学术网络中占多数。然而,我们的环境主要配备了 HP 工作站;我们还在教室和实验室周围拥有 70 多台 Linux 机器,以及 Windows 95/NT 计算机。自 1993 年我们使用 0.99pl15 内核构建了第一台 Linux 机器以来,我们从 Linux 中学到了很多。自那时以来,Linux 取得了巨大的进步。

因此,对我们来说,Linux 作为开发“游乐场”是一个合乎逻辑的选择。Linux 具有文档完善的 /proc 文件系统。(参见 Andrew M. Johnson 的“/proc 文件系统和 ProcMeter”,《Linux Journal》,1997 年 4 月。)Linux 是可用的文档最完善的操作系统。我们最缺少的是一个好的 Java 开发工具。如果 Linux 拥有像 Symantec 的 Visual Cafe 这样的 GUI,我们会非常高兴。当时,我们仍然被迫使用标准 Java 开发工具包(JDK 1.0.2 或 JDK 1.1.1)附带的命令行 Java 编译器和解释器。因此,我们在 Windows 下使用 Visual Cafe 创建用户界面,然后手动添加一些特定的代码。

MTool 的架构

事实证明,三层架构是一个很好的解决方案。我们定义了三个不同的层级

  1. 客户端软件

  2. 中间件

  3. 平台相关的守护进程

要监控特定系统,您必须连接到网络;实际上,您必须连接到中间层 Java 服务器。客户端只呈现一个 GUI(图形用户界面)。由于它是用 Java 编写的,因此您只需要一个支持 Java 的浏览器。在您连接到 Java 服务器后,GUI 代码将被传输到您的本地机器。然后,代码将由 Java 内置解释器(如果您使用 Netscape,例如)解释。

我们系统的中心点是中间层 Java 服务器。它不仅保存要传输到本地客户端的 Java 类,而且还负责监控。Java 服务器是一个始终运行但仅需要少量系统资源的程序。它连接到被监控的计算机并向它们请求新数据。通信通过套接字处理,非常简单。我们还引入了一个非常简单的数据传输协议。

客户端软件

在客户端,必须运行一个启动小程序以调出基本窗口,其中列出了所有要监控的计算机(见图 2)。一旦我们从列表中选择了一台计算机的名称,就会出现第二个窗口,其中包含有关被观察系统的所有信息。我们使用了一个选项卡式面板来显示不同类型的数据。我们之所以选择选项卡式面板,是为了简化升级过程。如果我们添加新的系统信息,图形界面不会有问题——我们只需添加一个新的面板。

图 2. MTool 主窗口

目前我们可以提供以下系统资源

  • CPU 信息(用户、nice、空闲、系统、平均值)

  • 磁盘和内存信息(空闲、已用、交换空间)

  • 网络流量

  • 进程

  • 用户连接

图 3. CPU 使用率面板

图 4. 磁盘信息和内存使用率面板

图 5. 网络传输面板

图 6. 进程(预配置选择)面板

图 7. 用户连接面板

中间件——Java 服务器

Java 服务器旨在独立计算机上运行,但它也可以在被监控计算机的客户端上运行。通过套接字与被监控计算机的通信非常短暂,并且仅持续数据传输的时间。在任何时候,我们都可以选择 Java 服务器请求系统资源数据的频率。届时,将向所有被监控计算机发送“ping”。在 ping 时,mtooldinetd 唤醒。然后 mtoold 读取系统资源信息并将该信息转发到中间层 Java 服务器。完成后,mtoold 守护进程将“休眠”直到下一个服务器的 ping。因此,平台相关的 mtoold 仅在很短的时间内使用系统资源。

为了运行,Java 服务器由一个名为 MTool.conf 的配置文件支持。该文件的第一部分包含要监控的计算机列表,然后是监控间隔之间的时间,最后是授权与 Java 服务器通信并因此监控选定计算机系统的客户端计算机列表。我们可以使用 IP 地址或 IP 主机名或两者都使用。正如您可以从下面的示例配置文件中看到的那样,在定义域名或子网地址时,也可以使用星号通配符。

# First, the hosts to be moni-
# tored
cebelica.uni-mb.si
mravljica.uni-mb.si
cmrlj.uni-mb.si
strela.fcs.uni-mb.si
grom.uni-mb.si
164.8.253.16
# Second, monitoring time inter-
# val in seconds
4
# Last, clients with access to
# monitored hosts
*.hermes.si
130.216.54.51
164.8.253.99
130.15.40.*
193.246.15.*
164.8.253.*
平台相关的守护进程

守护进程 mtoold 是用 ANSI C 编写的,并且是平台相关的。对于 Linux,我们使用 /proc 文件系统来获取 CPU、内存和网络信息。Sun 和 HP 没有提供如此优雅的方法;在这些平台上,我们必须使用 /dev/kmem 文件。

我们定义了一个用于套接字通信的协议。信息以 ASCII 流的形式传输,该流由保留字(如 GRAPHVALUEdiskuserprocess 等)和用字符 | 作为分隔符分隔的特定值连接而成。通过这种方式,我们可以轻松地添加新的观察参数。一个示例流如下所示

GRAPH|LOAD_avg1|0.06|GRAPH|LOAD_avg2|0.12|GRAPH|
LOAD_avg3|0.22|GRAPH|CPU_user|1.00|GRAPH|CPU_nice|
0.00|GRAPH|CPU_system|0.00|GRAPH|CPU_idle|99.00|
VALUE|MEM_real|14652K|VALUE|MEM_free|252K|VALUE|
MEM_swap|33260K|VALUE|MEM_swap_free|31620K|

目前,有可能拦截通过网络传输的数据;因此,我们正在准备 Java 加密类以实现安全的数据传输。我们目前正在评估 DES 和 RSA 算法。RSA 将用于密钥交换(公钥和私钥),而速度更快的 DES 将用于数据传输。

mtoold 使用一个简单的配置文件,其中保存了要监控的进程的名称。如果此文件为空,则有关当前在被监控计算机上运行的所有进程的信息将通过套接字通信线路传输。

结尾

实际上,此时此刻,我们尚未完成。当前版本的 MTool 只是朝着更复杂和更实用的工具迈出的中间一步;然而,它仍然提供了一种舒适的系统监控方式。如果我们获得授权,我们可以从世界任何地方监控选定的系统——一个支持 Java 的浏览器是唯一必需的。MTool 是一款小型、功能强大的工具,具有许多优点。虽然使用 Linux 作为开发环境是一个不错的选择,但我们仍然希望呼吁(非)商业软件公司在 Linux 下提供更多 Java 开发工具。Linux 和 Java 共同代表了一个有竞争力、可靠且廉价的开发系统。

MTool: Performance Monitoring for Multi-platform Systems
Andrej Sostaric (andrej.sostaric@uni-mb.si) 是马里博尔电气工程与计算机科学学院的助理,也是斯洛文尼亚马里博尔大学和法国南特大学的博士生。他的主要兴趣是信号处理、操作系统、音乐、他的儿子 Miha 和建造房屋。

MTool: Performance Monitoring for Multi-platform Systems
Milan Gabor (milan.gabor@uni-mb.si) 是马里博尔 EE 和 CS 学院的二年级本科生。学生权利的伟大斗士,并在 www.experts-cxchange.com/ 上被评为第一名。如果附近有 Bryan Adams 演唱会,他就会在那里。

MTool: Performance Monitoring for Multi-platform Systems
Andreas Gygi (gygi@switch.ch) 博士是 SWITCH,瑞士学术与研究网络,苏黎世的系统管理员和 CERT 工作人员。
加载 Disqus 评论