Вопрос или проблема
Я использую sa -m
, чтобы отображать детали использования процессора каждым пользователем в системе RHEL 7. Он отображает информацию в следующем формате.
oracle 15335 88164.18re 176.77cp 0avio 167603k
root 9640 8294.42re 10.90cp 0avio 33737k
3rdeye 250 0.33re 0.04cp 0avio 28358k
sshd 4 2.11re 0.00cp 0avio 22068k
dbus 2 0.00re 0.00cp 0avio 7600k
smmsp 2 0.00re 0.00cp 0avio 21408k
Я нашел этот сайт, который дает краткую информацию о полях. (https://www.cyberciti.biz/tips/howto-log-user-activity-using-process-accounting.html#comments)
re – “реальное время” в минутах по часам
cp – сумма системного и пользовательского времени в минутах процессора
k – усредненное использование ядра процессора, в единицах по 1k
Есть ли способ рассчитать процент использования CPU для каждого пользователя из этих данных?
ОБНОВЛЕНИЕ 1:
Я добавляю это обновление, так как Алекс предлагает использовать скрипт, основанный на команде top, чтобы получить использование CPU по пользователю. Я использовал скрипт с этой логикой (top -b -n 1 -u $USERNAME | awk 'NR>7 { sum += $9; } END { print sum; }'
), чтобы рассчитать использование CPU пользователя. Но если я внимательно посмотрю, то видно, что скрипт не дает вам правильное значение. Я как-то нашел причину этого. Когда вы запускаете top, он показывает значение использования CPU, а затем обновляет его каждые 3 (по умолчанию) секунды. Но начальное значение, похоже, остается постоянным каждый раз, когда вы запускаете top.
[root@myserver unix]# top -b -n 1 -u oracle |grep -i "cpu"|head -1
%Cpu(s): 5.6 us, 2.6 sy, 0.0 ni, 79.0 id, 12.6 wa, 0.0 hi, 0.2 si, 0.0 st
[root@myserver unix]# top -b -n 1 -u oracle |grep -i "cpu"|head -1
%Cpu(s): 5.6 us, 2.6 sy, 0.0 ni, 79.0 id, 12.6 wa, 0.0 hi, 0.2 si, 0.0 st
[root@myserver unix]# top -b -n 1 -u oracle |grep -i "cpu"|head -1
%Cpu(s): 5.6 us, 2.6 sy, 0.0 ni, 79.0 id, 12.6 wa, 0.0 hi, 0.2 si, 0.0 st
[root@myserver unix]# top -b -n 1 -u oracle |grep -i "cpu"|head -1
%Cpu(s): 5.6 us, 2.6 sy, 0.0 ni, 79.0 id, 12.6 wa, 0.0 hi, 0.2 si, 0.0 st
Я выполнил top для пользователя oracle четыре раза, и он продолжает показывать одинаковые значения использования CPU. Я мог это ясно видеть, когда запускал top без опций -b и -n:
# top -u oracle
top - 08:47:44 up 3 days, 2:58, 2 users, load average: 2.21, 1.69, 1.42
Tasks: 1084 total, 3 running, 1081 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.6 us, 2.6 sy, 0.0 ni, 79.0 id, 12.6 wa, 0.0 hi, 0.2 si, 0.0 st
Обратите внимание, как это начинается с тех значений для использования CPU. Конечно, затем через 3 секунды он обновляется и начинает отображать правильные значения. Вот почему я хочу изменить свой подход к определению использования CPU по пользователю. Пожалуйста, исправьте меня, если я что-то упускаю.
Я могу предложить вам альтернативный способ. И он заключается в использовании пакета systat (ссылка для arch), и он предоставляет команды такие как mpstat
, iostat
и многие другие.
Вывод mpstat:
Linux 4.9.43-1-lts (laptop) 18/08/2017 _x86_64_ (4 CPU)
19:51:50 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
19:51:50 all 2,18 0,03 0,58 0,07 0,00 0,02 0,00 0,00 0,00 97,13
Вывод iostat:
Linux 4.9.43-1-lts (laptop) 18/08/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2,18 0,03 0,60 0,07 0,00 97,13
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3,13 28,15 80,47 1029654 2943525
Ответ или решение
Как определить процент использования ЦП пользователем на основе вывода команды sa
Для анализа использования процессора различными пользователями на системе RHEL 7 вы можете воспользоваться командой sa -m
, которая предоставляет вывод в следующем формате:
имя_пользователя PID реальное_время CPU_время avio k
Понимание полей вывода
реальное_время (re)
— это общее время в минутах, которое процесс потратил на выполнение.CPU_время (cp)
— общее время, использованное процессом на стороне процессора (в минутах), включая как пользователю, так и системный режим.k
— среднее использование процессора в однойk-единице.
Шаги для расчета процента использования ЦП
Чтобы рассчитать процент использования процессора каждым пользователем, следуйте этим шагам:
-
Измерьте общее доступное время ЦП: Это время можно определить, умножив количество минут на количество доступных ЦП. Например, если ваш сервер использует 4 ЦП и вы хотите узнать использование за 1 час (60 минут):
Общее время ЦП = Количество ЦП * 60 минут = 4 * 60 = 240 минут
-
Соберите данные из вывода команды
sa -m
: Извлеките значенияcp
для каждого пользователя. Эти значения показывают, сколько времени каждый процессор использовался для каждого пользователя. -
Рассчитайте процент использования ЦП для каждого пользователя: Для каждого пользователя используйте следующую формулу:
Процент использования ЦП (%) = (CPU_время пользователя / Общее время ЦП) * 100
Например, если
CPU_время (cp)
для пользователя "oracle" равно 176.77 минут:Процент использования ЦП для oracle = (176.77 / 240) * 100 = 73.24%
Сравните результаты для всех пользователей, используя аналогичный расчет.
Пример вычислений
Для вывода, приведенного в вашем вопросе, вы можете выполнить следующие расчеты:
-
Общее время ЦП:
4 ЦП * 60 мин = 240 мин
-
Рассчитываем процент использования для каждого пользователя:
-
oracle:
(176.77 / 240) * 100 ≈ 73.24%
-
root:
(10.90 / 240) * 100 ≈ 4.54%
-
3rdeye:
(0.04 / 240) * 100 ≈ 0.017%
-
sshd:
(0.00 / 240) * 100 = 0%
-
dbus:
(0.00 / 240) * 100 = 0%
-
smmsp:
(0.00 / 240) * 100 = 0%
-
Заключение
Используя указанные выше шаги, вы можете сделать детализированный анализ загрузки процессора пользователями на вашем RHEL 7 сервере. Этот подход замечателен тем, что он не зависит от динамического состояния системы, как это делает команда top
, что делает ваши результаты более надежными и стабильными в анализе.
Для дальнейшего анализа и мониторинга использования ресурсов можно также рассмотреть использование других инструментов, таких как mpstat
или iostat
, предоставляемых пакетом sysstat
. Эти инструменты могут предложить более детализированную информацию и графики о работе системы, что облегчит дальнейший анализ нагрузки на ЦП.