¿Cómo identificar valores atípicos en los datos de rendimiento del tiempo de actividad del servidor?

8

Tengo un script de Python que crea una lista de listas de tiempo de actividad del servidor y datos de rendimiento, donde cada sublista (o 'fila') contiene las estadísticas de un clúster en particular. Por ejemplo, bien formateado se parece a esto:

-------  -------------  ------------  ----------  -------------------
Cluster  %Availability  Requests/Sec  Errors/Sec  %Memory_Utilization
-------  -------------  ------------  ----------  -------------------
ams-a    98.099          1012         678          91
bos-a    98.099          1111         12           91
bos-b    55.123          1513         576          22
lax-a    99.110          988          10           89
pdx-a    98.123          1121         11           90
ord-b    75.005          1301         123          100
sjc-a    99.020          1000         10           88
...(so on)...

Entonces, en forma de lista, podría verse así:

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]

Mi pregunta:

  • ¿Cuál es la mejor manera de determinar los valores atípicos en cada columna? ¿O los valores atípicos no son necesariamente la mejor manera de atacar el problema de encontrar 'maldad'?

En los datos anteriores, definitivamente me gustaría saber sobre bos-b y ord-b, así como ams-a, ya que su tasa de error es muy alta, pero los otros pueden descartarse. Dependiendo de la columna, dado que más alto no es necesariamente peor ni más bajo, estoy tratando de encontrar la forma más eficiente de hacerlo. Parece que numpy se menciona mucho para este tipo de cosas, pero no estoy seguro de por dónde empezar (lamentablemente, soy más administrador de sistemas que estadístico ...). Cuando pregunté en Stack Overflow, alguien mencionó el uso de la función scoperpercentile de numpy y arrojó algo por encima del percentil 99. ¿Parece una buena idea?

(Publicación cruzada de stackoverflow, aquí: /programming/4606288 )

septagrama
fuente

Respuestas:

13

Según la forma en que formula la pregunta

¿Son los valores atípicos no necesariamente la mejor manera de atacar el problema de encontrar 'maldad'?

No está claro que esté buscando valores atípicos. Por ejemplo, parece que le interesan las máquinas que funcionan por encima / por debajo de algún umbral.

±

Por otro lado, puede haber buenas razones a priori para querer que se le notifique sobre cualquier servidor con menos del 95% de disponibilidad, ya sea que haya uno o varios servidores por debajo de este umbral.

Por esta razón, una búsqueda de valores atípicos puede no proporcionar la información que le interesa. Los umbrales podrían determinarse estadísticamente en función de datos históricos, por ejemplo, modelando la tasa de error como poisson o el porcentaje de disponibilidad como variables beta. En una configuración aplicada, estos umbrales probablemente podrían determinarse en función de los requisitos de rendimiento.

David LeBauer
fuente
2
+1 para abordar la pregunta aparente (en lugar de la planteada), que es mucho más importante.
whuber
4

Una manera simple de encontrar servidores anómalos sería asumir que están distribuidos de manera idéntica, estimar los parámetros de la población y clasificarlos de acuerdo con sus probabilidades, ascendentes. Las probabilidades de columna se combinarían con su producto o su mínimo (o alguna otra norma T). Esto funciona bastante bien siempre que los valores atípicos sean raros. Para la detección de valores atípicos en sí, los parámetros de población estables generalmente se estiman de forma iterativa eliminando los valores atípicos descubiertos, pero eso no es vital siempre que inspeccione manualmente la lista y evite así los umbrales.

Para las probabilidades, puede probar Beta para las proporciones y Poisson para las tasas.

Como señaló David, la detección de valores atípicos no es lo mismo que el análisis de confiabilidad, que marcaría todos los servidores que exceden algún umbral. Además, algunas personas abordarían el problema a través de las funciones de pérdida, definiendo el dolor que siente cuando algún servidor tiene una disponibilidad del 50% o una tasa de error de 500, y luego los clasifica de acuerdo con ese dolor.

sesqu
fuente
2

Identificar un punto de datos dado como un valor atípico implica que hay algún proceso o modelo de generación de datos del que se espera que provengan los datos. Parece que no está seguro de cuáles son esos modelos para las métricas y clústeres dados que le preocupan. Entonces, esto es lo que consideraría explorar: gráficos de control de procesos estadísticos .

La idea aquí sería recopilar el
-% Disponibilidad
- Solicitudes / Sec
- Errores / Sec
-% Memory_Utilization

métricas para cada uno de sus clústeres. Para cada métrica, cree un subconjunto de datos que solo incluya valores que sean "razonables" o estén bajo control. Cree los gráficos para cada métrica en función de estos datos bajo control. Luego puede comenzar a alimentar datos en vivo a su código de gráficos y evaluar visualmente si las métricas están bajo control o no.

Por supuesto, hacer esto visualmente para múltiples métricas en muchos grupos puede no ser factible, pero esta podría ser una buena manera de comenzar a aprender sobre la dinámica que enfrenta. Luego, puede crear un servicio de notificación para clústeres con métricas que se salgan de control. En este sentido, he jugado con el uso de redes neuronales para clasificar automáticamente los patrones de la tabla de control como OK frente a algún sabor específico de fuera de control (p. Ej.,% De tendencia de disponibilidad hacia abajo o comportamiento cíclico en errores / seg). Hacer esto le brinda las ventajas de los gráficos de control de procesos estadísticos (utilizados durante mucho tiempo en entornos de fabricación), pero alivia la carga de tener que pasar mucho tiempo mirando los gráficos, ya que puede entrenar una red neuronal para clasificar patrones según su interpretación experta.

En cuanto al código, existe el paquete spc en pypi pero no tengo ninguna experiencia al usarlo. Mi ejemplo de juguete del uso de redes neuronales (Bayes ingenuos también) se puede encontrar aquí .

Josh Hemann
fuente
Gracias por un puntero a un código de muestra, ¡lo comprobaré!
septagram