Linux操作系统高性能集群监控管理之道

监控是集群管理的核心任务 。监控数据可用于调度任务、负载平衡、向管理员报告软硬件故障 , 并广泛地控制系统使用情况 。监控信息必须在不影响集群性能的情况下获得 。本文将讨论使用/proc文件系统和Java来获得监控数据的方法 。
【Linux操作系统高性能集群监控管理之道】Java在Linux集群中的应用
Java技术为集群管理开发者提供了许多解决问题的办法 。Java是动态、灵活、可移植的 , 这些不寻常的特征使得它成为了在异构网络及平台上构造集群管理的理想基础 。
Java具有广泛的例程库 , 很容易处理IP协议 , 如TCP、UDP , 并可在multi-homed主机上进行网络程序设计 , 用它创建网络连接比用C或C++更容易 。通过Java本地接口(JNI) , 运行在Java 虚拟机(JVM)内的Java代码能够与用其它语言编写的应用及库文件相互操作并汇编 。
在构造集群监控和管理时 , Java早已是一个可选的语言 。然而 , Java语言通常只被用于系统的前端或集群主机部分 , 而将用C 语言编写的守护进程安装在集群结点上 。尽管Java程序设计语言提供了许多优点 , 但是 , 对于高性能集群监控 , Java能够有效地替换运行在每个结点上的C 语言守护进程吗?这将是本文讨论的重点 。
高性能监控
监控Linux集群工具传统上以秒为测量频率来提供有限量的数据 。而高性能集群监控被定义为“以intrasecond为测量频率 , 从结点有效地采集数据的能力 。当涉及较大集群时 , 监控软件的低效率问题就变得更加严重 , 这是因为所运行的应用软件必须互相协调或共享全局资源 。
在一个结点上的阻隔冲突(Interference)能影响其它结点上作业的运行 。例如 , 一个MPI作用需要与所有参与的结点同步 。一种解决办法是收集少量的数据 , 并以小频率传输 。然而 , 如果是高性能监控 , 这种解决办法是不可接受的 , 因为有较重利用率的集群应该被频繁持续地监控 。本地作业调度器必须能够基于资源使用情况做快速决策 。管理员经常希望收到紧急事件的立即通知 , 并希望观察到历史趋势数据 , 如果集群不能被频繁持续地监控 , 那么这些要求是不可能实现的 。因此 , 必须采取一些措施 , 如使用更有效的算法、增加传输的并行性、提高传输协议及数据格式的效率、减少冗余等 。
在跟踪运行中的资源使用情况时 , 压缩Profiling应用有助于调试程序或优化程序 。对一个给定的应用而言 , 像存储器、网络、CPU这样动态资源的使用可能快速地改变着 , 为了能够观察应用是怎样使用这些资源的 , 一种可能的办法是使用高频率的监控 。
即使用户对高频率监控没有兴趣 , 如果算法是有效的 , 不管监控频率是多少 , 它也将消费很少的资源 。在异构集群中这种效率将更重要 , 用户的作业可以被分散到较快的及较慢的结点上 , 慢的结点需要全部CPU来跟上较快的结点并与之同步 。一个监控程序花费在较慢结点上的CPU时间是作业的关键路径 。
监控阶段
集群监控主要消耗CPU周期与网络带宽这两个重要资源 。然而 , 资源消费问题与这两个资源是根本不同的 。CPU利用问题对结点而言是完全本地化的问题 , 可通过创建有效的收集与合并算法来解决 。网络带宽是共享资源 , 是规模问题 , 可以通过最小化网络上传输的数据量来解决 。
为了解决这两个问题 , 我们将集群监控分为三个阶段:收集、合并、传输 。收集阶段负责从操作系统装载数据、分析数据值 , 并存储数据 。合并阶段负责将来自多个数据源的数据合在一起 , 决定数据值是否改变并过滤它们 。传输阶段负责压缩并传输数据 。本文集中讨论Linux集群监控的收集阶段 。

推荐阅读