Как добраться, использование CPU для каждого ядра со сценарием удара с помощью стандарта *отклоняют инструменты

Это непосредственно не отвечает на Ваш вопрос, но он действительно дает Вам альтернативную опцию полагать, что это может выручить Вас. Я обычно устанавливаю мой $HOME/.ssh/config файл как так:

IdentityFile ~/.ssh/my-computers

# infrastructure
Host lap1
    User sam
    #PubkeyAuthentication no
    ProxyCommand ssh sam@my.dom.com nc lap1.internal.local %p

Затем, когда я хочу соединиться со своей lap1.internal.local системой, когда я активен, я просто делаю:

ssh lap1

Я обычно ssh-copy-id мои открытые ключи к другим серверам, в которые я хочу войти. Сообщите мне, хотели ли бы Вы, чтобы я уточнил.

6
03.09.2014, 11:57
4 ответа

Расчет среднего использования ядра из / proc / stat

лучшее решение, которое я придумал до сих пор, использует bc для учета арифметики с плавающей запятой:

# Calculate average cpu usage per core.
#      user  nice system   idle iowait irq softirq steal guest guest_nice
# cpu0 30404 2382   6277 554768   6061   0      19    0      0          0
A=($(sed -n '2,5p' /proc/stat))
# user         + nice     + system   + idle
B0=$((${A[1]}  + ${A[2]}  + ${A[3]}  + ${A[4]}))
B1=$((${A[12]} + ${A[13]} + ${A[14]} + ${A[15]}))
B2=$((${A[23]} + ${A[24]} + ${A[25]} + ${A[26]}))
B3=$((${A[34]} + ${A[35]} + ${A[36]} + ${A[37]}))
sleep 2
# user         + nice     + system   + idle
C=($(sed -n '2,5p' /proc/stat))
D0=$((${C[1]}  + ${C[2]}  + ${C[3]}  + ${C[4]}))
D1=$((${C[12]} + ${C[13]} + ${C[14]} + ${C[15]}))
D2=$((${C[23]} + ${C[24]} + ${C[25]} + ${C[26]}))
D3=$((${C[34]} + ${C[35]} + ${C[36]} + ${C[37]}))
# cpu usage per core
E0=$(echo "scale=1; (100 * ($B0 - $D0 - ${A[4]}   + ${C[4]})  / ($B0 - $D0))" | bc)
E1=$(echo "scale=1; (100 * ($B1 - $D1 - ${A[15]}  + ${C[15]}) / ($B1 - $D1))" | bc)
E2=$(echo "scale=1; (100 * ($B2 - $D2 - ${A[26]}  + ${C[26]}) / ($B2 - $D2))" | bc)
E3=$(echo "scale=1; (100 * ($B3 - $D3 - ${A[37]}  + ${C[37]}) / ($B3 - $D3))" | bc)
echo $E0
echo $E1
echo $E2
echo $E3

Среднее использование ЦП на ядро ​​можно напрямую вычислить из / proc / stat (Кредиты на @mikeserv за подсказку по использованию / proc / stat .):

# Here we make use of bash direct array assignment
A0=($(sed '2q;d' /proc/stat))
A1=($(sed '3q;d' /proc/stat))
A2=($(sed '4q;d' /proc/stat))
A3=($(sed '5q;d' /proc/stat))
# user         + nice     + system   + idle
B0=$((${A0[1]} + ${A0[2]} + ${A0[3]} + ${A0[4]}))
B1=$((${A1[1]} + ${A1[2]} + ${A1[3]} + ${A1[4]}))
B2=$((${A2[1]} + ${A2[2]} + ${A2[3]} + ${A2[4]}))
B3=$((${A3[1]} + ${A3[2]} + ${A3[3]} + ${A3[4]}))
sleep 0.2
C0=($(sed '2q;d' /proc/stat))
C1=($(sed '3q;d' /proc/stat))
C2=($(sed '4q;d' /proc/stat))
C3=($(sed '5q;d' /proc/stat))
# user         + nice     + system   + idle
D0=$((${C0[1]} + ${C0[2]} + ${C0[3]} + ${C0[4]}))
D1=$((${C1[1]} + ${C1[2]} + ${C1[3]} + ${C1[4]}))
D2=$((${C2[1]} + ${C2[2]} + ${C2[3]} + ${C2[4]}))
D3=$((${C3[1]} + ${C3[2]} + ${C3[3]} + ${C3[4]}))
# cpu usage per core
E0=$(((100 * (B0 - D0 - ${A0[4]} + ${C0[4]})) / (B0 - D0)))
E1=$(((100 * (B1 - D1 - ${A1[4]} + ${C1[4]})) / (B1 - D1)))
E2=$(((100 * (B2 - D2 - ${A2[4]} + ${C2[4]})) / (B2 - D2)))
E3=$(((100 * (B3 - D3 - ${A3[4]} + ${C3[4]})) / (B3 - D3)))
echo $E0
echo $E1
echo $E2
echo $E3

или даже короче за счет широкого использования прямого присваивания массивов в bash:

# Here we make use of bash direct array assignment by assigning line
# 2 to 4 to one array


