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


128

Я могу видеть список всех процессов и памяти через

ps aux 

и проходя через ВСЗ и RSS

Есть ли способ отсортировать вывод этой команды по убыванию по значению RSS?


Каков будет ожидаемый результат? проверкаps
Рахул Патил

Дополнительные примеры того , как использовать --sortздесь: alvinalexander.com/linux/...
ОДС

1
Superset вопрос, с помощью любого инструмента: stackoverflow.com/questions/4802481/...
Чиро Сантилли新疆改造中心法轮功六四事件

Ответы:


224

Используйте следующую команду:

ps aux --sort -rss

Проверьте здесь для большего использования памяти процесса Linux


12
примечание - если вы хотите увидеть лучшие результаты, полезно добавить их в headлайкps aux --sort -rss | head -n15
Yehosef

3
Я получаю ошибку ps: illegal option -- -
Мигель Мота

@MiguelMota Что делать , если так: ps aux --sort=rss?
coffeMug

2
@coffeMug не сработал, но это сработалоps aux | sort -rn -k 6
Мигель Мота

1
@coffeMug не знаю, как найти версию, но я нахожусь на Mac OSX, так что, может быть, поэтому
Мигель Мота

25

Быстрый и грязный способ является только трубы выход ps auxк sortкоманде:

$ ps aux | sort -rn -k 5,6

пример

$ ps aux | sort -rn -k 5,6
...
root      1584  0.0  0.0  22540  1236 ?        S    07:04   0:01 hald-addon-storage: polling /dev/sr0 (every 2 sec)
root      1575  0.0  0.0  22536   872 ?        S    07:04   0:00 /usr/libexec/hald-addon-generic-backlight
root      1574  0.0  0.0  22536   880 ?        S    07:04   0:00 /usr/libexec/hald-addon-leds
root      1565  0.0  0.0  22536   876 ?        S    07:04   0:00 /usr/libexec/hald-addon-rfkill-killswitch
saml      2507  0.0  0.0  22232   500 ?        S    07:05   0:00 dbus-launch --sh-syntax --exit-with-session
root      1671  0.0  0.0  22156   936 ?        Ss   07:04   0:00 xinetd -stayalive -pidfile /var/run/xinetd.pid
...

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

пример

root      1791  0.0  0.0   4140   536 tty2     Ss+  07:04   0:00 /sbin/mingetty /dev/tty2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       996  0.0  0.0      0     0 ?        S    07:04   0:01 [kdmflush]
root       982  0.0  0.0      0     0 ?        S    07:04   0:00 [kvm-irqfd-clean]

Больше советов

Дополнительным советом будет передать весь вывод другой команде, такой как less. Это позволяет вам просматривать информацию на странице за раз, а также использовать клавиши со стрелками и страницы вверх / вниз для прокрутки вперед и назад по выводу.

$ ps aux | sort -rn -k 5,6 | less

Если ваш вывод оборачивается много, вы также можете использовать -Sпереключатель на less, который заставит весь вывод остаться на одной строке. Затем вы можете использовать клавиши со стрелками для перемещения влево / вправо / вверх / вниз, чтобы увидеть все это.

$ ps aux | sort -rn -k 5,6 | less -S

Сортировка в пс

Определенные версии psпредоставляют возможность использования --sort. Этот переключатель может затем брать ключи, которые имеют префикс +или или -для обозначения порядка сортировки ... от наименьшего к наибольшему или от наибольшего к наименьшему.

Примеры

ВСЗ, -rss

$ ps aux --sort=vsz,-rss | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    07:03   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    07:03   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    07:03   0:01 [migration/0]
root         5  0.0  0.0      0     0 ?        S    07:03   0:00 [watchdog/0]

+ ВСЗ, + Новости

$ ps aux --sort=+vsz,+rss | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         2  0.0  0.0      0     0 ?        S    07:03   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    07:03   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    07:03   0:01 [migration/0]
root         5  0.0  0.0      0     0 ?        S    07:03   0:00 [watchdog/0]

-vsz, -rss

$ ps aux --sort=-vsz,-rss | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      1832  0.0  0.0 2088924 3312 ?        Sl   07:04   0:00 /usr/sbin/console-kit-daemon --no-daemon
saml      3517  0.2  1.2 2073196 100492 ?      Sl   07:06   0:34 /home/saml/.dropbox-dist/dropbox
saml      3516  0.0  0.8 2071032 67388 ?       Sl   07:06   0:07 /home/saml/.dropbox-dist/dropbox
saml      2657  0.1  0.7 1580936 57788 ?       Sl   07:05   0:27 nautilus

будет ps всегда выводить столбцы так , как вы ожидаете sortувидеть / процесс их?
Фелипе Альварес

Зависит от того, какая версия ps
slm

2
A ... | less- хороший совет, но иногда у вашего процесса огромная командная строка, и это мешает выводу. В таких случаях ... | less -Sработает лучше.
отход

@ Waste - хороший совет, просто помните, что усекает, -Sи поэтому вы можете потерять часть того, что вы хотите видеть, но в остальном хороший совет, если вас интересуют только левые столбцы.
SLM

@slm Я не уверен , что это имеет место less -S. Когда вы закрываете lessвид, все исчезает, но пока вы находитесь в виде, вы можете прокручивать как по вертикали, так и по горизонтали. Копирование может быть трудным, хотя.
отходы

6

