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


 

 



[root@localhost ~]# ps -eo pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head

PID PPID %MEM %CPU CMD

11533 11358 1.1 70.1 mate-panel

11562 11358 8.8 47.5 /usr/bin/caja -n

11500 11358 17.1 29.2 /usr/libexec/mate-settings-daemon

11880 11358 55.3 26.3 /usr/libexec/deja-dup/deja-dup-monitor

11346 1 0.4 10.1 /usr/bin/Xvnc :22 -auth /home/cs2c/.Xauthority -desktop localhost.localdomain:22 (cs2c) -fp catalogue:/etc/X11/fontpath.d -geometry 1024x768 -httpd /usr/share/vnc/classes -pn -rfbauth /home/cs2c/.vnc/passwd -rfbport 5922 -rfbwait 30000

14359 14303 0.0 10.1 top

11366 1 0.1 3.5 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

12195 1 0.4 3.4 /opt/kingsoft/wps-office/office6/wps -shield -multiply -automation -nosplash -rpcclientport=/tmp/wpsrpc-1570671007-1303676176 -wait=name,/tmp/wpsrpc-1570671007-1993262559;mode,window

12197 1 0.4 3.3 /opt/kingsoft/wps-office/office6/wpp -shield -multiply -automation -nosplash -rpcclientport=/tmp/wpsrpc-1570671007-1409416479 -wait=name,/tmp/wpsrpc-1570671007-1756499731;mode,window



######### 

# 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


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

​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


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

​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


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

​​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


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

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

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

kill 1959


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

kill -9 1959


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