21

В Linux, как я могу отобразить использование памяти каждым процессом, если я делаю ps -ef? Я хотел бы видеть «виртуальную память», «res память», «разделяемую память» каждого прогресса. Я могу получить это через top , но мне нужна та же информация в ps -ef чтобы я мог передать вывод в grep с моим именем процесса.

8 ответов8

11

ps ef -o command,vsize,rss,%mem,size

Я не смог найти опцию для разделяемой памяти, но я нашел опции для% от общей физической памяти и объема пространства подкачки, которое потребуется для выгрузки процесса. Это и многое другое описано в справочной странице для PS.

9

Ответ @ 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
8

Список процессов по использованию памяти

ps -e -orss =, args = | сортировать -b -k1,1n

8

Получение использования памяти через 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
4

ты можешь использовать

top -n 1
3

Я обнаружил, что во многих случаях один и тот же процесс имеет подпроцесс 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. Он показывает данные в удобном для пользователя формате.

Эта команда была вдохновлена этим ответом, и она очень помогла мне понять, какой процесс занимает мои ресурсы.

3

Обновить:

Следующая строка содержит также информацию об общем потреблении памяти текущим пользователем.

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= чтобы показать полный путь процесса.

= Просто удаляет заголовок столбца.

3

Список процессов по использованию mem

команда: ps -e -orss =, args = | сортировка -b -k1,1n | pr -TW $ COLUMNS\

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .