Как интерпретируется «средняя нагрузка» в «верхнем» выводе? Это одинаково для всех дистрибутивов?

12

Я хотел бы знать, может ли вывод Linux на основе Red Hat по-разному интерпретироваться Linux на основе Debian.

Чтобы сделать вопрос еще более конкретным, я хочу понять, как topинтерпретируется «среднее значение загрузки» из первой строки команды в системе Red-Hat и как это проверить с помощью официальной документации или кода.

[Есть много способов подойти к этому вопросу, каждый из которых является приемлемым ответом на вопрос.]

Один из возможных подходов - найти, где эта информация официально документирована.
Другой вариант top- найти версию кода, созданную в конкретном дистрибутиве, и версию, над которой я работаю.

Вывод команды, который я получаю:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


В этом случае, как я могу интерпретировать среднее значение нагрузки ?
Мне удалось обнаружить, что средняя загрузка составляет около последней минуты из одного источника документации и что она должна быть интерпретирована после умножения на 100 из другого источника документации.
Вопрос в том,
загружен ли он на 0,02% или на 2%?
Источники и версии документации:

1) Первая звезда с

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Источник: man topв моем дистрибутиве RedHat
Ubuntu также имеет версию с «заданиями», которая не объясняет среднюю загрузку в:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) Второй начинается с

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Источник:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Этот начинается с:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Источник: http://www.unixtop.org/man.shtml первый один, можно увидеть в или и он не имеет каких - либо объяснений формата вывода (ни о среднем нагрузки , в которой я заинтересован в) , Второй один, не содержит краткое объяснение, указывая на то , что средняя нагрузка связана с последней 1 минуты, но ничего об интерпретации его стоимости!

man topRHELonline ubuntu documentation


Я цитирую прямо из второго источника:

2а. UPTIME и LOAD Averages.
Эта часть состоит из одной строки, содержащей: имя
программы или окна, в зависимости от
текущего времени и продолжительности режима отображения с момента последней загрузки
общее количество пользователей
, загруженных системой в среднем за последние 1, 5 и 15 минут

Таким образом, если это объяснение действительно верно, достаточно просто понять, что среднее значение загрузки составляет около 1 минуты.
Но это не объясняет формат числа.

В третьем объяснении говорится, что:

При указании чисел для средних значений нагрузки их следует умножить на 100.

Это объяснение предполагает, что 0,02 означает 2%, а не 0,02%. Но правильно ли это? Кроме того, это правильно для всех дистрибутивов Linux и потенциально различных реализаций top?
Чтобы найти ответ на этот вопрос, я попытался просмотреть код, выполнив поиск в Интернете. Но я нашел, по крайней мере, две разные версии, topотносящиеся к RHEL! builtin-top.cи переработан top.c. Оба защищены авторским правом Red-Hat, как указано в уведомлении в начале кода, и, таким образом, кажется логичным, что RHEL использует один из них.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Итак, прежде чем углубляться в этот большой код, я хотел узнать, на чем сосредоточиться, чтобы сформировать точное понимание того, как интерпретируется загрузка процессора?

Из информации, приведенной в ответах ниже, в дополнение к личному поиску я обнаружил, что:

1 - topто, что я использую, содержится в пакете procps-3.2.8. Что можно проверить с помощью top -v.
2 - В версии, procps-3.2.8которую я скачал с официального сайта, кажется, что инструмент uptimeполучает информацию напрямую из procfsфайла /proc/loadavg(без использования функции linux getloadavg()).
3 - Теперь для topкоманды также не используется функция getloadavg(). Мне удалось убедиться, что topон действительно делает то же самое, что иuptimeинструмент, чтобы показать средние нагрузки. На самом деле он вызывает uptimeфункцию инструмента, которая получает информацию из procfsфайла /proc/loadavg.

Итак, все указывает на /proc/loadavgфайл! Таким образом, чтобы сформировать точное понимание load averageсозданного top, нужно прочитать код ядра, чтобы увидеть, как loadavgзаписывается файл .
Существует также отличная статья, указанная в одном из ответов, которая предоставляет непрофессиональным терминам объяснение трех значений loadavg.
Итак, несмотря на то, что все ответы были одинаково полезны и полезны, я отмечу тот, который указал на статью http://www.linuxjournal.com//article/9001, как «ответ» на мой вопрос. Спасибо всем за ваш вклад!

Кроме того, из вопроса « Понимание верхней и средней нагрузки» я нашел ссылку на исходный код ядра, который указывает на место, где loadavgрассчитывается. Как кажется, есть огромный комментарий, объясняющий, как это работает, и эта часть кода находится в C!
Ссылка на код: http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Опять же, я не пытаюсь участвовать в какой-либо форме плагиата, я просто добавляю это для полноты. Итак, я повторяю, что ссылка на код ядра была найдена из одного из ответов в разделе Понимание вершины и средней нагрузки ...

Ангелос Асонит
источник
О чем говорят версии? ( top -v)
Фиксиман
top: procps версия 3.2.8
Ангелос Асонитис
Связано: unix.stackexchange.com/questions/8895/…
BowlOfRed

Ответы:

19

Загрузка ЦП - это длина очереди выполнения, то есть длина очереди процессов, ожидающих запуска.

