В Linux, как я могу отобразить использование памяти каждым процессом, если я делаю ps -ef
?
Я хотел бы видеть «виртуальную память», «res память», «разделяемую память» каждого прогресса. Я могу получить это через top
, но мне нужна та же информация в ps -ef
чтобы я мог передать вывод в grep
с моим именем процесса.
8 ответов
ps ef -o command,vsize,rss,%mem,size
Я не смог найти опцию для разделяемой памяти, но я нашел опции для% от общей физической памяти и объема пространства подкачки, которое потребуется для выгрузки процесса. Это и многое другое описано в справочной странице для PS.
Ответ @ user26528 не совсем правильно вычисляет память - вам нужна сумма отображений в smaps, а не только верхняя. Этот скрипт должен сделать это:
#!/bin/bash
for pid in $(ps -ef | awk '{print $2}'); do
if [ -f /proc/$pid/smaps ]; then
echo "* Mem usage for PID $pid"
rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
echo "-- Rss: $rss kB"
echo "-- Pss: $pss kB"
echo "Shared Clean $sc kB"
echo "Shared Dirty $sd kB"
echo "Private $(($pd + $pc)) kB"
fi
done
Список процессов по использованию памяти
ps -e -orss =, args = | сортировать -b -k1,1n
Получение использования памяти через PS довольно ненадежно. Если у вас более новое ядро, оно должно поддерживать /proc /pid # /smaps, который дает вам некоторую подробную информацию об использовании памяти каждым процессом. Ниже приведен довольно грязный и быстрый скрипт для циклического прохождения каждого процесса, который открыт, и получения размера, Rss, Pss и Shared Clean /Dirty. Надеюсь, это может быть полезно каким-то образом.
#!/bin/bash
for pid in $(ps -ef | awk '{print $2}'); do
if [ -f /proc/$pid/smaps ]; then
echo "* Mem usage for PID $pid"
echo "-- Size:"
cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
echo "-- Rss:"
cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
echo "-- Pss:"
cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
echo "Shared Clean"
cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
echo "Shared Dirty"
cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
fi
done
ты можешь использовать
top -n 1
Я обнаружил, что во многих случаях один и тот же процесс имеет подпроцесс fork, и вы заинтересованы в общем объеме памяти, используемой этим процессом. Например, Google Chrome запускает несколько процессов, и вы хотите знать, сколько памяти занимает Chrome. Я нашел ниже одну строку команды очень полезной
echo "%CPU %MEM MEM PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5
Он заботится о многих вещах, таких как показ памяти в МБ, сортировка по памяти и в основном группирование по команде. Он также группирует% CPU и% memory. Он показывает данные в удобном для пользователя формате.
Эта команда была вдохновлена этим ответом, и она очень помогла мне понять, какой процесс занимает мои ресурсы.
Обновить:
Следующая строка содержит также информацию об общем потреблении памяти текущим пользователем.
echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"
Я только что перечислил все пользовательские процессы, отсортированные по наибольшему использованию памяти в МБ, вот так:
ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done
Вы можете использовать command=
вместо comm=
чтобы показать полный путь процесса.
=
Просто удаляет заголовок столбца.
Список процессов по использованию mem
команда: ps -e -orss =, args = | сортировка -b -k1,1n | pr -TW $ COLUMNS\