Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式最占cpu的进程

有些话、适合烂在心里 提交于 2019-11-30 23:17:47

Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式

 #########

 

# top -b -o +%CPU | head -n 22
top - 21:02:00 up 2:34, 9 users, load average: 0.10, 0.08, 0.11
Tasks: 190 total, 1 running, 189 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.2 us, 2.2 sy, 0.0 ni, 94.4 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3764128 total, 1585344 free, 1056656 used, 1122128 buff/cache
KiB Swap: 8388592 total, 8388592 free, 0 used. 2093248 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8277 root 20 0 20768 3456 2480 R 12.5 0.1 0:00.03 top
2263 root 20 0 225248 67008 33248 S 6.2 1.8 2:55.64 Xorg
2934 cs2c 20 0 370128 33984 25440 S 6.2 0.9 1:17.02 nm-applet
1 root 20 0 8288 5104 3520 S 0.0 0.1 0:08.16 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:01.34 rcu_preempt
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_sched
11 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
12 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/1
16 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/2
17 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/2

##########


[root@localhost ~]# top -b -o +%MEM | head -n 22
top - 21:02:21 up 2:34, 9 users, load average: 0.07, 0.07, 0.11
Tasks: 190 total, 1 running, 189 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.2 us, 2.2 sy, 0.0 ni, 94.4 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3764128 total, 1584064 free, 1057904 used, 1122160 buff/cache
KiB Swap: 8388592 total, 8388592 free, 0 used. 2092032 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3809 cs2c 20 0 2048432 276368 131472 S 0.0 7.3 1:35.16 firefox
3884 cs2c 20 0 1648624 227712 83984 S 0.0 6.0 4:01.08 Web Content
3102 cs2c 20 0 687184 143808 100256 S 0.0 3.8 0:16.76 wps
3122 cs2c 20 0 672624 143216 99824 S 0.0 3.8 0:04.76 et
3120 cs2c 20 0 663232 135136 96224 S 0.0 3.6 0:06.21 wpp
3411 cs2c 20 0 659552 131904 94048 S 0.0 3.5 0:05.20 wps
3415 cs2c 20 0 639296 131120 94416 S 0.0 3.5 0:05.75 et
3413 cs2c 20 0 647072 125040 89808 S 0.0 3.3 0:06.36 wpp
2496 cs2c 20 0 606848 74176 39840 S 0.0 2.0 1:22.02 mutter
2263 root 20 0 224224 67008 33248 S 0.0 1.8 2:56.27 Xorg
3998 cs2c 20 0 411600 66016 32448 S 0.0 1.8 0:56.40 xchm
3499 cs2c 20 0 397072 55088 35056 S 0.0 1.5 0:15.05 xchm
2556 cs2c 20 0 1011520 52944 32272 S 0.0 1.4 0:09.02 caja
3586 cs2c 20 0 391040 48208 33120 S 0.0 1.3 0:08.45 xchm
3484 cs2c 20 0 394928 45216 31552 S 0.0 1.2 0:02.22 xchm
[root@localhost ~]#

 ################
最占cpu的进程

ps 指令輸出

若要找出系統上最耗費 CPU 的程式,也是使用類似的指令,只是在排序時,將排序的欄位換成 CPU 使用量:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head#########################

top 指令輸出

若要找出最耗費 CPU 資源的行程,則改用 CPU 使用量來排序即可:

top -b -o +%CPU | head -n 17###

# ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 4034 4.1 0.0 0 0 ? S 18:34 5:53 [kworker/0:0]
cs2c 3884 2.7 5.8 1643504 219424 ? Sl 18:33 3:58 /usr/lib64/firefox/firefox -contentproc -greomni /usr/lib64/firefox/omni.ja -appomni /usr/lib64/firefox/browser/omni.ja -appdir /usr/lib64/firefox/browser 3809 tab
root 2263 1.9 1.7 224208 67024 tty7 Ssl+ 18:28 2:52 /usr/libexec/Xorg -core -background none :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
cs2c 3809 1.0 7.3 2048432 276368 ? Sl 18:32 1:33 /usr/lib64/firefox/firefox
root 74 0.9 0.0 0 0 ? S 18:27 1:27 [kworker/0:2]
cs2c 2496 0.9 1.9 606848 74176 ? Sl 18:28 1:20 mutter
cs2c 2934 0.8 0.9 370128 33984 ? Sl 18:28 1:15 nm-applet
cs2c 3998 0.6 1.7 411600 66016 ? Sl 18:33 0:56 xchm /home/yixuan/20191009chm/MySQL分布式.chm
cs2c 3453 0.4 0.0 20976 3664 pts/0 S+ 18:28 0:38 top
cs2c 2699 0.2 0.3 263888 14480 ? Sl 18:28 0:18 /usr/libexec/mate-panel/notification-area-applet

  
####################
 