uptimeКоманда может быть использована , чтобы увидеть среднюю длину очереди выполнения за последнюю минуту, последние пять минут и последние 15 минут, так же , как то , что обычно отображаются top.

Высокое значение загрузки означает, что очередь выполнения длинная. Низкое значение означает, что оно короткое. Таким образом, если среднее значение загрузки за одну минуту составляет 0,05, это означает, что в среднем за эту минуту в очереди выполнения было 0,05 процесса, ожидающих запуска. Это не процент. Это, AFAIK, одинаково для всех Unices (хотя некоторые Unices могут не подсчитывать процессы, ожидающие ввода-вывода, что, как я думаю, делает Linux; OpenBSD, только на некоторое время, также подсчитывает потоки ядра, так что загрузка всегда была равна 1 или Больше).

topУтилита Linux получает значения загрузки от ядра, которое записывает их /proc/loadavg. Глядя на источники procps-3.2.8, мы видим, что:

  1. Для отображения средних значений нагрузки sprint_uptime()вызывается функция top.c.
  2. Эта функция живет в proc/whattime.cи вызовах loadavg()в proc/sysinfo.c.
  3. Эта функция просто открывается, LOADAVG_FILEчтобы прочитать средние значения нагрузки.
  4. LOADAVG_FILEопределяется ранее как "/proc/loadavg".
Кусалананда
источник
Большое спасибо за ваш ответ, это где-то официально задокументировано?
Ангелос Асонит
1
@AgelosAssonitis Эта статья в LinuxJournal за 2006 год может быть интересной. Он указывает на пару исходных файлов в дереве исходников ядра Linux, на которые вы можете посмотреть. Я не пользователь Linux, так что я не могу сказать , если эти файлы все еще там , в последнем воплощении ядра: linuxjournal.com/article/9001
Kusalananda
Действительно интересная статья! Я просто просматриваю пакет procps, чтобы узнать, действительно ли команда top берет свое значение из файла / proc / loadavg и совпадает ли это с результатом функции getloadavg ().
Ангелос Асонит
@AgelosAssonitis Определенное место для документирования средних значений нагрузки - это исходное дерево вашего ядра. POSIX не определяет нагрузку на процессор и нигде не упоминает слова «средняя загрузка». topИ uptimeкоммунальные услуги не являются POSIX утилит и getloadavg()функций библиотеки также не определено в стандарте POSIX (он имеет BSD происхождение , хотя).
Кусалананда
Итак, из того, что я собираю, нет официальной документации, чтобы понять формирование этих значений, кроме самого источника ядра, это правильно? Однако прежде чем попасть туда, мне все еще нужно связать значение, представленное в topфайле procfs loadavg ...
Ангелос Асонитис
7

Средняя загрузка обычно рассчитывается ядром. Такие приложения, как topи uptimeмогут использовать getloadavg(3)библиотечный вызов для доступа к нему (он предназначен для переноса между различными версиями Unix). В Linux это обычно приводит к чтению из /proc/loadavg. На FreeBSD это системный вызов.

Например:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimeи topоба делают одинаковые звонки, чтобы получить свои данные.

Теперь средние значения нагрузки 1/5/15 минуты - это количество процессов в очереди выполнения. Различные операционные системы могут рассчитывать это по-разному; обычно самая большая разница заключается в том, считаются ли процессы, ожидающие ввода-вывода (например, заблокированные на диске), работающими или нет. На линуксе они есть.

Таким образом, среднее значение загрузки 3,4 означает, что в очереди выполнения в образце окна было в среднем 3,4 процесса (1, 5, 15 минут).

Однако высокая средняя нагрузка не обязательно означает перегруженный сервер. Если у вас 16 ядер, то ваша средняя нагрузка может быть 16 без стресса. У вас также может быть много обращений к приложениям, fork()что может привести к созданию / уничтожению большого количества процессов, что приводит к высокой средней загрузке, но без существенного влияния на производительность сервера. Его следует использовать только в качестве руководства, наряду с другими показателями, такими как% загрузка ЦП.

Стивен Харрис
источник
4

Средняя нагрузка - это не то, что является специфическим для какого-либо конкретного инструмента или распределения, это измерение, предоставляемое ядром или, точнее, планировщиком, поэтому это измерение не зависит от распределения. Измерение записывается внутри файловой системы proc/proc

Насколько это понятно, показатель средней нагрузки - это не показатель того, насколько интенсивно работает процессор, а объем работы, который необходимо выполнить. Я не думаю, что действительно нужно умножать это на что-либо, потому что это прямое измерение количества процессов в работоспособном или бесперебойном состоянии.

Попробуйте проверить следующие две справочные страницы: getloadavg(3)и uptimeдля получения дополнительной информации.

Поначалу показатель средней нагрузки может быть сложным для понимания, я думаю, что многие люди считают, что это показатель того, насколько интенсивно работает процессор, но это не совсем так.

pmyjavec
источник
1
Хорошо, но мы абсолютно уверены, что средняя загрузка, описанная в getloadavg()описании функции, является той же средней загрузкой, topкоторую показывает команда в rhel? Я спрашиваю об этом, потому что я выполнил полнотекстовый поиск в неупакованном содержимом пакета procps-3.2.8 (который указан командой top -v), и нет ни одного упоминания о функции getloadavg ()! Так что, возможно, top вычисляет среднее значение нагрузки другим способом ...
Ангелос Асонитис