Вопрос или проблема
Когда я выполняю команду top
на своей системе Ubuntu, я вижу следующие результаты
top - 07:58:58 up 1:21, 1 пользователь, средняя нагрузка: 0.82, 0.73, 0.55
Задачи: 293 всего, 1 выполняется, 292 спят, 0 остановлены, 0 зомби
%Cpu(s): 0.8 us, 0.8 sy, ....
Мне нужно понять среднюю нагрузку
и %cpu
.
Мое понимание основано на моих знаниях и высоком использовании CPU при низкой средней нагрузке.
Средняя нагрузка
Средняя нагрузка — это измерение того, сколько задач ожидает в очереди выполнения ядра (не только CPU, но и диск) за определенный период времени.
Значит ли это, что 0.83 задачи ждут по вышеуказанным результатам? Как может быть дробное число? Также что означают три различных значения 0.83 0.73, 0.55
?
%CPU
Это обозначает, сколько времени за последние x секунд CPU работал. Например: если использование CPU показывает 60%, это означает, что за последние x секунд CPU работал 60% времени. Мое понимание верно? Если да, то что представляет собой %Cpu(s): 0.8 us
?
Также, если у меня четырехъядерный процессор и %CPU отображает 50%, значит ли это, что все ядра работают на 50%, или 2 ядра работают на 100%?
Понимание средней нагрузки: 0.83 0.73, 0.55
- Нагрузка — это мера объема вычислительной работы, выполняемой системой. Три значения — это средняя нагрузка за определенный временной интервал. Интервалы — за последнюю 1 минуту, 5 минут и 15 минут. Средняя нагрузка вычисляется как экспоненциальная скользящая средняя. Если хотите, вы можете углубиться и прочитать Анализ средней нагрузки.
Одноядерная система
-
Значение средней нагрузки варьируется в пределах. В системе с одним ядром значение
0.83
означает, что ваш CPU работал на 83% своей мощности за последнюю минуту. Значение1.0
означает, что ваш CPU работает на полной мощности (100%). При значении1.0
система будет перегружена даже при добавлении небольшой дополнительной работы. Значение больше1.0
означает, что система получает больше, чем может обработать. Это не плохо, просто означает, что больше процессов ждут времени CPU. Вы заметите замедление работы компьютера.
Многоядерная система
-
В многоядерной системе вы делите среднюю нагрузку на количество имеющихся ядер. Например, при средней нагрузке
0.83
и 4 ядрах, вы сделаете0.83 / 4
, чтобы получить0.2075
или(0.83 / 4) * 100
, чтобы получить20.75%
мощности. В системе с четырьмя ядрами, если у вас была бы средняя нагрузка равная4.0
, это указывало бы на то, что все ядра работают на 100% мощности, и любое перегружение приведет к ожиданию процессов времени CPU. -
Перегрузка возникает, когда вы превышаете максимальную мощность. Средняя нагрузка как перегрузка может быть немного запутанной для чтения, потому что основывается на ваших ядрах. Если у вас четырехъядерный CPU, вы не перегрузите систему, пока значение нагрузки не превысит
4.0
. Если первое значение средней нагрузки составило5.50
, это бы значило, что ваша система перегружена на 150%, и в среднем 1.5 процесса за последнюю минуту должны были ждать времени CPU.
Понимание %Cpu(s): 0.8us, 0.8sy….
- Этот раздел показывает как использовался CPU. Каждый суффикс соответствует чему-то конкретному и указывает, сколько времени CPU тратил на этот набор задач. Если вы сложите все числа в этой строке вывода, они сложатся в 100%.
Задачи определяются как… источник
- us — это процент CPU для пользовательских процессов
- sy — это процент CPU для системных процессов
- ni — это процент CPU для процессов с повышенным приоритетом nice пасхалка Ni
- id — это процент CPU, не используемый
- wa — это процент CPU для процессов, ожидающих I/O операций
- hi — это процент CPU, обслуживающий аппаратные прерывания
- si — это процент CPU, обслуживающий программные прерывания
- st в виртуализированной среде часть ресурсов CPU выделяется каждой виртуальной машине (VM). Операционная система обнаруживает, когда у нее есть работа, но не может ее выполнить, потому что CPU занят другой виртуальной машиной. Время, потерянное таким образом, называется времени кражи.
Этот скрипт вычисляет процент системной нагрузки за 1, 5 и 15 минут, разделяя среднюю нагрузку на количество ядер CPU, а также конвертирует результат в процент (%)
# cat load_usage.sh
#!/bin/bash
Hostnames=$(uname -n | cut -d. -f1)
os_type=$(uname -s)
case "$os_type" in
Linux)
# Определяем цветовые переменные
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
NC="\033[0m" # Без цвета
cputhreshold=99.0
# Получаем среднюю нагрузку CPU
load_avg_1min=$(uptime | awk -F'load average: ' '{print $2}' | cut -d ',' -f1 | tr -d ' ')
load_avg_5min=$(uptime | awk -F'load average: ' '{print $2}' | cut -d ',' -f2 | tr -d ' ')
load_avg_15min=$(uptime| awk -F'load average: ' '{print $2}' | cut -d ',' -f3 | tr -d ' ')
# Получаем количество ядер CPU
cpu_core=$(nproc --all)
# Вычисляем проценты
percentage_1min=$(echo "scale=2; ($load_avg_1min / $cpu_core) * 100" | bc)
percentage_5min=$(echo "scale=2; ($load_avg_5min / $cpu_core) * 100" | bc)
percentage_15min=$(echo "scale=2; ($load_avg_15min / $cpu_core) * 100" | bc)
if (( $(echo "$percentage_1min >= $cputhreshold" | bc -l) )); then
# Печатаем заголовок таблицы в рамках
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
printf "| %-16s | %-17s | %-16s | %-14s | %-06s |\n" "HostName" "Временные интервалы" "Средняя нагрузка" "Нагрузка системы (%)" "Статус"
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
# Печатаем строки таблицы
printf "| %-16s | %-17s | %-16s | %-15s | ${YELLOW}%-06s${NC} |\n" "" "1 минута" "$load_avg_1min" "$percentage_1min%" ""
printf "| %-16s | %-17s | %-16s | %-15s | ${YELLOW}%-06s${NC} |\n" "$Hostnames" "5 минут" "$load_avg_5min" "$percentage_5min%" "Высокая"
printf "| %-16s | %-17s | %-16s | %-15s | ${YELLOW}%-06s${NC} |\n" "" "15 минут" "$load_avg_15min" "$percentage_15min%" ""
# Печатаем нижнюю границу таблицы в рамках
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
else
# Печатаем заголовок таблицы в рамках
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
printf "| %-16s | %-17s | %-16s | %-14s | %-06s |\n" "HostName" "Временные интервалы" "Средняя нагрузка" "Нагрузка системы (%)" "Статус"
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
# Печатаем строки таблицы
printf "| %-16s | %-17s | %-16s | %-15s | ${GREEN}%-06s${NC} |\n" "" "1 минута" "$load_avg_1min" "$percentage_1min%" ""
printf "| %-16s | %-17s | %-16s | %-15s | ${GREEN}%-06s${NC} |\n" "$Hostnames" "5 минут" "$load_avg_5min" "$percentage_5min%" "Нормально"
printf "| %-16s | %-17s | %-16s | %-15s | ${GREEN}%-06s${NC} |\n" "" "15 минут" "$load_avg_15min" "$percentage_15min%" ""
# Печатаем нижнюю границу таблицы в рамках
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
fi
;;
*)
echo -e "Этот скрипт не поддерживается для $os_type - $Hostnames"
;;
esac
Ответ или решение
Понимание среднего значения загрузки и процента использования CPU в Linux
Когда вы выполняете команду top
на своем Ubuntu-устройстве, вы видите такие результаты, как:
top - 07:58:58 up 1:21, 1 user, load average: 0.82, 0.73, 0.55
Tasks: 293 total, 1 running, 292 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.8 sy, ....
В этом ответе мы подробно рассмотрим понятия load average
и % CPU
, а также ответим на ваши вопросы.
Среднее значение загрузки (load average)
1. Что такое average load?
Среднее значение загрузки (load average) — это измерение количества процессов, ожидающих выполнения в очереди ядра (это касается не только использования CPU, но и дисковой активности) за определенные промежутки времени: 1, 5 и 15 минут. Значения 0.82
, 0.73
, 0.55
представляют собой загрузку за последние 1, 5 и 15 минут соответственно.
2. Десятичные значения и их интерпретация.
Наличие десятичных дробей в значении загрузки указывает на то, что это среднее значение. Например, значение 0.82
не означает цифру в абсолютных процессах, а говорит о средней загрузке системы. В данном случае можно сказать, что ваша система в среднем обрабатывает 0.82
задач на ядре за последнюю минуту.
3. Производительность в зависимости от количества ядер.
-
Система с одним ядром: Если у вас однопроцессорный компьютер, то значение
0.82
говорит о том, что процессор был загружен на 82% своей мощности. Значение1.0
означает 100% загрузки. Если среднее значение загрузки превышает1.0
, это может означать, что система перегружена и процессы могут ожидать обработки. -
Многопроцессорная система: Учитывая, что у вас 4 ядра, для оценки загрузки нужно делить значения на количество ядер. Например, если значение загрузки составляет
0.82
, то для 4 ядер это будет0.82 / 4 = 0.205
, что соответствует20.5%
загрузки доступных ресурсов.
Значение 4.0
для многопроцессорной системы говорит о том, что система работает на полной мощности всех ядер (т.е. 100% загрузки). Если значение превышает количество ядер (например, 5.50
), это говорит о том, что ваша система перегружена и в среднем 1.5
процесса ожидают на выполнение.
Процент использования CPU (%Cpu)
1. Что означает %CPU?
Секция %CPU
показывает, как был использован процессор. Сумма всех значений в этой строке равна 100%. Например:
%us
— процент использования CPU для пользовательских процессов (user).%sy
— процент использования CPU для системных процессов (system).%id
— процент времени, когда CPU не использовался.%wa
— процент времени, когда процессы ожидали операций ввода-вывода.
Итак, если вы видите значение 0.8% us
, это означает, что в течение указанного периода времени CPU использовался только на 0.8%
для выполнения пользовательских задач.
2. Интерпретация загрузки многоядерного процессора
Если у вас есть 4-ядерный процессор и процент использования CPU составляет 50%
, это означает, что на самом деле это эквивалентно 2
ядрам на максимальной загрузке или же все ядра работают на 50%
. То есть, это не обязательно означает, что все ядра загружены на 50%, а лишь то, что использовано 50% от общего ресурса процессора.
Заключение
Понимание средних значений загрузки и процентов использования CPU является важным инструментом для управления производительностью системы Linux. Следите за показателями загрузки, чтобы избежать перегрузки системы и поддерживать стабильную работу ваших приложений.