![Проверьте общее использование физической памяти и ЦП для программы в Linux](https://rvso.com/image/1585790/%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D1%8C%D1%82%D0%B5%20%D0%BE%D0%B1%D1%89%D0%B5%D0%B5%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%84%D0%B8%D0%B7%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%20%D0%B8%20%D0%A6%D0%9F%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%8B%20%D0%B2%20Linux.png)
Я хочу сравнить, сколько физической памяти и мощности ЦП используют 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, который позволяет очень легко проверять и сравнивать использование памяти каждым приложением.