В вычислениях UNIX загрузка системы является мерой объема вычислительной работы, которую выполняет компьютерная система. Средняя загрузка представляет собой среднюю загрузку системы за определенный период времени. Обычно она отображается в виде трех чисел, которые представляют загрузку системы за последние одно-, пяти- и пятнадцатиминутные периоды.
Все Unix и Unix-подобные системы генерируют безразмерную метрику из трех чисел «средней нагрузки» в ядре . Пользователи могут легко запросить текущий результат из оболочки Unix , выполнив uptime
команду:
$ время работы 14:34:03 до 10:43, 4 пользователя, средняя загрузка: 0.06, 0.11, 0.09
Команды wи topпоказывают те же три средних значения нагрузки, что и ряд утилит графического пользовательского интерфейса .
В операционных системах на базе ядра Linux к этой информации можно легко получить доступ, прочитав /proc/loadavg
файл.
Для более глубокого изучения такого рода информации, согласно стандарту иерархии файловой системы Linux , в файле отображается информация, зависящая от архитектуры /proc/stat
. [1] [2] [3]
Бездействующий компьютер имеет номер загрузки 0 (бездействующий процесс не учитывается). Каждый процесс , использующий или ожидающий ЦП ( очередь готовности или очередь выполнения ), увеличивает номер загрузки на 1. Каждый завершающийся процесс уменьшает его на 1. Большинство систем UNIX учитывают только процессы в запущенном ( на ЦП) или запущенном (ожидание ЦП) состоянии . Однако Linux также учитывает процессы в непрерываемых состояниях сна (обычно ожидающих активности диска ), что может привести к заметно отличающимся результатам, если многие процессы остаются заблокированными в вводе-выводе из-за занятой или остановленной системы ввода-вывода. [4] Это, например, включает процессы, блокирующиеся из-за сбоя сервера NFS или слишком медленного носителя (например, запоминающих устройств USB 1.x). Такие обстоятельства могут привести к повышенному среднему значению загрузки, что не отражает фактического увеличения использования ЦП (но все же дает представление о том, как долго пользователям приходится ждать).
Системы вычисляют среднюю нагрузку как экспоненциально затухающую/взвешенную скользящую среднюю нагрузки . Три значения средней нагрузки относятся к последним одной, пяти и пятнадцати минутам работы системы. [5]
Математически говоря, все три значения всегда усредняют всю нагрузку системы с момента запуска системы. Все они затухают экспоненциально, но они затухают с разной скоростью : они затухают экспоненциально по e через 1, 5 и 15 минут соответственно. Следовательно, средняя нагрузка за 1 минуту состоит из 63% (точнее: 1 - 1/ e ) нагрузки за последнюю минуту и 37% (1/ e ) средней нагрузки с момента запуска, исключая последнюю минуту. Для средних нагрузок за 5 и 15 минут то же самое соотношение 63%/37% вычисляется за 5 и 15 минут соответственно. Поэтому технически неточно, что средняя нагрузка за 1 минуту включает только последние 60 секунд активности, поскольку она включает 37% активности из прошлого, но правильно утверждать, что она включает в основном последнюю минуту.
Для однопроцессорных систем, которые ограничены процессором , можно рассматривать среднюю нагрузку как меру использования системы в течение соответствующего периода времени. Для систем с несколькими процессорами необходимо разделить нагрузку на количество процессоров, чтобы получить сопоставимую меру.
Например, можно интерпретировать среднюю нагрузку «1,73 0,60 7,98» на однопроцессорной системе как:
Это означает, что данная система (ЦП, диск, память и т. д.) могла бы справиться со всей работой, запланированной на последнюю минуту, если бы она была в 1,73 раза быстрее.
В системе с четырьмя ЦП средняя загрузка 3,73 будет означать, что в среднем 3,73 процесса готовы к запуску, и каждый из них может быть запланирован на ЦП.
В современных системах UNIX обработка потоков в отношении средних значений нагрузки различается. Некоторые системы рассматривают потоки как процессы для целей расчета средней нагрузки: каждый поток, ожидающий запуска, добавляет 1 к нагрузке. Однако другие системы, особенно системы, реализующие так называемую потоковую обработку M:N , используют другие стратегии, такие как подсчет процесса только один раз для целей нагрузки (независимо от количества потоков) или подсчет только потоков, которые в данный момент представлены планировщиком пользовательских потоков ядру, что может зависеть от уровня параллелизма, установленного для процесса. Linux, по-видимому, считает каждый поток отдельно, добавляя 1 к нагрузке. [6]
Сравнительное исследование различных индексов нагрузки, проведенное Феррари и др. [7], показало, что информация о загрузке ЦП, основанная на длине очереди ЦП, гораздо лучше справляется с балансировкой нагрузки по сравнению с использованием ЦП. Причина, по которой длина очереди ЦП показала лучшие результаты, вероятно, заключается в том, что когда хост сильно загружен, загрузка его ЦП, скорее всего, будет близка к 100%, и она не может отразить точный уровень загрузки. Напротив, длина очереди ЦП может напрямую отражать объем нагрузки на ЦП. Например, две системы, одна с 3, а другая с 6 процессами в очереди, с большой вероятностью будут иметь загрузку, близкую к 100%, хотя они, очевидно, различаются. [ оригинальное исследование? ]
В системах Linux средняя загрузка не рассчитывается на каждом такте часов, а управляется значением переменной, которое основано на настройке частоты HZ и проверяется на каждом такте часов. Эта настройка определяет частоту тактов ядра в Герцах (раз в секунду), и по умолчанию она равна 100 для тактов в 10 мс. Действия ядра используют это количество тактов для измерения времени. В частности, функция timer.c::calc_load(), которая вычисляет среднюю загрузку, запускается каждые LOAD_FREQ = (5*HZ+1) тактов, или примерно каждые пять секунд:
неподписанный длинный авенран [ 3 ]; static inline void calc_load ( unsigned long ticks ) { unsigned long active_tasks ; /* фиксированная точка */ static int count = LOAD_FREQ ; количество -= тики ; если ( количество < 0 ) { количество += LOAD_FREQ ; активные_задачи = количество_активных_задач (); CALC_LOAD ( avenrun [ 0 ], EXP_1 , активные_задачи ); CALC_LOAD ( avenrun [ 1 ], EXP_5 , активные_задачи ); CALC_LOAD ( avenrun [ 2 ], EXP_15 , активные_задачи ); } }
Массив avenrun содержит 1-минутное, 5-минутное и 15-минутное среднее значение. Макрос CALC_LOAD
и его связанные значения определены в sched.h:
#define FSHIFT 11 /* количество бит точности */ #define FIXED_1 (1<<FSHIFT) /* 1.0 как фиксированная точка */ #define LOAD_FREQ (5*HZ+1) /* 5-секундные интервалы */ #define EXP_1 1884 /* 1/exp(5сек/1мин) как фиксированная точка */ #define EXP_5 2014 /* 1/exp(5сек/5мин) */ #define EXP_15 2037 /* 1/exp(5сек/15мин) */#define CALC_LOAD(load,exp,n) \ load *= exp; \ load += n*(FIXED_1-exp); \ load >>= FSHIFT;
«Выборочное» вычисление средних значений нагрузки — довольно распространенное поведение; FreeBSD тоже обновляет значение только каждые пять секунд. Интервал обычно не считается точным, чтобы не собирать процессы, которые должны запускаться в определенный момент. [8]
В сообщении в списке рассылки Linux говорится, что его +1 тик недостаточен для избежания артефактов муара от такого сбора, и вместо этого предлагается интервал в 4,61 секунды. [9] Это изменение распространено среди ядер системы Android , хотя точное используемое выражение предполагает HZ 100. [10]
Другие команды для оценки производительности системы включают:
uptime
– надежность системы и средняя нагрузкаtop
– для общего представления системыvmstat
– vmstat сообщает информацию о запущенных или заблокированных процессах, памяти, подкачке, блочном вводе-выводе, ловушках и ЦП.htop
– интерактивный просмотрщик процессовdool
(ранее dstat
), [11] atop
– помогает сопоставлять все существующие данные о ресурсах для процессов, памяти, подкачки, блочного ввода-вывода, ловушек и активности ЦП.iftop
– интерактивный просмотрщик сетевого трафика для каждого интерфейсаnethogs
– интерактивный просмотрщик сетевого трафика для каждого процессаiotop
– интерактивный просмотрщик ввода/вывода [12]iostat
– для статистики ввода-вывода хранилищаnetstat
– для сетевой статистикиmpstat
– для статистики ЦПtload
– график средней нагрузки для терминалаxload
– график средней нагрузки для X/proc/loadavg
– текстовый файл, содержащий среднюю нагрузку...Даг Вирс прекратил разработку Dstat...