A=($(sed -n '2,5p' /proc/stat))
# user         + nice     + system   + idle
B0=$((${A[1]}  + ${A[2]}  + ${A[3]}  + ${A[4]}))
B1=$((${A[12]} + ${A[13]} + ${A[14]} + ${A[15]}))
B2=$((${A[23]} + ${A[24]} + ${A[25]} + ${A[26]}))
B3=$((${A[34]} + ${A[35]} + ${A[36]} + ${A[37]}))
sleep 0.2
# user         + nice     + system   + idle
C=($(sed -n '2,5p' /proc/stat))
D0=$((${C[1]}  + ${C[2]}  + ${C[3]}  + ${C[4]}))
D1=$((${C[12]} + ${C[13]} + ${C[14]} + ${C[15]}))
D2=$((${C[23]} + ${C[24]} + ${C[25]} + ${C[26]}))
D3=$((${C[34]} + ${C[35]} + ${C[36]} + ${C[37]}))
# cpu usage per core
E0=$((100 * (B0 - D0 - ${A[4]}  + ${C[4]})  / (B0 - D0)))
E1=$((100 * (B1 - D1 - ${A[15]} + ${C[15]}) / (B1 - D1)))
E2=$((100 * (B2 - D2 - ${A[26]} + ${C[26]}) / (B2 - D2)))
E3=$((100 * (B3 - D3 - ${A[37]} + ${C[37]}) / (B3 - D3)))
echo $E0
echo $E1
echo $E2
echo $E3

Решение на основе top

Этого также можно достичь без установки дополнительного инструмента только с top (я использовал это в более позднем сообщении ). По умолчанию top показывает только средняя загрузка процессора при его запуске b но он покажет все процессоры, когда вы нажмете 1 . Чтобы иметь возможность использовать вывод процессора top , когда мы используем его в режиме пакетного вывода, нам нужно будет сделать это поведением по умолчанию при запуске top . Это можно сделать с помощью файла ~ / .toprc . К счастью, это можно создать автоматически: Запустите top , нажмите 1 и нажмите W , что создаст файл ~ / .toprc в вашей домашней папке. . Когда вы сейчас запустите top -bn 1 | grep -F '% Cpu' вы увидите, что top теперь выводит все ваши ядра. Теперь у нас уже есть все необходимое для работы. Вся необходимая мне информация находится в столбце 3 массива, который будет выводом top .

Есть только одна проблема: когда использование процессора для ядра достигает 100% , массив, который выводит команда, переместит столбец с текущей загрузкой из столбца 3 в столбец. 2 . Следовательно, с awk '{print $ 3}' вы увидите us, как результат для столбца 3 . Если вас это устраивает, оставьте это. В противном случае вы могли бы также иметь awk выводить столбец 2 . Это будет просто : . Решение, которое позволяет избежать всех этих ошибок:

top -bn 2 | grep -F '%Cpu' | tail -n 4 | gawk '{print $2 $3}' | tr -s '\n\:\,[:alpha:]' ' '

оно удаляет все символы новой строки \ n , , и буквы [: alpha:] и удаляет все, кроме одного пробела -s .

4
27.01.2020, 20:23

вы можете видеть частоту для каждого ядра со следующим:

$ cat /proc/cpuinfo
0
27.01.2020, 20:23

Это создает массив bash, элементами которого являются нагрузки для каждого ЦП:

loads=($(mpstat -P ALL 1 1 | awk '/Average:/ && $2 ~ /[0-9]/ {print $3}'))

Поскольку массивы bash нумеруются, начиная с нуля, загрузка второго ЦП будет напечатана следующим образом:

echo ${loads[1]}

Для этого требуется утилита mpstat . Чтобы установить его в системе, подобной debian, выполните:

apt-get install sysstat

Как это работает

Несколько подробный вывод, производимый mpstat , выглядит так:

$ mpstat -P ALL 1 1
Linux 3.2.0-4-amd64 (MyMachine)     08/30/2014      _x86_64_        (2 CPU)

10:12:35 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:12:36 PM  all    1.49    0.00    1.49    0.00    0.00    0.00    0.00    0.00   97.01
10:12:36 PM    0    0.00    0.00    2.02    0.00    0.00    0.00    0.00    0.00   97.98
10:12:36 PM    1    1.96    0.00    1.96    0.00    0.00    0.00    0.00    0.00   96.08

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
Average:     all    1.49    0.00    1.49    0.00    0.00    0.00    0.00    0.00   97.01
Average:       0    0.00    0.00    2.02    0.00    0.00    0.00    0.00    0.00   97.98
Average:       1    1.96    0.00    1.96    0.00    0.00    0.00    0.00    0.00   96.08

где -P ALL сообщает mpstat показать все процессоры, а аргументы 1 1 указывают ему выводить вывод каждую секунду и останавливаться после первой секунды.

Чтобы выбрать только те значения, которые нам нужны, используется эта команда awk :

awk '/Average:/ && $2 ~ /[0-9]/ {print $3}'

Она выбирает только последние строки (те, которые начинаются с Среднее: и среди них , выбирайте только те, у которых второй столбец является числовым. Для этих строк печатается третий столбец (загрузка процессора).

Из-за использования круглых скобок вывод из mpstat - awk конвейер записывается в массив bash.

7
27.01.2020, 20:23

Я придумал это решение, и оно у меня работает.

echo print `top -n 1 | tr -s " " | cut -d$" " -f10 | tail -n +8 | head -n -1 | paste -sd+ | bc`/ `nproc` | python

Источник (написать): https://mohammadg.com/programming/how-to-get-overall-cpu-utilization-from-the-bash-command-line/

1
27.01.2020, 20:23

Теги

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