##################### 

這裡介紹如何在 Linux 中使用 ps 與 top 指令列出系統上最吃 CPU 與記憶體的程式。

作為 Linux 系統的管理者,時常都需要查看系統的負載狀況,如果系統中出現不正常的程式,吃掉太多的 CPU 或記憶體資源,就會影響系統的效能,太嚴重的話甚至會造成當機等狀況。

 

查閱系統負載(loading)與行程(process)的狀況最常用的就是 ps 與 top 這兩個指令,以下我們示範如何利用這兩個指令撰寫簡單的指令稿,自動找出系統上最耗費資源的程式。

 

ps 指令

這行指令可利用 ps 指令列出行程的一些基本資訊,按照每個行程所使用的記憶體排序後,列出排名最前面的幾個行程,也就是列出系統上最耗費記憶體的程式:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head

這裡的 -e 參數是代表輸出所有行程的資訊,而 -o 參數則是用來指定輸出欄位用的,後面接著所有想要輸出的欄位名稱,這裡我們讓 ps 輸出以下幾個欄位:

  • pid:行程 ID(process ID)。
  • ppid:父行程 ID(parent process ID)。
  • cmd:程式名稱。
  • %mem:記憶體使用量(百分比)。
  • %cpu:CPU 使用量(百分比)。

而 --sort 參數則是指定排序的依據欄位,預設會依照數值由小到大排序,若要由大到小的方式排序的話,可以在欄位名稱前加上一個負號。以這個例子來說,我們將排序的欄位指定為 -%mem,這樣就可以依照記憶體使用量,從大到小排序。

最後將 ps 的輸出以 Linux 管線(pipe)導向至 head,只保留前 10 行的資料,其餘的都丟棄,以下是輸出的結果。

  PID  PPID CMD                         %MEM %CPU   2124  1278 /usr/lib/chromium-browser/c 25.0 14.4   1446  1278 /usr/lib/chromium-browser/c 21.5 15.4   1253     1 /usr/lib/chromium-browser/c 19.2 13.0   1328  1278 /usr/lib/chromium-browser/c  7.6  2.9   1392  1278 /usr/lib/chromium-browser/c  7.6  0.5    732   669 /usr/bin/X :0 -seat seat0 -  5.7  2.0   1060     1 /usr/lib/arm-linux-gnueabih  1.8  0.0   1086   758 pcmanfm --desktop --profile  1.5  0.2   1085   758 lxpanel --profile LXDE-pi    1.5  0.3

ps 指令輸出

若要找出系統上最耗費 CPU 的程式,也是使用類似的指令,只是在排序時,將排序的欄位換成 CPU 使用量:

ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head

輸出為:

  PID  PPID CMD                         %MEM %CPU   1446  1278 /usr/lib/chromium-browser/c 33.8 19.6   1253     1 /usr/lib/chromium-browser/c 19.6 12.1   2124  1278 /usr/lib/chromium-browser/c 20.5 11.2   2555     1 gvim -f                      2.5  6.3   1328  1278 /usr/lib/chromium-browser/c  6.1  3.0    732   669 /usr/bin/X :0 -seat seat0 -  7.1  2.2   1392  1278 /usr/lib/chromium-browser/c  6.7  0.5   1085   758 lxpanel --profile LXDE-pi    1.5  0.3   1060     1 /usr/lib/arm-linux-gnueabih  1.3  0.1

ps 指令輸出

 

top 指令

top 指令是一個互動式(interactive)的工具,可以顯示即時的系統負載狀態,而它也可以用於指令稿中,輸出各種系統資訊。

