Sortieren von Prozessen nach Speichernutzung


128

Ich kann die Liste aller Prozesse und den Speicher über sehen

ps aux 

und durch die VSZ und RSS gehen

Gibt es eine Möglichkeit, die Ausgabe dieses Befehls in absteigender Reihenfolge nach RSS-Wert zu sortieren?


Was wäre der erwartete Output? Scheckps
Rahul Patil

Weitere Anwendungsbeispiele --sortfinden Sie hier: alvinalexander.com/linux/…
slm

1
Super Frage mit einem beliebigen Tool: stackoverflow.com/questions/4802481/…
Ciro Santilli

Antworten:


224

Verwenden Sie den folgenden Befehl:

ps aux --sort -rss

Überprüfen Sie hier, ob mehr Linux-Prozessspeicher verwendet wird


12
hinweis - wenn du die besten ergebnisse sehen willst, ist es hilfreich, sie in headlikeps aux --sort -rss | head -n15
Yehosef

3
Ich bekomme Fehler ps: illegal option -- -
Miguel Mota

@MiguelMota Was passiert , wenn wie folgt aus : ps aux --sort=rss?
coffeMug

2
@coffeMug hat nicht funktioniert, aber das hatps aux | sort -rn -k 6
Miguel Mota

1
@coffeMug nicht sicher, wie man die Version findet, aber ich bin auf Mac OSX, vielleicht ist das der Grund
Miguel Mota

24

Eine schnelle und fehlerhafte Methode besteht darin, die Ausgabe von einfach ps auxan den sortBefehl weiterzuleiten:

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

Beispiel

$ 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
...

Dies gilt nicht für die Spaltenüberschriften, die in die Ausgabe eingemischt werden, ist jedoch in der Befehlszeile leicht zu merken und eine akzeptable Methode, um bei der manuellen Anzeige dieses Ausgabetyps die gewünschten Aktionen auszuführen.

Beispiel

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]

Mehr Tipps

Ein zusätzlicher Tipp wäre, die gesamte Ausgabe an einen anderen Befehl wie z less. Auf diese Weise können Sie die Informationen seitenweise anzeigen und mit den Pfeiltasten und den Aufwärts- / Abwärtstasten durch die Ausgabe blättern.

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

Wenn Ihre Ausgabe viel umschließt, können Sie den -SSchalter auch auf weniger setzen, wodurch die gesamte Ausgabe stattdessen in einer einzelnen Zeile verbleibt. Sie können dann mit den Pfeiltasten nach links / rechts / oben / unten navigieren, um alles zu sehen.

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

Sortierung innerhalb von ps

Bestimmte Versionen von psbieten die Möglichkeit zur Verwendung --sort. Dieser Schalter kann dann Schlüssel annehmen, denen entweder ein +oder ein vorangestellt ist -, um die Sortierreihenfolge zu bezeichnen ... am wenigsten bis am größten oder am wenigsten bis am größten.

Beispiele

vsz, -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]

+ vsz, + 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]

-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

werden die Spalten ps immer so ausgegeben, wie Sie sortsie sehen / verarbeiten möchten?
Felipe Alvarez


2
A ... | lessist ein guter Rat, aber manchmal verfügt Ihr Prozess über eine große Befehlszeile und überfrachtet die Ausgabe. In solchen Fällen ... | less -Sfunktioniert das besser.
Verschwenden

@waste - guter Tipp, denk einfach daran, dass -Sabgeschnitten wird und du möglicherweise etwas von dem verlierst, was du sehen möchtest, aber ansonsten gute Ratschläge, wenn du nur an den Spalten ganz links interessiert bist.
SLM

@slm Ich bin mir nicht sicher, ob das der Fall ist less -S. Wenn Sie die lessAnsicht schließen , wird alles ausgeblendet. Solange Sie sich jedoch in der Ansicht befinden, können Sie sowohl vertikal als auch horizontal scrollen. Das Kopieren könnte jedoch schwierig sein.
Verschwenden Sie den

6

Auch wenn ps nicht den tatsächlich verwendeten Speicher widerspiegelt, ist dieser Befehl sehr hilfreich.

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 "" }'

3

ps aux --sort -rss ist nett:

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

Wenn Sie jedoch die Speicher- und CPU-Auslastung nach Anwendung anzeigen möchten (gruppiert nach Befehlen):

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

Code:

#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

Alternativ zu den in den anderen Antworten gezeigten Argumenten im BSD-Stil kann man Folgendes verwenden (zumindest procps, das von Debian und Ubuntu geliefert wird):

ps -eF --sort=-rss

1

einfache möglichkeit ist die installation von htop

, dass Sie den Prozess nach PID, Prozentsatz CPU, MEM sortieren können

anspruchsvoller


0
  1. topBefehl ausführen
  2. Shift + F um nach Feldern zu sortieren (siehe das vollständige Menü unten)
  3. Wählen Sie ndiese Option , um basierend auf der Speichernutzung zu sortieren

n:% MEM = Speichernutzung (RES)


0

So addieren Sie den belegten Speicher nach Prozessnamen:

Wenn man sich die größten Einzelprozesse ansieht, ist manchmal immer noch viel verbrauchter Speicher nicht belegt. Um zu überprüfen, ob der Speicher von vielen kleineren Prozessen belegt ist, können Sie einen Befehl wie den folgenden verwenden, der awk verwendet, um den von gleichnamigen Prozessen belegten Gesamtspeicher zusammenzufassen:

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

zB Ausgabe

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.