Чому в обчисленні навантаження Linux не використовується пряма ковзаюча середня 1/5/15 хвилина?


28

До недавнього часу я вважав, що середнє навантаження (як показано, наприклад, вгорі) - це ковзне середнє значення для останніх n значень кількості процесу в стані "runnable" або "run". І n було б визначено "довжиною" ковзної середньої: оскільки алгоритм для обчислення середнього навантаження, здається, спрацьовує кожні 5 секунд, n було б 12 для середнього навантаження 1 хв, 12x5 для середнього навантаження 5 хв і 12x15 для середнього навантаження 15 хв.

Але потім я прочитав цю статтю: http://www.linuxjournal.com/article/9001 . Стаття досить стара, але той самий алгоритм реалізований сьогодні в ядрі Linux. Середнє навантаження - це не ковзаюча середня величина, а алгоритм, для якого я не знаю назви. У будь-якому разі я порівняв алгоритм ядра Linux і ковзну середню для уявного періодичного навантаження:

графік навантаження.

Є величезна різниця.

Нарешті мої запитання:

  • Чому цю реалізацію було обрано порівняно з справжньою ковзною середньою, що має реальне значення для когось?
  • Чому всі говорять про "середню завантаженість 1 хвилини", оскільки набагато більше, ніж за останню хвилину, враховується алгоритм. (математично, все міра з моменту завантаження; на практиці, враховуючи помилку округлення - все ще багато заходів)

5
Це експоненціальна ковзаюча середня величина (EMA), яка також використовується, наприклад, у фінансах (технічний аналіз). Переваги, мабуть, однакові - EMA можна обчислити з попереднього і поточного значення, а останнім значенням надається більша вага, ніж старі значення. У стандартному МА найдавніше значення сприяє такому ж рівню середнього, як і останнє, і іноді ми думаємо, що більш новітні значення важливіші.
jg-faustus

Відповіді:


24

Ця різниця бере свій початок від початкового Berkeley Unix і випливає з того, що ядро ​​насправді не може тримати ковзну середню; для цього потрібно було б зберегти велику кількість минулих читань, а особливо в старі часи просто не було пам'яті, щоб запасти її. Алгоритм, який використовується замість цього, має ту перевагу, яку потрібно зберегти всім ядром, є результатом попереднього розрахунку.

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


2
Добре, що пояснює вибір реалізації. Чи знаєте ви, чому багато людей думають, що три середнє навантаження обчислюється за останні 1 хв / 5 хв / 15 хв? Я думаю, що це неправильно, алгоритм обчислює середнє значення за всі останні значення. Я розумію, що старі значення мають меншу важливість, ніж нові значення, але, тим не менше, значення, старші ніж на 1 хвилину, все ще мають незначний вплив на середню завантаженість в 1 хв. Тож, на мою думку, "1min / 5min / 15min" немає сенсу, але я можу помилятися (?)
user368507

5
Тому що це документація та кожна програма, яка повідомляла про них, починаючи з оригінальної BSD uptimeі w, як стверджується; вам довелося подивитися джерела ядра, щоб дізнатися, що це насправді не так.
geekosaur

1
це справді шкода
user368507

3
@ User5528 Часи 1min/5min/15min дійсно мають сенс. Вони визначають час, через який вплив струмового навантаження падає на деякий фіксований коефіцієнт (ймовірно, e = 2,71 .. або, можливо, 2). Просто спробуйте.
maaartinus

2
@maaartinus Так. 1min / 5min / 15min визначають час, після якого старі заходи мають вагу меншу або рівну 1 / e в обчисленні EMA. Ця точність не виявляється в людині, що перебуває в режимі безперервного часу, або в людині .
user368507
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.