這行指令可將系統行程以記憶體的使用賴排序後,以 batch 模式輸出報表,並且只保留前 10 個最耗費記憶體的行程:

top -b -o +%MEM | head -n 17

其中 -b 參數是 batch 模式的意思,而 -o 參數則是設定以記憶體用量來排序行程,最後面的 head -n 17 則是篩選 top 輸出的文字內容,只保留前 17 行,剩餘的內容則捨棄。輸出會類似這樣:

top - 14:54:24 up 7 min,  3 users,  load average: 0.99, 1.52, 0.87  Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie  %Cpu(s): 17.0 us,  2.7 sy,  0.1 ni, 68.2 id, 11.9 wa,  0.0 hi,  0.1 si,  0.0 st  KiB Mem:    947732 total,   757336 used,   190396 free,     9892 buffers  KiB Swap:  1914876 total,     8588 used,  1906288 free.   288704 cached Mem      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   1392 pi        20   0  557272 206424  90776 S   0.0 21.8   1:46.69 chromium-b+   1223 pi        20   0  674816 194156 126276 S   0.0 20.5   1:42.47 chromium-b+   1490 pi        20   0  459804 164732  76728 S   5.6 17.4   0:44.62 chromium-b+    732 root      20   0  245288  84204  52640 S   0.0  8.9   0:15.90 Xorg   1353 pi        20   0  366756  82720  47504 S   0.0  8.7   0:07.21 chromium-b+   1357 pi        20   0  355952  77080  55684 S   0.0  8.1   0:09.30 chromium-b+   1293 pi        20   0  354048  73844  51024 S   0.0  7.8   0:13.32 chromium-b+   1084 pi        20   0  105612  29380  24928 S   0.0  3.1   0:02.43 lxpanel   1243 pi        20   0  189852  28780  23760 S   0.0  3.0   0:00.16 chromium-b+   1086 pi        20   0  147124  26976  24256 S   0.0  2.8   0:01.63 pcmanfm

top 指令輸出

若要找出最耗費 CPU 資源的行程,則改用 CPU 使用量來排序即可:

top -b -o +%CPU | head -n 17

輸出會類似這樣:

top - 15:12:19 up 25 min,  4 users,  load average: 1.66, 1.43, 1.08  Tasks: 173 total,   1 running, 172 sleeping,   0 stopped,   0 zombie  %Cpu(s): 13.4 us,  1.8 sy,  0.1 ni, 79.0 id,  5.6 wa,  0.0 hi,  0.1 si,  0.0 st  KiB Mem:    947732 total,   870680 used,    77052 free,     5588 buffers  KiB Swap:  1914876 total,   148740 used,  1766136 free.   267360 cached Mem      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   1959 pi        20   0  327404  49012  22340 S 107.0  5.2   0:02.75 java   1490 pi        20   0  459804  99192  49040 S   5.9 10.5   1:26.10 chromium-b+   1809 pi        20   0  576268 162008  55228 S   5.9 17.1   0:57.49 chromium-b+   1969 pi        20   0    7052   2380   2060 R   5.9  0.3   0:00.03 top      1 root      20   0   22948   2768   2120 S   0.0  0.3   0:04.85 systemd      2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd      3 root      20   0       0      0      0 S   0.0  0.0   0:00.14 ksoftirqd/0      5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+      6 root      20   0       0      0      0 S   0.0  0.0   0:02.67 kworker/u8+      7 root      20   0       0      0      0 S   0.0  0.0   0:01.41 rcu_sched

通常如果發現異常的程式佔用了太多的 CPU 或記憶體,最好的處理方式就是把這些程式正常關閉,如果程式當掉無法關閉的話,就可以使用 kill 或 killall 這類的指令,中止不正常程式的執行,由於上面的報表中都有每個程式的 PID,所以使用 PID 來中止特定的程式是最直接的方式。

假設我們想要中止的程式其 PID 是 1959,首先我們會用一般的方式嘗試讓程式正常結束:

kill 1959

如過執行這行之後,沒有效果的話,再嘗試強制關閉程式:

kill -9 1959

這兩種 kill 指令是最常見的處理方式。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!