Что будет, если к Perfmon применить быстрое преобразование Фурье? Или функцию корреляции? Получится #черте_что!

У меня есть сервер, на котором идет много периодических процессов. Если записать его CPU с разрешением 1 секунда, то получится примерно вот что:

Мы видим некую периодичность, но как лучше увидеть ee в чистом виде, очистить от шума?

Первое, что мне пришло в голову, это быстрое преобразование Фурье:

import csv
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

...

N = len(cpu)
x = np.linspace(0.0, N/60., N)
yf = scipy.fftpack.fft(cpu)

Нас интересуют частоты порядка минут, поэтому ограничим ось x соответственно:

Четко видны 'собственные частоты', на которых 'звучит' ваш сервер. С многими пиками я могу связать job schedule. Но гармоник здесь слишком много, и вторая идея, которая мне пришла в голову такова: для того, чтобы понять периодичность, применим самокорреляцию (ненормированную):

import numpy as np
import matplotlib.pyplot as plt

...

x2 = np.linspace(-N/2/60., N/2/60., N)
corr = np.correlate(cpu,cpu,mode='same')

Мне кажется что на данном графике сердцебиение вашего сервера видно наиболее явно. Для сравнения построим те же графики для другого сервера с другим профилем нагрузки, где она флуктирует, но нет явной периодичности:

Только не спрашивайте, пожалуйста, какой в этом смысл! Это кодобред! А вот более полезный способ работы с серверами.

Комментарии (13)


  1. tbl
    12.01.2022 17:44
    +2

    на дискретных сигналах всегда гармоники лезут, их сглаживать/фильтровать надо


  1. echo10
    12.01.2022 18:17
    +1

    Вейвлет преобразование еще погоняйте по вашим данным. Там и фильтровать можно по разным масштабам и, возможно, сам характер нагрузки на CPU как набор волн, сдвинутых по времени, можно порассматривать.


  1. Sdima1357
    12.01.2022 18:49

    Альфа ритмы всепланетного мозга самопроизвольно зародившегося в интернете...

    Он спит.


    1. AhuraMasda
      13.01.2022 16:50
      +1

      и будить - НЕ НАДО!


      1. Sdima1357
        13.01.2022 17:06

        Тссс.... Потише пожалуйста.


  1. belch84
    12.01.2022 21:34

    А можно ли картинку колебаний преобразовать в звук?

    Примерно вот такую
    image


    1. Tzimie Автор
      12.01.2022 21:43

      Попробую на досуге, библиотеки вроде есть


    1. Refridgerator
      13.01.2022 06:11

      Всё что угодно можно преобразовать в звук, только результат в данном случае не будет выглядеть как на картинке. Если хочется звук в реальном времени — тогда значение загрузки процессора можно кодировать частотой синусоиды, которые плавно смешиваются друг с другом.


      1. belch84
        13.01.2022 10:43

        На самом деле эта картинка представляет собой таки звуковые колебания, точнее, мелодию, которую я когда-то собственноручно вырезал из MP3 файла, чтобы использовать в качестве рингтона на телефоне. Я пользовался программой Steinberg WaveLab, в таком виде она представляет мелодию для всевозможных операций аудиомонтажа. Мне было интересно, насколько такое представление соответствует действительности, но быстро найти средство, которое прямо по картинке генерирует звук, мне не удалось. На Хабре когда-то была статья "Как звучит сердцебиение: перевод бумажной кардиограммы в WAV-формат", в ней описывалось решение похожей задачи, но применить ее метод непосредственно, мне кажется, трудно


        1. Refridgerator
          13.01.2022 12:39

          Я имел в виду, что осциллограмма музыкального сигнала заметно отличается от шумоподобного, в том числе и с гармоническими составляющими.


  1. Refridgerator
    13.01.2022 06:01
    +5

    Разрешение 1 секунда — это мало. Нужно хотя бы 10-25 мс, т.е. период переключения потоков. И у вас в коде перед FFT отсутствует умножение на оконную функцию, оттого и в спектре у вас слишком много мусора. И графики амплитуд нагляднее в логарифмическом, а не в линейной масштабе.

    Сама идея не такая уж и бессмысленная — я делал нечто подобное для анализа шума в цепях питания звукового тракта.


    1. tbl
      13.01.2022 11:37

      умножение на оконную функцию

      Причем не абы какой функцией усреднение делать (среднее арифметическое не подойдет), а Lancsoz window с помощью sin(x)/x


      1. Refridgerator
        13.01.2022 12:50
        +1

        Ни Lancsoz, ни sin(x)/x тоже не подойдут. Здесь же задача не в усреднении или сглаживании, а в уменьшении эффекта "spectral leakage", и оконные функции для этого тоже используются специальные, Хамминг/Блэкман/Нуттал наиболее часто используемые.