Mengurutkan proses berdasarkan penggunaan memori


128

Saya dapat melihat daftar semua proses dan memori melalui

ps aux 

dan melalui VSZ dan RSS

Apakah ada cara untuk mengurutkan output dari perintah ini dengan urutan menurun pada nilai RSS?


Apa yang akan menjadi output yang diharapkan? checkps
Rahul Patil

Contoh tambahan tentang cara menggunakan --sortada di sini: alvinalexander.com/linux/…
slm

Jawaban:


224

Gunakan perintah berikut:

ps aux --sort -rss

Periksa di sini untuk lebih banyak penggunaan memori proses Linux


12
perhatikan - jika Anda ingin melihat hasil teratas akan sangat membantu untuk menyalurkannya menjadi headsepertips aux --sort -rss | head -n15
Yehosef

3
Saya mendapatkan kesalahan ps: illegal option -- -
Miguel Mota

@MiguelMota Bagaimana jika seperti ini: ps aux --sort=rss?
coffeMug

2
@coffeMug tidak berfungsi tetapi ini berhasilps aux | sort -rn -k 6
Miguel Mota

1
@coffeMug tidak yakin bagaimana menemukan versi tapi saya menggunakan Mac OSX jadi mungkin itu sebabnya
Miguel Mota

25

Metode cepat dan kotor adalah dengan hanya mem-pipe output dari ps auxke sortperintah:

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

Contoh

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

Ini tidak menangani untuk tajuk kolom yang dicampur dengan output, tetapi mudah diingat pada baris perintah, dan merupakan cara yang dapat diterima untuk melakukan apa yang Anda inginkan ketika secara manual melihat jenis output ini.

Contoh

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]

Lebih banyak tips

Tip tambahan akan mem-pipe seluruh output ke perintah lain seperti less. Ini memungkinkan Anda untuk melihat informasi suatu halaman pada satu waktu dan juga menggunakan tombol panah dan tombol naik / turun halaman untuk menggulir bolak-balik melalui output.

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

Jika output Anda banyak, Anda juga dapat menggunakan -Sswitch menjadi lebih sedikit, yang akan memaksa semua output tetap pada satu baris saja. Anda kemudian dapat menggunakan tombol panah untuk bergerak ke kiri / kanan / atas / bawah untuk melihat semuanya.

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

Mengurutkan dalam ps

Versi tertentu psmemberikan kemampuan untuk digunakan --sort. Sakelar ini kemudian dapat mengambil kunci yang diawali dengan a +atau a -untuk menunjukkan urutan pengurutan ... paling sedikit ke terbesar atau terhebat ke yang terkecil.

Contohnya

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

akan ps selalu menampilkan kolom dengan cara yang Anda harapkan sortuntuk melihat / memprosesnya?
Felipe Alvarez

Tergantung pada versi ps
slm

2
A ... | lessadalah saran yang bagus tetapi kadang-kadang proses Anda memiliki baris perintah besar dan mengacaukan output. Dalam kasus seperti itu ... | less -Sberfungsi lebih baik.
buang

@waste - tip yang bagus, ingat saja -Struncate dan Anda mungkin kehilangan sebagian dari apa yang ingin Anda lihat, tetapi saran yang bagus jika Anda hanya tertarik pada kolom paling kiri.
slm

@ ms Saya tidak yakin itu adalah kasus untuk less -S. Ketika Anda menutup lesstampilan, semuanya menghilang, tetapi selama Anda berada dalam tampilan, Anda dapat menggulir secara vertikal tetapi juga secara horizontal. Menyalin mungkin sulit.
buang

6

Bahkan jika ps tidak mencerminkan memori aktual yang digunakan, perintah ini cukup membantu.

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 bagus:

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

tetapi jika Anda ingin melihat memori dan penggunaan CPU berdasarkan aplikasi (dikelompokkan berdasarkan perintah):

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

kode:

#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

Sebagai alternatif untuk argumen gaya BSD yang ditunjukkan dalam jawaban lain, orang dapat menggunakan (setidaknya menggunakan procps, dikirimkan oleh Debian dan Ubuntu):

ps -eF --sort=-rss

1

cara sederhana adalah menginstal htop

karena Anda dapat mengurutkan proses berdasarkan PID, Persentase CPU, MEM

lebih mutakhir


0
  1. Jalankan topperintah
  2. Shift + F untuk mengurutkan berdasarkan bidang (lihat menu lengkap di bawah)
  3. Pilih nuntuk mengurutkan berdasarkan penggunaan memori

n:% MEM = Penggunaan memori (RES)


0

Cara menjumlahkan memori yang digunakan berdasarkan nama proses:

Kadang-kadang bahkan melihat proses tunggal terbesar masih ada banyak memori yang digunakan tidak terhitung. Untuk memeriksa apakah ada banyak proses yang lebih kecil yang sama menggunakan memori, Anda dapat menggunakan perintah seperti berikut yang menggunakan awk untuk meringkas total memori yang digunakan oleh proses dengan nama yang sama:

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

misalnya keluaran

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.