用于监控服务器的机器学习

Posted

技术标签:

【中文标题】用于监控服务器的机器学习【英文标题】:Machine learning for monitoring servers 【发布时间】:2014-11-04 09:33:16 【问题描述】:

我正在使用 pybrain 来获取服务器监视器警报并确定问题的根本原因。我很高兴使用监督学习和管理训练数据集对其进行训练。数据的结构如下:

 * Server Type **A** #1
  * Alarm type 1
  * Alarm type 2
 * Server Type **A** #2
  * Alarm type 1
  * Alarm type 2
 * Server Type **B** #1
  * Alarm type **99**
  * Alarm type 2

所以有 n 个服务器,x 个警报可以是UPDOWNnx 都是可变的。

如果服务器 A1 的 alarm 1 & 2DOWN,那么我们可以说 service a 在该服务器上已关闭并且是问题的原因。

如果 alarm 1 在所有服务器上都关闭,那么我们可以说 service a 是原因。

原因可能有多种选择,因此直接分类似乎不合适。

我还想将以后的数据源与网络联系起来。比如只是 ping 一些外部服务的脚本。

由于串行服务检查,所有适当的警报可能不会立即触发,因此它可以从一台服务器停机开始,然后在 5 分钟后另一台服务器停机。

我首先尝试做一些基本的事情:

from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer


INPUTS = 2
OUTPUTS = 1

# Build network

# 2 inputs, 3 hidden, 1 output neurons
net = buildNetwork(INPUTS, 3, OUTPUTS)


# Build dataset

# Dataset with 2 inputs and 1 output
ds = SupervisedDataSet(INPUTS, OUTPUTS)


# Add one sample, iterable of inputs and iterable of outputs
ds.addSample((0, 0), (0,))



# Train the network with the dataset
trainer = BackpropTrainer(net, ds)

# Train 1000 epochs
for x in xrange(10):
    trainer.train()

# Train infinite epochs until the error rate is low
trainer.trainUntilConvergence()


# Run an input over the network
result = net.activate([2, 1])

但是我[我很难将可变数量的警报映射到静态数量的输入。比如我们给一个服务器加一个报警器,或者加一个服务器,整个网络都需要重建。如果这是需要做的事情,我可以做,但想知道是否有更好的方法。

我正在考虑的另一个选择是,为每种类型的服务器设置不同的网络,但我不知道如何得出整个环境的结论,因为它只会在单个主机上进行评估, 而不是一次所有主机。

我应该使用哪种类型的算法以及如何映射数据集以通过可变输入得出整个环境范围的结论?

我对任何可行的算法都持开放态度。 Go 比 python 还要好。

【问题讨论】:

也许朴素贝叶斯网络是最合适的?它肯定更简单。 作为一个用户,我宁愿让软件在它的电子邮件中加上一个事实的摘要,而不是宣布结论可能会指向我那里。例如,“服务器 A1 上的 4 个服务 (80%) 报告 DOWN”或“跨 12 个系统的警报类型 99 (100%)”;选择要显示的事实仍然是一个有趣的问题,这与包装一样重要。 对不起,如果这很幼稚,但重构您的输入可能更容易。您说“有 n 个服务器,x 个警报可以是 UP 或 DOWN。n 和 x 都是可变的。”。如果表示为“存在警报,处于 UP 或 DOWN 状态,可以是特定类型,并且来自特定服务器”,这会更好吗?这似乎使得任何随后传递给任何 ML 算法的数据树都不太可能随着警报类型或服务器的添加而发生变化。对不起,如果这根本不相关!我对 ML 了解不多,但我已经处理过一些数据结构。 【参考方案1】:

这实际上是一个具有挑战性的问题。

标签的表示

很难表示您的学习目标标签。正如你所指出的,

If Server A1 has alarm 1 & 2 as DOWN, then we can say that service a is down on that server and is the cause of the problem.
If alarm 1 is down on all servers, then we can say that service a is the cause.
There can potentially be multiple options for the cause ...

我想您需要列出所有可能的选项,否则我们不能期望 ML 算法能够泛化。为简单起见,假设您只有两个可能的问题原因:

1. Service problem 
2. Server problem  

按站点分类的二元分类器

假设在您的第一个 ML 模型中,以上是仅有的两个原因。那么你现在正在研究一个基于站点的二进制分类器。逻辑回归可能更适合您入门,因为它易于解释。

要找出问题所在的服务器或哪个服务,这是您的第二步。要解决第二步,根据您的示例,

如果是服务问题,我觉得可以手动推导出一些决策规则,这样就可以查明服务名称。这个想法是您应该看到大量服务器触发了相同的警报,对吗?另请参阅最后的高级读数以检查更多选项。 如果是服务器问题,您可以构建第二个二进制分类器(单独的服务器端分类器),它仅使用来自该服务器的功能在每个服务器上运行并回答问题:“如果我有问题”。

站点二元分类器的功能

我认为所有这些警报都是您功能的最佳来源。我想使用一些汇总统计数据作为特征可以帮助这里的站点分类器。例如,

收到警报 A 为 DOWN 的服务器百分比 警报 B 为 DOWN 的所有服务器的平均时间长度 在警报 B 关闭的所有服务器中,警报 A 关闭的服务器的百分比是多少。 ...

服务器端二元分类器的功能

您应该明确使用所有警报信号作为服务器端分类器的特征。但是,在训练时,您应该从所有服务器中获取所有数据。标签只是“有问题”或“没有问题”。训练数据将如下所示:

  alarm A On, alarm B On, alarm C on, ..., alarm Z on, has-problem
    YES,        YES,       NO,               YES,      YES
    NO,         YES,       NO,               NO,       NO
    ?,          NO,        YES,              NO,       NO

注意我使用了“?”表示您可能缺少数据(未知状态)的一些可能的警报,可用于描述以下情况:

All the appropriate alarms may not be triggered at once, 
due to serial service checks,  so it can start with one server down and 
then another server down 5 minutes later.  

一些进阶读物

此问题与几个主题有关,例如,alarm correlation、event correlation、fault diagnosis。

【讨论】:

【参考方案2】:

变量输入有很多选项,但两个相对简单的是:

1) 不存在的输入编码为 0.5,而存在的输入编码为 0 或 1 2)此外,您可以将输入分成两部分,一个用于“存在”与“不存在”,另一个用于“活动”与“无声”。然后,网络将不得不使用两者之间的交互来了解第二列仅在第一列为 1 时才重要,而在第一列为 0 时不重要。但如果有足够的训练案例,它可能可以做到这一点。

当然,这些方法可以组合。

【讨论】:

我会推荐选项 2。上面描述的第一个选项可能会导致神经元失火。

以上是关于用于监控服务器的机器学习的主要内容,如果未能解决你的问题,请参考以下文章

人工智能机器学习和深度学习,是如何影响视频监控的?

Zabbix5.0版本 分布式监控

Nagios学习笔记四:基于NRPE监控远程Linux主机

运维工具Zabbix学习 17.内网zabbix连接公网服务端监控

Prometheus监控软件部署方法

DataOps Reading Notes