Проверьте общее использование физической памяти и ЦП для программы в Linux

Проверьте общее использование физической памяти и ЦП для программы в Linux

Я хочу сравнить, сколько физической памяти и мощности ЦП используют Google Chrome и Firefox. Поэтому я попытался сделать это с помощью htop, который я обычно использую для отслеживания системных ресурсов, и обнаружил, что не могу сделать вывод. Я прочитал несколько веток, но все еще в замешательстве, и вот почему: когда я фильтрую с помощью F4, например, для Chrome, htop показывает мне десятки задач, для которых я не знаю, являются ли они потоками или процессами. Насколько мне известно, потоки разделяют одно и то же адресное пространство, а процессы — нет. Я могу нажать F5, чтобы получить древовидное представление, и для всех задач будет один родитель. Предположение о том, что значение родительской задачи в столбце RES дает общую память, а значение в столбце CPU% — общее использование ЦП для этой программы независимо от того, использует ли она несколько процессов или потоков, по-видимому, неверно. Я выяснил это, проведя этот небольшой эксперимент: я запустил найденную мной программу на Python, которая использует многопроцессорность для некоторых вычислений. Вот что я увидел в htop: родительское значение в столбце CPU% все время показывает 0, но есть 7 задач, которые достигают 100% (в моей системе 4 физических ядра с 2 потоками на каждом).

Может ли кто-нибудь объяснить, что происходит, и как я могу проверить общее использование физической памяти и ЦП для программы?

Из того, что я прочитал, не так-то просто определить точное использование памяти, но в моем случае абсолютное значение не важно, мне просто нужны значения, которые я могу использовать для сравнения.

решение1

Вы можете использовать эту команду:

pgrep -P $(pgrep chrome) | xargs ps -o %mem,%cpu,cmd -p | awk '{memory+=$1;cpu+=$2} END {print memory,cpu}'

Или вот этот (поменяйте $9 на выбор столбца):

top -b -n1 | grep chrome | awk '{ SUM += $9} END { print SUM }'

Дополнительные команды и советы можно найти здесь:

решение2

psgrep выдает ошибку:

$ pgrep -P $(pgrep chrome) | xargs ps -o %mem,%cpu,cmd -p | awk '{memory+=$1;cpu+=$2} END {print memory,cpu}'
pgrep: only one pattern can be provided
Try `pgrep --help' for more information.
error: list of process IDs must follow -p

Usage:
ps [options]

Try 'ps --help <simple|list|output|threads|misc|all>'
or 'ps --help <s|l|o|t|m|a>'
for additional help text.

For more details see ps(1).

С помощью htop я могу увидеть родительскую задачу PID и сделать следующее:

$ pgrep -P 1721 | xargs ps -o %mem,%cpu,cmd -p | awk '{memory+=$1;cpu+=$2} END {print memory,cpu}'
1.2 2.6

но 1,2% памяти кажется слишком мало.

top не учитывает все. Например, с помощью: $ top -b -n1 | grep freeplane | awk '{ SUM += $9} END { print SUM }' Я получаю 0, потому что он получает только эту команду: /usr/share/freeplane/freeplane.sh, но не эту: /usr/sbin/java -Xmx512m -Dorg.freeplane

ps auxf, похоже, все учитывает, и для Chrome у меня получается следующее:

$ ps auxf | grep chrome | awk '{ SUM += $4} END { print SUM }'
5.024G

что кажется более реалистичным. Хотя если я измерю используемую память с помощью:

$ free -h

до и после закрытия Chrome я вижу разницу в 2,4Gi.

EDIT: Я нашел ps_mem, который позволяет очень легко проверять и сравнивать использование памяти каждым приложением.

Связанный контент