机器学习监控服务器

时间:2014-09-10 16:20:07

标签: python go machine-learning neural-network monitor

我正在查看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有警报1& 2 DOWN,然后我们可以说服务在该服务器上停机并且是导致问题的原因。

如果闹钟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更好。

2 个答案:

答案 0 :(得分:5)

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

标签的表示

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

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为DOWN的所有服务器上,还有警报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 correlationevent correlationfault diagnosis

答案 1 :(得分:3)

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

1)不存在的输入编码为0.5,而存在的输入编码为0或1 2)此外,您可以将输入分为两个,一个用于“现在”与“不存在”,另一个用于“主动”与“无声”。然后,网络必须使用两者之间的交互来了解第二列只有在第一列是1时才重要,而不是第一列是0。但是如果有足够的训练案例,它可能会这样做。 / p>

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