Почему прямое скользящее среднее 1/5/15 минуты не используется в расчете нагрузки Linux?

28

До недавнего времени я думал, что среднее значение нагрузки (как показано, например, сверху) является скользящим средним по n последним значениям числа процессов в состоянии «работает» или «работает». И n было бы определено «длиной» скользящего среднего: поскольку алгоритм вычисления среднего значения нагрузки, по-видимому, срабатывает каждые 5 секунд, n было бы 12 для среднего значения нагрузки за 1 мин, 12x5 для среднего значения нагрузки за 5 минут и 12x15 за 15 минут средней нагрузки.

Но потом я прочитал эту статью: http://www.linuxjournal.com/article/9001 . Статья довольно старая, но тот же алгоритм реализован сегодня в ядре Linux. Средняя нагрузка - это не скользящая средняя, ​​а алгоритм, имя которого я не знаю. Во всяком случае, я сделал сравнение между алгоритмом ядра Linux и скользящим средним для воображаемой периодической нагрузки:

график нагрузки,

Это огромная разница.

Наконец мои вопросы:

  • Почему эта реализация была выбрана по сравнению с истинной скользящей средней, которая имеет реальное значение для всех?
  • Почему все говорят о «средней нагрузке в 1 минуту», поскольку алгоритм учитывает гораздо больше, чем в последнюю минуту. (математически, все меры с момента загрузки; на практике, с учетом ошибки округления - все еще много мер)
user368507
источник
5
Это экспоненциальная скользящая средняя (EMA), также используемая, например, в финансах (технический анализ). Преимущества, по-видимому, одинаковы: EMA можно рассчитать только из предыдущего и текущего значения, а недавние значения имеют больший вес, чем более старые значения. В стандартной MA старое значение вносит столько же в среднее значение, сколько и самое последнее, и иногда мы думаем, что более свежие значения более важны.
jg-faustus

Ответы:

24

Эта разница восходит к оригинальной версии Berkeley Unix и связана с тем, что ядро ​​не может поддерживать скользящее среднее; для этого нужно было бы сохранить большое количество прошлых чтений, и особенно в старые времена просто не хватало памяти для этого. Вместо этого используемый алгоритм имеет то преимущество, что все ядро, которое необходимо сохранить, является результатом предыдущих вычислений.

Имейте в виду, что алгоритм был немного ближе к истине, когда скорости компьютера и соответствующие тактовые частоты измерялись в десятках МГц вместо ГГц; в эти дни гораздо больше времени для ползучести расхождений.

geekosaur
источник
2
Хорошо, это объясняет выбор реализации. Знаете ли вы, почему многие люди думают, что среднее значение трех нагрузок рассчитывается за последние 1 мин / 5 мин / 15 мин? Я думаю, что это неправильно, алгоритм вычисляет среднее значение по всем последним значениям. Я понимаю, что старые значения имеют меньшее значение, чем новые значения, но, тем не менее, значения старше 1 минуты по-прежнему оказывают незначительное влияние на среднее значение нагрузки за 1 мин. Так что по моему мнению «1мин / 5мин / 15мин» не имеет смысла, но я могу ошибаться (?)
user368507
5
Потому что это то, что документация, и каждая программа, которая сообщила о них, начиная с оригинального BSD uptimeи w, утверждали; Вы должны были взглянуть на исходники ядра, чтобы понять, что это не совсем так.
geekosaur
1
это действительно жаль
user368507
3
@ user5528 Время 1min/5min/15min действительно имеет смысл. Они определяют время, после которого влияние текущей нагрузки падает на некоторый фиксированный коэффициент (вероятно, e = 2,71 или, может быть, 2). Просто попробуйте.
Maaartinus
2
@maaartinus Да. 1 мин / 5 мин / 15 мин определяет время, по истечении которого старшие измерения имеют вес, меньший или равный 1 / е в расчете EMA. Эта точность не проявляется в работоспособности человека или в топе человека .
user368507