Даже если ps не отражает фактическое использование памяти, эта команда довольно полезна.

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }'

4

ps aux --sort -rss это хорошо:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user     5984  0.8  7.4 1632488 296056 ?      Sl   06:30   6:18 /usr/lib/chromium-browser/chromium-browser --type=ren
user    23934 21.7  6.0 1565600 241228 ?      Sl   15:45  40:10 /opt/atom/atom --type=renderer --enable-experimental-
user     5533  0.9  5.1 3154096 206376 ?      SLl  06:30   6:47 /usr/lib/chromium-browser/chromium-browser --enable-p
user    17306  1.7  4.9 1360648 196124 ?      Sl   18:14   0:36 /usr/lib/chromium-browser/chromium-browser --type=ren
user    22272 30.1  4.6 1347784 185032 ?      Sl   18:43   1:54 /usr/lib/chromium-browser/chromium-browser --type=ren
user    19318  0.6  3.3 1304324 133452 ?      Sl   18:27   0:09 /usr/lib/chromium-browser/chromium-browser --type=ren
user    22098  1.0  3.3 1298500 133216 ?      Sl   18:43   0:04 /usr/lib/chromium-browser/chromium-browser --type=ren

но если вы хотите увидеть использование памяти и процессора по приложениям (сгруппированные по командам):

python3.6  sum_process_resources.py 
====   CPU%   ====
0. /opt/atom/atom | 27.8
1. /usr/lib/chromium-browser/chromium-browser | 11.2
2. python3.6 | 11.0
3. /opt/google/chrome/chrome | 1.6
4. /usr/lib/xorg/Xorg | 1.4
5. /opt/Franz/franz | 0.7
====   MEM%   ====
0. /usr/lib/chromium-browser/chromium-browser | 37.2
1. /opt/google/chrome/chrome | 11.3
2. /opt/Franz/franz | 10.6
3. /opt/atom/atom | 10.1
4. /usr/lib/xorg/Xorg | 2.0
5. com.google.android.gms.persistent | 1.4
====   RSS MB   ====
0. /usr/lib/chromium-browser/chromium-browser | 1475.07 MB
1. /opt/google/chrome/chrome | 461.35 MB
2. /opt/Franz/franz | 429.04 MB
3. /opt/atom/atom | 402.18 MB
4. /usr/lib/xorg/Xorg | 78.53 MB
5. com.google.android.gms.persistent | 58.02 MB

код:

#sum_process_resources.py
from collections import OrderedDict
import subprocess

def run_cmd(cmd_string):
    """Runs commands and saves output to variable"""
    cmd_list = cmd_string.split(" ")
    popen_obj = subprocess.Popen(cmd_list, stdout=subprocess.PIPE)
    output = popen_obj.stdout.read()
    output = output.decode("utf8")
    return output

def sum_process_resources():
    """Sums top X cpu and memory usages grouped by processes"""
    ps_memory, ps_cpu, ps_rss = {}, {}, {}
    top = 6
    output = run_cmd('ps aux').split("\n")
    for i, line in enumerate(output):
        cleaned_list = " ".join(line.split())
        line_list = cleaned_list.split(" ")
        if i > 0 and len(line_list) > 10:
            cpu = float(line_list[2])
            memory = float(line_list[3])
            rss = float(line_list[5])
            command = line_list[10]
            ps_cpu[command] = round(ps_cpu.get(command, 0) + cpu, 2)
            ps_memory[command] = round(ps_memory.get(command, 0) + memory, 2)
            ps_rss[command] = round(ps_rss.get(command, 0) + rss, 2)
    sorted_cpu = OrderedDict(sorted(ps_cpu.items(), key=lambda x: x[1], reverse=True))
    sorted_memory = OrderedDict(sorted(ps_memory.items(), key=lambda x: x[1], reverse=True))
    sorted_rss = OrderedDict(sorted(ps_rss.items(), key=lambda x: x[1], reverse=True))
    print("====   CPU%   ====")
    for i, k in enumerate(sorted_cpu.items()):
        if i < top:
            print("{}. {} | {}".format(i, k[0], k[1]))
    print("====   MEM%   ====")
    for i, k in enumerate(sorted_memory.items()):
        if i < top:
            print("{}. {} | {}".format(i, k[0], k[1]))
    print("====   RSS MB   ====")
    for i, k in enumerate(sorted_rss.items()):
        if i < top:
            print("{}. {} | {} MB".format(i, k[0], round((k[1]/1024), 2)))


if __name__ == '__main__':
    sum_process_resources()

1

В качестве альтернативы аргументам в стиле BSD, показанным в других ответах, можно использовать (по крайней мере, с использованием procps, поставляемого Debian и Ubuntu):

ps -eF --sort=-rss

1

простой способ установить htop

в том, что вы можете сортировать процесс по PID, Percentage CPU, MEM

более сложный


0
  1. Запустить topкоманду
  2. Shift + F сортировать по полю (см. полное меню ниже)
  3. Выберите nдля сортировки на основе использования памяти

n:% MEM = использование памяти (RES)


0

Как подсчитать использованную память по имени процесса:

Иногда, даже глядя на самые большие отдельные процессы, все еще остается много неиспользованной памяти. Чтобы проверить, существует ли много таких же меньших процессов, использующих память, вы можете использовать команду, подобную следующей, которая использует awk для суммирования общего объема памяти, используемой процессами с одинаковым именем:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

например, вывод

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.