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


21

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

Відповіді:


8

Отримання використання пам'яті через 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

Ви повинні підсумувати колонку Size. Дивіться відповідь ezsmith нижче.
Basil A

10

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

Я не міг знайти опцію для спільної пам'яті, але я знайшов опції для% від загальної фізичної пам'яті і кількості swapspace, які були б необхідні для заміни процесу. Це та багато іншого задокументовано на сторінці man для ps.


Linux обліковує спільну пам'ять в пам'яті для кожного процесу, що може призвести до фіктивних сум, якщо у вас є багато процесів, приєднаних до одного сегменту великої спільної пам'яті. top, psТакі ж програми впливають на подібні програми.
Peter Eisentraut

Я знаю, як працює спільна пам'ять, але здається, PS не може надати цю інформацію (або я не зміг знайти її в документації ps, принаймні). top або htop фактично можуть показувати використання спільної пам'яті на основі процесу.
Justin Smith

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

Виходи: рядок 16: +: синтаксична помилка: очікується операнд (маркер помилки "+") - це рядок, що містить: echo "Приватні $ (($ pd + $ pc)) Кб", я працюю на CentOS 7 .
Basil A

1
@evsmith навіщо додавати 0,5 до Pss?
Pete

1
Запуск 10 000 невеликих скриптів Awk - це масовий антипаттерн, ви повинні просто рефакторувати все це в один сценарій Awk.
tripleee

8

Перерахуйте процеси за допомогою використання пам'яті

ps -e -orss =, args = | sort -b -k1,1n


Використовуйте ps -e -orss=,pid=,args= | sort -b -k1,1n для включення ідентифікатора процесу
Jacob


3

Перерахуйте процеси за допомогою використання пам'яті

команда: ps -e -orss =, args = | sort -b -k1,1n | pr -TW $ COLUMNS


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= , щоб показати повний шлях процесу.

The = просто видаляє заголовок стовпця.


3

Я виявив, що багато разів один і той же процес має вилковий підпроцес, і ви зацікавлені в загальній пам'яті, що використовується процесом. напр. 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 і% пам'яті. Він показує дані у зручному для користувача форматі.

Ця команда була натхнена це відповісти і це допомогло мені багато чого, щоб отримати уявлення про те, який процес займає мої ресурси.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.