Как я могу контролировать использование ЦП пользователем?

Мне нужно контролировать использование ЦП пользователями двух серверов (Ubuntu и CentOS). Например:

user1     5%
user2    10%
...

Есть ли инструмент, похожий на top или htop, который может это сделать?

14 голосов | спросил Amged Rustom 20 MarpmThu, 20 Mar 2014 15:25:36 +04002014-03-20T15:25:36+04:0003 2014, 15:25:36

1 ответ


13

Вот сценарий для печати использования ЦП процессора total для каждого пользователя , который в настоящее время входит в систему , showPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(who | awk '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

И вот немного измененная версия для печати использования ЦП всех доступных пользователей (но пропускающих те, у которых использование ЦПУ равняется нулю), showAllPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(getent passwd | awk -F ":" '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { if (sum > 0.0) print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

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

Существует также связанный сценарий для отображения использования памяти total для каждого пользователя: showPerUserMem.sh

Для реального мониторинга просто выполняйте эти сценарии периодически с помощью команды watch.

Для сортировки по использованию ЦП выведите вывод на sort -k2 -nr.

ответил scai 20 MarpmThu, 20 Mar 2014 16:43:26 +04002014-03-20T16:43:26+04:0004 2014, 16:43:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132