2010-01-29 04:03:01 +0000 2010-01-29 04:03:01 +0000
26
26

Как я могу отобразить использование памяти каждым процессом, если я делаю 'ps -ef'?

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

Ответы (8)

11
11
11
2015-03-11 13:16:28 +0000

Ответ @user26528 не совсем корректно вычисляет память - нужна сумма связок в смапах, а не только в верхнем. Этот скрипт должен это делать:

#!/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
11
11
11
2010-01-29 07:09:40 +0000

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

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

8
8
8
2012-02-04 10:26:12 +0000

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

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

7
7
7
2010-01-29 11:20:18 +0000

Получение данных об использовании памяти через ps довольно ненадежно. Если у вас новое ядро, то оно должно поддерживать /proc/pid#/smaps, что дает вам некоторую подробную информацию об использовании памяти каждым процессом. Ниже приведен довольно грязный и быстрый скрипт, чтобы пропустить через каждый процесс, который открыт, и получить данные об использовании Size, 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
4
4
2010-01-29 04:20:47 +0000

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

top -n 1
3
3
3
2016-09-23 15:51:44 +0000

Обновление:

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

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
3
3
2017-04-04 12:27:34 +0000

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

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

3
3
3
2014-12-05 07:40:22 +0000

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

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

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

6
10
5
37
4