zoukankan      html  css  js  c++  java
  • Linux集群监控工具简介:Ganglia和Nagios

    11年时候,曾经对 Ganglia 和 Nagios有一定接触,这是两个用于监视数据中心的工具。这两个工具被大量用于高性能计算(HPC)环境中,但是它们对于其他环境也具有很大的吸引力(例如云、呈现集群和托管中心)。此外,两者对监视的定义也采取了不同的侧重点。Ganglia 更多地与收集度量数据并随时跟踪这些数据有关,而 Nagios 一直致力于成为一种报警机制。

    真么多年过去了,这两个工具还是挺有用的。,这里有一定的介绍:http://os.51cto.com/art/201104/255361_all.htm

    随着数据中心的增长和管理人员的缩减,对计算资源使用有效监视工具的需求变得比以往更加迫切。术语监视 在应用到数据中心时可能会让人混淆,因为它的含义会根据具体的说话者和听众而有所不同。例如:

    • 在集群中运行应用程序的人员会思考:“我的作业什么时候运行?它什么时候会完成?以及与上一次相比,它是怎样执行的?”
    • 网络运营中心(NOC)的操作员会思考:“什么时候会出现表示需要解决问题的红灯并安排服务电话?”
    • 系统工程部的人员会思考:“我们的机器如何执行?所有服务是否运行正常?我们可以看到哪些趋势以及如何更好地利用计算资源?”

    面对如此多的定义,您必须查找大量的代码才能监视您真正想要监视的内容,不仅如此,还存在无数的产品和服务。可是幸运的是,许多监视工具都是开源的 —— 实际上,某些开源工具的表现比尝试完成同样工作的某些商业应用程序还要好。

    使用开源监视工具最困难的部分是实现适合环境的安装和配置。使用开源监视工具的两个主要问题是:

    • 没有一个工具可以按照期望的方式监视所需的所有内容。为什么?因为不同的用户将以不同的方式定义监视(正如我刚才所述)。
    • 由于存在第一个问题,因此要让工具完全按照期望在数据中心中工作可能需要完成大量自定义。为什么?因为不管多么地标准,每一个环境也都是独一无二的。

    顺便说一句,商业监视工具也同样存在这两个问题。

    因此,我将介绍 Ganglia 和 Nagios,这是两个用于监视数据中心的工具。这两个工具被大量用于高性能计算(HPC)环境中,但是它们对于其他环境也具有很大的吸引力(例如云、呈现集群和托管中心)。此外,两者对监视的定义也采取了不同的侧重点。Ganglia 更多地与收集度量数据并随时跟踪这些数据有关,而 Nagios 一直致力于成为一种报警机制。

    随着独立项目的发展,逐步出现了交叠。例如:

    • Ganglia 过去要求代理运行在每台主机上以从中收集信息,但是现在可以通过 Ganglia 的欺骗机制获得度量数据。
    • Nagios 过去也是仅用于从目标主机中轮询信息,但是现在提供了在目标主机上运行代理的插件。

    虽然这些工具在某些功能领域里已经发生交叠,但是两者之间还是有许多不同之处,可以让您从运行这两个工具中获益。同时运行两个工具可以相互弥补不足:

    • Ganglia 没有内置通知系统,而 Nagios 在这方面表现杰出。
    • Nagios 似乎没有适合目标主机的可伸缩内置代理(这是一个争议点),而 Ganglia 在设计之初就考虑到这点。

    还有其他开源项目也可以完成这两个工具完成的工作,并且有些项目在某些领域做得比其他项目好。常用开源监视解决方案包括 Cacti、Zenoss、Zabbix、Performance Copilot(PCP)和 Clumon(而且我相信您已经有了自己喜欢的选择)。这些工具(包括 Ganglia 和一些 Nagios 插件)中的许多工具在底层都使用了 RRDTool 或 Tobi Oetiker 的 MRTG(Multi Router Traffic Grapher),以生成漂亮的图形和存储数据。

    尽管用于监视数据中心的开源解决方案如此众多,我却经常惊讶地发现许多向外扩展的计算中心在开发自己的解决方案,而忽略其他人已经完成的工作。

    在这个两部分文章中,我将讨论 Ganglia 和 Nagios,因为有一些事实证据表明这些工具是最常用的。尽管将两者集成在一起是非常普遍的实践(尤其是在一些大型的 HPC 实验室和大学里),但是我发现很少有文章对此进行介绍。

    学完本系列,您应当能够安装 Ganglia 并与 Nagios 绑定在一起,并且可以回答不同的用户组向您询问的监视问题。这只是一个开始,但是应当可以帮助您了解基础知识并逐步把握集群的整体情况。

    在本文中,我将指导您完成:

    • 安装和配置基本的 Ganglia 设置。
    • 如何使用 Python 模块来用 IPMI(Intelligent Platform Management Interface)扩展功能。
    • 如何使用 Ganglia 主机欺骗来监视 IPMI。

    我们的目标 —— 设置 HPC Linux® 集群的基准监视系统,在其中可以在某个程度上解决上面所述的三个不同监视意图:

    • 应用程序人员可以看到队列的排队情况如何,并可以看到运行作业的可用节点。
    • NOC 可以收到系统故障报警或者在 Nagios Web 界面上看到一个闪亮的红色错误指示灯。如果节点出现故障或者温度过高,他们也可以通过电子邮件收到通知。
    • 系统工程师可以绘制数据曲线图、报告集群利用情况并决定未来采购哪些硬件。

    Ganglia 简介

    Ganglia 是 UC Berkeley 发起的一个开源监视项目,设计用于测量数以千计的节点。每台计算机都运行一个收集和发送度量数据(如处理器速度、内存使用量等)的名为 gmond 的守护进程。它将从操作系统和指定主机中收集。接收所有度量数据的主机可以显示这些数据并且可以将这些数据的精简表单传递到层次结构中。正因为有这种层次结构模式,才使得 Ganglia 可以实现良好的扩展。gmond 带来的系统负载非常少,这使得它成为在集群中各台计算机上运行的一段代码,而不会影响用户性能。

    所有这些数据收集会多次影响节点性能。网络中的 “抖动(Jitter)” 发生在大量小消息同时出现时。我们发现通过将节点时钟保持一致,就可以避免这个问题。

    安装 Ganglia

    Internet 中有许多介绍如何安装 Ganglia 的文章和参考资料。我们将重新查看我在 xCAT 维基中撰写的一篇文章。我假定出于本文的目的,操作系统是 Red Hat 5 Update 2(但是对于其他企业 Linux 操作系统,这些步骤不会有很大差别)。

    先决条件

    假定您已经设置了 yum 库,安装先决条件在很大程度上应当十分简单。类似于以下代码:

    yum -y install apr-devel apr-util check-devel cairo-devel pango-devel libxml2-devel
      rpmbuild glib2-devel dbus-devel freetype-devel fontconfig-devel gcc-c++ expat-devel
      python-devel libXrender-devel
    

    (注:Yum 实际上应该可以处理大多数依赖关系,但是在我的一个测试中,我看到编译失败,而这些失败可以通过添加所有这些包来修正。)

    在获得这些包之后,您需要满足另一个不在 Red Hat 库中的先决条件。您可以像下面这样获取并构建它,只要您的机器连接了 Internet:

    wget  http://ga13.files.bigpond.com:4040/fedora/linux/releases/9/Everything/source/
           SRPMS/libconfuse-2.6-1.fc9.src.rpm
    
    rpmbuild --rebuild libconfuse-2.6-1.fc9.src.rpm
    cd /usr/src/redhat/RPMS/x86_64/
    rpm -ivh libconfuse-devel-2.6-1.x86_64.rpm libconfuse-2.6-1.x86_64.rpm
    

    记住,镜像经常变化。如果此镜像不工作,则使用搜索引擎查找 libconfuse-2.6.-1.fc9 source RPM。

    RRDTool

    RRDTool 表示:轮循数据库工具(Round Robin Database Tool)。它是由 Tobias Oetiker 创建的,并且为许多高性能监视工具提供了引擎。Ganglia 是其中之一,但是 Cacti 和 Zenoss 是另外两个。

    要安装 Ganglia,首先需要让 RRDTool 运行在监视服务器上。RRDTool 将提供其他程序使用的两个非常优秀的功能:

    • 它将在轮循数据库中存储数据。随着捕捉的数据变得越来越旧,解析的精确性将变得越来越低。这将占用很少的内存并且在大多数情况下仍然有用。
    • 它可以通过使用命令行实参根据捕捉的数据生成图形。

    要安装 RRDTool,请运行以下代码(对 1.3.4 版和 1.3.6 版进行了测试):

    cd /tmp/
    wget http://oss.oetiker.ch/rrdtool/pub/rrdtool.tar.gz
    tar zxvf rrdtool*
    cd rrdtool-*
    ./configure --prefix=/usr
    make -j8
    make install
    which rrdtool
    ldconfig  # make sure you have the new rrdtool libraries linked.
    

    使用 RRDTool 作为环境中的独立工具有许多种方法,但是我在这里不会介绍这些方法。

    Ganglia 安装

    现在已满足所有先决条件,您可以安装 Ganglia。首先需要获得它。在本文中,我们使用的是 Ganglia 3.1.1。下载 ganglia-3.1.1.tar.gz 文件并将其放在监视服务器的 /tmp 目录中。然后执行以下代码:

    cd /tmp/
    tar zxvf ganglia*gz
    cd ganglia-3.1.1/
    ./configure --with-gmetad
    make -j8
    make install
    

    您应当会退出,而不会遇到任何错误。如果看到错误,则可能需要检查缺少哪些库。

    配置 Ganglia

    现在基本安装已完成,需要设置几个配置项才能运行。执行以下步骤:

    1. 处理命令行文件。
    2. 修改 /etc/ganglia/gmond.conf。
    3. 注意多宿主(multi-homed)计算机。
    4. 在管理服务器中启动它。

    步骤 1:处理命令行文件

    如下所示:

    cd /tmp/ganglia-3.1.1/   # you should already be in this directory
    mkdir -p /var/www/html/ganglia/  # make sure you have apache installed
    cp -a web/* /var/www/html/ganglia/   # this is the web interface
    cp gmetad/gmetad.init /etc/rc.d/init.d/gmetad  # startup script
    cp gmond/gmond.init /etc/rc.d/init.d/gmond
    mkdir /etc/ganglia  # where config files go
    gmond -t | tee /etc/ganglia/gmond.conf  # generate initial gmond config
    cp gmetad/gmetad.conf /etc/ganglia/  # initial gmetad configuration
    mkdir -p /var/lib/ganglia/rrds  # place where RRDTool graphs will be stored
    chown nobody:nobody /var/lib/ganglia/rrds  # make sure RRDTool can write here.
    chkconfig --add gmetad  # make sure gmetad starts up at boot time
    chkconfig --add gmond # make sure gmond starts up at boot time
    

    步骤 2:修改 /etc/ganglia/gmond.conf

    现在可以修改 /etc/ganglia/gmond.conf 以命名集群。假定集群名称为 “matlock”;则可以将 name = "unspecified" 更改为 name = "matlock"

    步骤 3:注意多宿主计算机

    在我的集群中,eth0 是我的系统的公共 IP 地址。但是,监视服务器将通过 eth1 与私有集群网络中的节点进行通信。我需要确保 Ganglia 使用的多点传送将与 eth1 绑定在一起。这可以通过创建 /etc/sysconfig/network-scripts/route-eth1 文件来完成。添加 239.2.11.71 dev eth1 内容。

    然后您可以使用 service network restart 重新启动网络并确保路由器显示此 IP 通过 eth1。注:您应当使用 239.2.11.71,因为这是 ganglia 的默认多点传送通道。如果使用其他通道或者增加更多通道,请更改它。

    步骤 4:在管理服务器中启动它

    现在您可以在监视服务器中完全启动它:

    service gmond start
    service gmetad start
    service httpd restart
    

    停止 Web 浏览器并将其指向位于 http://localhost/ganglia 的管理服务器。您将看到管理服务器现在处于受监视状态。您还将看到若干度量数据正受到监视并绘制曲线图。最有用的曲线图之一是您可以监视这台计算机中的负载情况。下面是我的计算机的负载情况图:

    图 1. 监视负载
    监视负载  

    没有发生什么操作,计算机只是处于空闲状态。

    把 Ganglia 放在节点上

    到现在为止,我们已经完成了在管理服务器中运行 Ganglia 的工作;现在必须更多地关注计算节点。事实证明只需复制一些文件就可以把 Ganglia 放到计算节点上。这是在使用 Kickstart 时可以添加到安装后脚本中的内容或是可以添加到其他更新工具中的内容。

    快速但粗糙的方法是这样的:创建一个含有所有主机名的文件。假定您有 deathstar001-deathstar100 节点。则将拥有类似如下所示的名为 /tmp/mynodes 的文件:

    deathstar001
    deathstar002
    ...skip a few...
    deathstar099
    deathstar100
    

    现在只需运行以下代码:

    # for i in `cat /tmp/mynodes`; do 
    scp /usr/sbin/gmond $i:/usr/sbin/gmond
    ssh $i mkdir -p /etc/ganglia/
    scp /etc/ganglia/gmond.conf $i:/etc/ganglia/
    scp /etc/init.d/gmond $i:/etc/init.d/
    scp /usr/lib64/libganglia-3.1.1.so.0 $i:/usr/lib64/
    scp /lib64/libexpat.so.0 $i:/lib64/
    scp /usr/lib64/libconfuse.so.0 $i:/usr/lib64/
    scp /usr/lib64/libapr-1.so.0 $i:/usr/lib64/
    scp -r /usr/lib64/ganglia $i:/usr/lib64/
    ssh $i service gmond start
    done
    

    您可以重新启动 gmetad,刷新 Web 浏览器,然后应当会看到节点现在出现在列表中。

    您可能会遇到下面这些潜在的问题:

    • 您可能也需要按照前面的步骤 3 那样对节点明确设置静态路由。
    • 您的防火墙可能会阻塞端口。gmond 将在端口 8649 上运行。如果 gmond 是在计算机中运行,您应当能够运行 telnet localhost 8649 命令。并看到一些 XML 输出滚动显示在屏幕中。

    观察 Ganglia

    许多系统工程师很难理解他们自己的工作量或者工作特性。他们可能有自定义代码或者没有对商业产品的运行进行研究。Ganglia 可以帮助剖析应用程序。

    我们将使用 Ganglia 来检验运行 Linpack 基准的属性。图 2 显示了启动三项不同的 Linpack 作业的时间间隔。

    图 2. 观察 Linpack
    观察 Linpack  

    从此图中可以看到,当作业开始时,在作业启动时网络中有一些活动。但是,有趣的是接近作业结束时,网络流量增加了很多。如果您不了解 Linpack,您至少会认为:网络流量在作业结束时增加。

    图 3 和图 4 分别显示 CPU 和内存使用率。在这里,您可以看到正在逼近处理器的限制,而且内存使用率也非常高。

    图 3. CPU 使用率 
    CPU 使用率 

    图 4. 内存使用率
    内存使用率  

    这些图形让我们深入了解正在运行的应用程序:我们正在使用大量 CPU 和内存并且在接近作业结束时造成更多网络流量。关于这项作业还有很多其他属性是我们不知道的,但是这给我们提供了一个很好的开端。

    知道这些情况可以帮助在未来购买更多硬件时做出更好的采购决定。当然,没有人购买硬件只是为了运行 Linpack ……对么?

    扩展能力

    基本 Ganglia 安装已经给我们提供了大量有用信息。使用 Ganglia 的插件将给我们提供两种添加更多功能的方法:

    • 通过添加带内(in-band)插件。
    • 通过添加一些其他来源的带外(out-of-band)欺骗。

    第一种方法一直是 Ganglia 的常见实践。第二种方法是最新开发的实践,并且与 Nagios 在功能上有所交叠。让我们通过一个实际示例来简要探究两种方法。

    带内插件

    带内插件可以通过两种方式发生。

    • 使用 cron-job 方法并调用 Ganglia 的 gmetric 命令来输入数据。
    • 使用新 Python 模块插件并撰写它的脚本。

    第一种方法是过去常采用的方法,并且我将在下一节中讨论更多关于带外插件的内容。它的问题是无法干净地完成。Ganglia 3.1.x 添加了 Python 和 C 模块插件以使其看上去可以更加自然地扩展 Ganglia。此刻,我将向您展示第二种方法。

    首先,用 Ganglia 启用 Python 插件。执行以下操作:

    1. 编辑 /etc/ganglia/gmond.conf 文件。

    如果打开该文件,您会注意到:其中四分之一的内容都是类似如下所示的名为 modules 的部分:

    modules {
        module {
               name = "core_metrics"
         }
         ...
    }
    

    我们将向模块部分添加另一个模块。这个必须添加的模块就是:

      module {
        name = "python_module"
        path = "modpython.so"
        params = "/usr/lib64/ganglia/python_modules/"
      }
    

    在 gmond.conf 中,我在第 90 行添加了上一个代码段。这将允许 Ganglia 使用 Python 模块。此外,还在 include ('/etc/ganglia/conf.d/*.conf') 语句后添加一些行,添加 include ('/etc/ganglia/conf.d/*.pyconf') 行。这些包括了要添加的内容的定义。

    1. 创建一些目录。

    如下所示:

    mkdir /etc/ganglia/conf.d
    mkdir /usr/lib64/ganglia/python_modules
    
    1. 在所有节点上重复执行步骤 1 和 2。

    为此,执行下面的操作:

    • 把新的 gmond.conf 复制到要监视的各个节点上。
    • 在要监视的各个节点中创建步骤 2 中所示的两个目录,以便它们也可以使用 Python 扩展。

    现在已经设置好节点可以准备运行 Python 模块了,让我们创建一个新模块。在本例中,我们将添加一个使用 Linux IPMI 驱动程序的插件。如果不熟悉 IPMI 并且使用的是现代的 Intel 和 AMD 计算机,则请了解一下这方面的内容(请参阅 参考资料)。

    我们将使用开源 IPMItool 与本地计算机中的 IPMI 设备进行通信。还有若干其他选项,如 OpenIPMI 或 freeipmi。这只是一个示例,因此如果您想要使用其他选项,那么完全没有问题。

    在开始使用 Ganglia 之前,确保 IPMItool 可以在您的计算机中工作。运行 ipmitool -c sdr type temperature | sed 's/ /_/g' 命令;如果该命令不工作,请尝试装入 IPMI 设备驱动程序并再次运行:

    modprobe ipmi_msghandler
    modprobe ipmi_si
    modprobe ipmi_devintf
    

    在运行 ipmitool 命令后,我的输出显示:

    Ambient_Temp,20,degrees_C,ok
    CPU_1_Temp,20,degrees_C,ok
    CPU_2_Temp,21,degrees_C,ok
    

    因此在我的 Ganglia 插件中,我将只监视周围环境温度。我已经创建了一个编写得不是很好的名为 ambientTemp.py 的插件,该插件将根据在 Ganglia 维基中找到的插件使用 IPMI:

    清单 1. 编写得不是很好的 Python 插件 ambientTemp.py

    import os
    def temp_handler(name):
      # our commands we're going to execute
      sdrfile = "/tmp/sdr.dump"
      ipmitool = "/usr/bin/ipmitool"
      # Before you run this Load the IPMI drivers:
      # modprobe ipmi_msghandler
      # modprobe ipmi_si
      # modprobe ipmi_devintf
      # you'll also need to change permissions of /dev/ipmi0 for nobody
      # chown nobody:nobody /dev/ipmi0
      # put the above in /etc/rc.d/rc.local
    
      foo = os.path.exists(sdrfile)
      if os.path.exists(sdrfile) != True:
        os.system(ipmitool + ' sdr dump ' + sdrfile)
    
      if os.path.exists(sdrfile):
        ipmicmd = ipmitool + " -S " + sdrfile + " -c sdr"
      else:
        print "file does not exist... oops!"
        ipmicmd = ipmitool + " -c sdr"
      cmd = ipmicmd + " type temperature | sed 's/ /_/g' "
      cmd = cmd + " | awk -F, '/Ambient/ {print $2}' "
      #print cmd
      entries = os.popen(cmd)
      for l in entries:
        line = l.split()
      # print line
      return int(line[0])
    
    def metric_init(params):
        global descriptors
    
        temp = {'name': 'Ambient Temp',
            'call_back': temp_handler,
            'time_max': 90,
            'value_type': 'uint',
            'units': 'C',
            'slope': 'both',
            'format': '%u',
            'description': 'Ambient Temperature of host through IPMI',
            'groups': 'IPMI In Band'}
    
        descriptors = [temp]
    
        return descriptors
    
    def metric_cleanup():
        '''Clean up the metric module.'''
        pass
    
    #This code is for debugging and unit testing
    if __name__ == '__main__':
        metric_init(None)
        for d in descriptors:
            v = d['call_back'](d['name'])
            print 'value for %s is %u' % (d['name'],  v)
    

    复制清单 1 并将其放到 /usr/lib64/ganglia/python_modules/ambientTemp.py 中。对集群中的所有节点都这样做。

    现在我们已经把脚本添加到了集群的所有节点中,告诉 Ganglia 如何执行脚本。创建名为 /etc/ganglia/conf.d/ambientTemp.pyconf 的新文件,内容如下:

    清单 2. Ambient.Temp.pyconf

    modules {
      module {
        name = "Ambient Temp"
        language = "python"
      }
    }
    
    collection_group {
      collect_every = 10
      time_threshold = 50
      metric {
        name = "Ambient Temp"
        title = "Ambient Temperature"
        value_threshold = 70
      }
    }
    

    将清单 2 保存到所有节点上。

    重新启动 gmond 之前必须完成的最后一件事是更改 IPMI 设备的权限,这样没有人 可以对它执行操作。这将使您的 IPMI 接口极易受到恶意攻击!

    这只是一个示例:chown nobody:nobody /dev/ipmi0

    现在在所有位置重新启动 gmond。如果运行正常,则应当可以刷新 Web 浏览器并看到类似如下所示的内容:

    图 5. IPMI 带内度量数据
    IPMI 带内度量数据  

    带内度量数据的好处是允许您在主机中运行程序,并通过其他度量数据使用的同一种收集机制将信息提供给链路。这种方法的缺点(尤其是对于 IPMI)是需要在主机上执行相当多的配置才能工作。

    注意,必须确保脚本是用 Python 编写的,配置文件已经存在,并且 gmond.conf 已正确设置。我们只执行一种度量!考虑一下编写其他度量所需执行的所有操作!针对每种度量在每台主机上执行此操作会变得非常烦人。IPMI 是带外工具,因此有一种更好的方法,不是吗?确实是。

    带外插件(主机欺骗)

    主机欺骗刚好是我们需要的工具。在这里使用功能强大的 gmetric 并告诉它我们正在其上运行的主机 —— gmetric 是将信息插入到 Ganglia 中的命令行工具。通过这种方法,您可以监视任何内容。

    gmetric 最精彩的部分是什么?大量已经编写好的脚本。

    作为一种学习体验,我将向您展示如何彻底改造运行 ipmitool 以远程访问计算机的方法:

    1. 确保 ipmitool 可以在带外正常工作。

    我已经设置了 BMC(目标计算机中的芯片),以便我可以在其中运行 IPMI 命令。例如:我的监视主机名为 redhouse。通过 redhouse,我希望监视集群中的所有其他节点。Redhouse 是gmetad 运行的位置,也是 Web 浏览器指向的位置(以便访问所有 Ganglia 信息)。

    我的集群中的一个节点拥有 x01 主机名。我把 x01 的 BMC 设为拥有解析到主机 x01-bmc 的 IP 地址。在这里,我尝试远程访问该主机:

    # ipmitool -I lanplus -H x01-bmc -U USERID -P PASSW0RD sdr dump  /tmp/x01.sdr
    Dumping Sensor Data Repository to '/tmp/x01.sdr'
    # ipmitool -I lanplus -H x01-bmc -U USERID -P PASSW0RD -S /tmp/x01.sdr  sdr type 
                                                                                Temperature
    Ambient Temp     | 32h | ok  | 12.1 | 20 degrees C
    CPU 1 Temp       | 98h | ok  |  3.1 | 20 degrees C
    CPU 2 Temp       | 99h | ok  |  3.2 | 21 degrees C
    

    看上去一切良好。现在让我们把它放到一个脚本中以提供给 gmetric

    1. 创建使用 ipmitool 的脚本以提供给 gmetric

    我们创建了下面的 /usr/local/bin/ipmi-ganglia.pl 脚本并将其放到监视服务器中:

    #!/usr/bin/perl
    # vallard@us.ibm.com
    use strict;  # to keep things clean... er cleaner
    use Socket;  # to resolve host names into IP addresses
    
    # code to clean up after forks
    use POSIX ":sys_wait_h";
    # nodeFile: is just a plain text file with a list of nodes:
    # e.g:
    # node01
    # node02
    # ...
    # nodexx
    my $nodeFile = "/usr/local/bin/nodes";
    # gmetric binary
    my $gmetric = "/usr/bin/gmetric";
    #ipmitool binary
    my $ipmi = "/usr/bin/ipmitool";
    # userid for BMCs
    my $u = "xcat";
    # password for BMCs
    my $p = "f00bar";
    # open the nodes file and iterate through each node
    open(FH, "$nodeFile") or die "can't open $nodeFile";
    while(my $node = <FH>){
      # fork so each remote data call is done in parallel
      if(my $pid = fork()){
        # parent process
        next;
      }
      # child process begins here
      chomp($node);  # get rid of new line
      # resolve node's IP address for spoofing
      my $ip;
      my $pip = gethostbyname($node);
      if(defined $pip){
        $ip = inet_ntoa($pip);
      }else{
        print "Can't get IP for $node!
    ";
        exit 1;
      }
      # check if the SDR cache file exists.
      my $ipmiCmd;
      unless(-f "/tmp/$node.sdr"){
        # no SDR cache, so try to create it...
        $ipmiCmd = "$ipmi -I lan -H $node-bmc -U $u -P $p sdr dump /tmp/$node.sdr";
        `$ipmiCmd`;
      }
      if(-f "/tmp/$node.sdr"){
        # run the command against the cache so that its faster
        $ipmiCmd = "$ipmi -I lan -H $node-bmc -U $u -P $p -S /tmp/$node.sdr sdr type 
                                                                           Temperature ";
        # put all the output into the @out array
        my @out = `$ipmiCmd`;
        # iterate through each @out entry.
        foreach(@out){
          # each output line looks like this:
          # Ambient Temp     | 32h | ok  | 12.1 | 25 degrees C
          # so we parse it out
          chomp(); # get rid of the new line
          # grap the first and 5th fields.  (Description and Temp)
          my ($descr, undef, undef, undef,$temp) = split(/|/);
          # get rid of white space in description
          $descr =~ s/ //g;
          # grap just the temp, (We assume C anyway)
          $temp = (split(' ', $temp))[0];
          # make sure that temperature is a number:
          if($temp =~ /^d+/ ){
            #print "$node: $descr $temp
    ";
            my $gcmd = "$gmetric -n '$descr' -v $temp -t int16 -u Celcius -S $ip:$node";
            `$gcmd`;
          }
        }
      }
      # Child Thread done and exits.
      exit;
    }
    # wait for all forks to end...
    while(waitpid(-1,WNOHANG) != -1){
      1;
    }
    

    除了所有解析之外,此脚本只运行 ipmitool 命令并获取温度。然后,它将针对每项度量数据,使用 gmetric 命令将这些值放到 Ganglia 中。

    1. 以 cron 作业的形式运行脚本。

    运行 crontab -e。我添加了以下每 30 分钟就运行一次的条目:30 * * * * /usr/local/bin/ipmi-ganglia.sh。您可能希望它发生得更加频繁或者次数更少。

    1. 打开 Ganglia 并查看结果。

    打开 Ganglia Web 浏览器并查看一个节点的图形,您可以看到节点被欺骗并且更新了每个节点条目:

    图 6. no_group 度量数据
    no_group 度量数据  

    欺骗的缺点之一是类别归入 no_group 度量组。gmetric 似乎没有办法像带内版本那样进行良好的分组。

    结束语

    本文大致介绍了使用 Ganglia 和 Nagios 作为开源监视工具(单独使用和同时使用)可以完成的工作。您了解了如何安装/配置 Ganglia,然后看到了 Ganglia 对于了解应用程序特性是多么有用。最后,您看到了如何使用带内脚本扩展 Ganglia 以及如何使用带有主机欺骗的带外脚本。

    这是一个良好的开端。但是本文只回答了系统工程师提出的监视问题。现在可以查看系统范围的性能并了解计算机的利用情况。我们可以确定计算机是否始终处于空闲状态,还是以 60% 的使用率运行。现在甚至可以确定哪些计算机运行得最活跃,哪些计算机运行得最少,并了解其机架位置是否可以安排得更好。

    这个两部分系列的第二部分将探究如何设置 Nagios 并将其与 Ganglia 整合在一起,内容包括:

    • 安装和配置基本 Nagios 设置以执行报警
    • 监视交换机和其他基础设施
    • 将 Nagios 绑定到 Ganglia 中以执行报警

    此外,第二部分将展示如何扩展整个监视系统以监视运行作业和其他基础设施。通过执行这些附加项目,我们将能够回答不同用户组询问的其他监视问题。

    原文:https://www.ibm.com/developerworks/cn/linux/l-ganglia-nagios-1/

    【相关阅读】

      1. Ganglia监控系统安装操作备忘
      2. Linux上构建MRTG流量监控中心
      3. Nagios监控Linux和Unix服务器-自定义监控服务
  • 相关阅读:
    vue中dom元素和组件的获取
    Vue.js中父子组件之间的传值和传方法
    IDEA中的快捷键
    springmvc中使用controller时,跳转视图会带上外层的地址
    通配符的匹配很全面, 但无法找到元素 'mvc:annotation-driven' 的声明
    vue中的组件
    vuejs
    成员变量(实例变量)&局部变量&静态变量(类变量)的区别
    代码块
    重载&重写
  • 原文地址:https://www.cnblogs.com/haochuang/p/6340501.html
Copyright © 2011-2022 走看看