Linux程序管理:top.htop.glances,dstat等命令使用方法

什麼是進程?

Linux系統中:觸發任何一個事件時,系統都會將它定義爲一個進程,並且給予這個進程一個ID,稱爲PID,同時依據觸發這個進程的用戶與相關屬性,給予這個PID一組有效的全鄉設置。而程序就是系統工作時,啓動的二進制文件。程序一般是在磁盤中的,通過用戶的執行觸發,然後加載到內存中成爲一個個體,即進程。而常駐在內存中的進程通常都是負責一些系統所提供的功能以服務用戶的各項任務,因此這些常駐進程就會被稱爲服務

 

進程和線程的區別:

1.定義

進程是具有一定獨立功能的程序,是系統進行資源分配和調度的一個獨立單位.

線程進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源,但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.

2.區別

進程和線程的主要差別在於它們是不同的操作系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。

總結:

1) 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.

2) 線程的劃分尺度小於進程,使得多線程程序的併發性高。

3) 另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。

4) 線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

5) 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

 

 

作業管理(job control)

可以把有提示符讓你操作的環境,即命令行稱爲前臺(foreground),至於其他作業就可以讓你放在後臺(background)執行或暫停。

注意:放入後臺的作業,它必須不能與用戶交互。例:vim放在後臺也是不會執行的,而cp放在後臺還是會接着執行的。

 

將前臺作業送往後臺的方法:

&Ctrl+z:

例:

[root@bogon ~]# cp -r /etc/ /tmp/etc &
[1] 2610
[root@bogon ~]# jobs
[1]+  Running                 cp -i -r /etc/ /tmp/etc &
[root@bogon ~]# jobs
[1]+  Done                    cp -i -r /etc/ /tmp/etc


例:

vim a.txt

Ctrl+z

jobs命令用法:

jobs [-lrs]

-l : 除了列出jobnumber還列出PID號碼

-r :只列出在後臺run的作業

-s :僅列出在後臺stop的作業

 


例:

[root@bogon ~]# jobs
[1]+  Stopped                 vim a
[root@bogon ~]# jobs -l
[1]+  2625 Stopped                 vim a


[1]job number

+ fg命令默認會第一個取回到前臺的命令

- fg命令默認會第二個取回到前臺的命令

 

將後臺作業拿到前臺處理fg命令

fg %jobnumber

fg %1

 

讓作業在後臺的狀態變成運行中bg命令

bg %jobnumber

bg %1

 

管理後臺當中的作業kill命令

列出kill能使用的信號有哪些:kill -l

[root@bogon ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

kill -信號數字 %jobnumber

-1 重新讀取一次配置文件

-2 中斷,與Ctrl+c一樣

-9 強制刪除一個工作

-15 以正常方式終止一項作業

 

注意-9 一般是在強制刪除一個不正常的作業時所使用的,-15則是以正常步驟結束一項作業(15也是默認值)

 

例:kill -9 %1

進程管理:

 

1.進程查看:

 

pstree命令用法:

pstree命令:     進程樹查看;

-p: 顯示各進程的PID

[root@bogon ~]# pstree
init─┬─abrtd
     ├─acpid
     ├─atd
     ├─auditd───{auditd}
     ├─automount───4*[{automount}]
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─cupsd
     ├─dbus-daemon
     ├─dhclient
     ├─hald─┬─hald-runner─┬─hald-addon-acpi
     │      │             └─hald-addon-inpu
     │      └─{hald}
     ├─login───bash
     ├─master─┬─pickup
     │        └─qmgr
     ├─5*[mingetty]
     ├─rpc.statd
     ├─rpcbind
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd───sshd───bash───pstree
     └─udevd───2*[udevd]

ps命令用法:

ps :將某個時間點的進程運行情況選取下來

                 

根據進程啓動時是否是通過終端上的用戶接口交互式啓動的,進程可分爲兩類:

與終端相關的進程: a

與終端無關的進程: x

以用戶爲中心組織進程狀態信息顯示:u

 

常用選項組合1axu

ps axu

[root@bogon ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19356  1536 ?        Ss   11:17   0:00 /sbin/init
root          2  0.0  0.0      0     0 ?        S    11:17   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    11:17   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    11:17   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    11:17   0:00 [stopper/0]
root          6  0.0  0.0      0     0 ?        S    11:17   0:00 [watchdog/0]
root          7  0.0  0.0      0     0 ?        S    11:17   0:10 [events/0]

USER:該進程屬於哪個用戶的賬號

PID:該進程的進程ID

%CPU:該進程使用CPU的資源百分比

%MEM:該進程所佔用的物理內存百分比

VSZ: Virtual memory Size

線性地址空間佔用的空間大小,即虛擬內存佔用量(KB)

RSS:常用駐內存集;指不可以被交換至swap空間的數據佔據空間大小;即佔用的固定內存量(KB)

TTY:該進程是在哪個終端機上面運行,若與終端機無關則顯示?

STAT:進程狀態

R: running,運行狀態;

Sinterruptible sleeping,可中斷睡眠

Duniterruptible sleeping, 不可中斷睡眠

T: stopped,停止狀態

Z: zombie,殭屍狀態,進程已經終止但卻無法被刪除至內存外,殭屍進程的原因就是因爲該進程已經執行完畢,或因故應該終止了,但該進程的父進程卻無法完整的將該進程結束掉,造成該進程一直存在內存中

 

s: session leader 會話進程的首進程

+: 前臺進程,佔據着某終端

l: 多線程進程

<: 高優先級進程

N: 低優先級進程

START: 啓動時間

TIME:佔據CPU累積時長

COMMAND:啓動當前進程或線程的命令行程序,[]表示爲內核線程;

 

常用選項組合2: -ef

-e: 顯示所有進程;

-f: 顯示豐富格式信息

 

常用選項組合3-eFH

-F: 顯示額外信息

-H: 以層級形式顯示進程間關係;

 

自定義需要顯示的信息:axo

ps axo pid,command,psr,pri,ni

psr: 當前進程運行的CPU編號;

pri: 當前進程的優先級;

ni: 當前進程的nice值;

-20, 19

pgrep: 過濾只顯示指定信息

語法格式:pgrep [OPTIONS] "PATTERN"

-U UID:僅顯示以指定用戶身份運行的進程;

-G GID

-l: 顯示PID和進程名;

pidof: 獲取一個正在運行的程序的ID

例:pidof /bin/bash

[root@bogon ~]# pidof /bin/bash
2476 1844

    

top命令用法:

[root@bogon ~]# top
top - 15:10:38 up  3:53,  2 users,  load average: 0.00, 0.00, 0.00
Tasks:  94 total,   1 running,  93 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.5%id,  0.2%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   1004352k total,   430648k used,   573704k free,    34504k buffers
Swap:  2097148k total,        0k used,  2097148k free,   287016k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                 
  2985 root      20   0 15032 1092  828 R  2.0  0.1   0:00.05 top                                                                                                      
     1 root      20   0 19356 1536 1224 S  0.0  0.2   0:00.85 init                                                                                                     
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                                 
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0                                                                                              
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.03 ksoftirqd/0                                                                                              
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0                                                                                                
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0                                                                                               
     7 root      20   0     0    0    0 S  0.0  0.0   0:12.81 events/0                                                                                                 
     8 root      20   0     0    0    0 S  0.0  0.0   0:00.00 cgroup                                                                                                   
     9 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper

第一行(top...):這一行顯示的資訊分別爲:

目前的時間,亦即是 14:34:29 那個項目;

開機到目前爲止所經過的時間,亦即是 up 3:17 那個項目;

已經登入系統的使用者人數,亦即是 2 user項目;

系統在 1, 5, 15 分鐘的平均工作負載。 batch 工作方式爲負載小於0.7,代表的是 1, 5, 15 分鐘,系統平均要負責運作幾個程序(工作)的意思。 越小代表系統越閒置,若高於 1 得要注意你的系統程序是否太過繁複了。一般隊列長度的合理區間:CPU顆數*0.7uptime命令: 顯示當前系統時間,運行時長,登錄用戶數及系統平均負載;

第二行(Tasks...):

顯示的是目前程序的總量與個別程序在什麼狀態(running, sleeping, stopped, zombie)。 比較需要注意的是最後的 zombie 那個數值

第三行(Cpus...):

顯示的是 CPU 的整體負載,每個項目可使用 ? 查閱。需要特別注意的是 %wa ,那個項目代表的是 I/O wait, 通常你的系統會變慢都是 I/O 產生的問題比較大!因此這裏得要注意這個項目耗用 CPU 的資源喔! 另外,如果是多核心的設備,可以按下數字鍵‘1’來切換成不同 CPU 的負載率。

第四行與第五行:

表示目前的物理內存與虛擬內存 (Mem/Swap) 的使用情況。要注意的是 swap 的使用量要儘量的少!如果 swap 被用的很大量,表示系統的物理內存實在不足!

第六行:這個是當在 top 程式當中輸入指令時,顯示狀態的地方。

至於 top 下半部分的畫面,則是每個 process 使用的資源情況。比較需要注意的是:

PID :每個 process 的 ID 6

USER:該 process 所屬的使用者;

PR :Priority 的簡寫,程序的優先執行順序,越小越早被執行;

NI :Nice 的簡寫,與 Priority 有關,也是越小越早被執行;

VIRT:虛擬內存;

RES:常駐內存;

SHR:共享內存;

S:狀態;

%CPU:CPU 的使用率;

%MEM:內存的使用率;

TIME+:累計使用CPU 時間;

COMMAND:命令行程序

 

P:以佔據的CPU百分比大小排序;

M:以佔據Memory空間大小排序;

TCPU累積佔用時間排序;

 

l: 是否顯示系統負載行;

隊列長度的合理區間:CPU顆數*0.7

uptime命令: 顯示當前系統時間,運行時長,登錄用戶數及系統平均負載;

[root@bogon ~]# uptime
 15:11:33 up  3:54,  2 users,  load average: 0.00, 0.00, 0.00

t: 是否顯示進程摘要信息及CPU負載狀態;

Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

us: user space

運行用戶程序所佔據的CPU百分比

sy: system (kernel space)

 運行內核程序所佔據的CPU百分比

ni: nice

調整nice值之後影響到的CPU百分比

id: idle

空閒CPU百分比

wa: wait io

等待I/O完成佔據CPU的百分比

hi: hardware interrupt

處理硬件中斷佔據的CPU百分比

si: software interrupt

處理軟件中斷佔據的CPU百分比

st: stolen

被虛擬化技術“偷走”CPU的百分比

一般ussy7:3最佳

1:平均或單獨顯示CPU的負載狀態;

m: 是否顯示內存相關的狀態信息;

 

q: 退出命令

s: 修改延遲時長

k: 終止指定進程

 

top命令的選項:

-b: batch,批次顯示

-n #: 顯示的批次數量

-d #: 指明延遲時長

htop命令用法:

    wKiom1UuDnHSWohGAAbM5KzdjGw180.jpg

F1 幫助信息

F2 設置

F3 搜索

F4 過濾

F5 以樹狀結構顯示

F6 按什麼排序

F7/F8 設置NICE

F9 終止進程

F10 退出

 

u: 過濾僅顯示選定用戶的進程;[左側會出現選項欄]

s: 跟蹤選定的進程所發起的系統調用;[選定一個進程按s]

l: 顯示選定進程所打開的文件;[選定一個進程按l]

t: 顯示進程的層次結構,F5一樣;[選定一個進程按t]

a: 設定進程的cpu親緣性;(將選定的進程綁定在指定的CPU上)

 

      選項:

-d #: 延遲時長

-u USERNAME: 僅顯示指定用戶的進程;

-s COLUMN: 根據指定的字段進行排序;

mvstat命令用法:

查看虛擬內存的使用

vmstat -s 顯示內存的狀態統計信息

vmstat 1 3 表示1秒刷新一次,共3

[root@bogon tmp]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 421292  45176 427532    0    0    19    19   13   14  0  0 99  0  0	
[root@bogon tmp]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 421300  45184 427560    0    0    19    19   13   14  0  0 99  0  0	
 0  0      0 421260  45184 427560    0    0     0     0   15   13  0  0 100  0  0	
 0  0      0 421260  45184 427560    0    0     0     0   12   14  0  0 100  0  0	

進程相關(procs) 的項目分別爲:

r:等待運作中的程序數量即等待運行的進程的個數;(隊列長度)

b:不可被喚醒的程序數量即處理不可中斷睡眠狀態的進程的個數;(即IO阻塞隊列長度)

這兩個項目越多,代表系統越忙碌 (因爲系統太忙,所以很多程序就無法被執行或一直在等待而無法被喚醒之故)。

內存(memory) 項目分別爲

swpd: 交換內存使用量;

free: 空間的物理內存量;

buffer: 用於緩衝的內存總量;

cache: 用於緩存的內存總量;

內存交換空間(swap) 的項目分別爲:

si: 數據進入swap中的速率(kb/s)

so: 數據離開swap的速率(kb/s)

如果si/so的數值太大,意味着物理內存不夠用了,表示內存中的資料常常得在磁盤和內存之間傳來傳去,系統效率會很差

磁盤讀寫(io) 的項目分別爲:

bi: 從塊設備讀入數據到系統的速率(kb/s)

bo: 保存數據至塊設備的速率(kb/s)

如果這部份的值越高,代表系統中有進程I/O非常忙碌

系統(system) 的項目分別爲:

in:每秒被中斷的程序次數;

cs:每秒鐘進行的事件切換次數;

這兩個數值越大,代表系統與周邊設備的溝通非常頻繁! 這些周邊設備當然包括磁盤、網卡、時鐘等。

CPU 的項目分別爲[top中有詳細介紹]

us:非核心層的 CPU 使用狀態;

sy:核心層所使用的CPU 狀態;

id:閒置的狀態;

wa:等待 I/O所耗費的 CPU 狀態;

st:被虛擬機器(virtual machine) 所盜用的 CPU 使用狀態。


glances命令用法[epel]:

進程查看工具

wKioL1UuGfqTRp4_AAPtrogSzvo043.jpg

      常用選項:

-b: Byte/s爲單位顯示網卡設備數據交換速率;

-d: 關閉磁盤I/O功能模塊;

-f /PATH/TO/SOMEFILE:設置輸出文件的位置及格式;把

-o HTML|CSV:使用HTML/CSV格式

[root@bogon tmp]# glances -f test.txt -o CSV
[root@bogon tmp]# cat test.txt 
load,0.08,0.03,0.0
mem,1028456448,131133440,897323008
swap,2147479552,0,2147479552
cpu,1.30718954248,2.61437908497,0.0,96.0784313726,0.0,0.0
load,0.08,0.03,0.0
mem,1028456448,131624960,896831488
swap,2147479552,0,2147479552

-m: 關閉mount功能模塊

-n: 關閉網絡功能模塊

-r: 關閉進程列表功能模塊

-t #: 指定延遲時長,默認爲3秒;

-1:單獨顯示每顆CPU相關負載數據信息;


glances支持遠程模式:

  即可以以C/S模式工作:

      Server: 以監聽模式啓動glances

      Client: 以遠程模式啓動glances,遠程連入指定服務器,並顯示Server上的相關性能數據;

     

  服務模式:

    glances -s -B 本地IP地址

      -B: 用於指明監聽的本地地址;

     

  客戶端模式:

    glances -c 服務器IP地址

      -c: 用於連入的服務器的地址;

例:   192.168.1.108上執行glances -s -B 192.168.1.108

192.168.1.106上執行glances -c 192.168.1.108

注意:可能由於防火牆的原因無法連接



dstat命令用法:

統計系統資源數據的多用途工具,整合了vmstat, iostat, netstat and ifstat四款工具的功能;

 

dstat

-c: 顯示cpu性能指標相關的統計數據;

[root@bogon nginx-1.6.2]# dstat -c
----total-cpu-usage----
usr sys idl wai hiq siq
  0   0  99   0   0   0
  0   0 100   0   0   0
  0   0 100   0   0   0

-d: 顯示disk相關的速率數據;

[root@bogon nginx-1.6.2]# dstat -d
-dsk/total-
 read  writ
  16k   16k
   0     0 
   0     0 
   0     0

-g: 顯示page相關的速率數據;

[root@bogon nginx-1.6.2]# dstat -g
---paging--
  in   out 
   0     0 
   0     0 
   0     0

-i: 顯示interrupt相關的速率數據;

[root@bogon nginx-1.6.2]# dstat -i
----interrupts---
  17    18    19 
   1     0     1 
   0     0     3 
   0     0     2 
   0     0     3

-l: 顯示loadaverage相關的統計數據;

[root@bogon nginx-1.6.2]# dstat -l
---load-avg---
 1m   5m  15m 
   0    0    0
   0    0    0
   0    0    0

-m: 顯示memory相關的統計數據;

-n: 顯示網絡收發數據的速率;

-p: 顯示進程相關的統計數據;

-r: io請求的速率;

-s: 顯示swap的相關數據;

-y: 顯示系統相關的數據,包括中斷和進程切換;

 

--top-cpu:顯示最佔用CPU的進程;

--top-bio:顯示最消耗blockio的進程;

--top-io:最佔用io的進程;

--top-mem:顯示最佔用內存的進程;

 

--ipc: 顯示進程間通信相關的速率數據;

--raw: 顯示raw套接的相關的數據;

--tcp: 顯示tcp套接字的相關數據;

--udp: 顯示udp套接字的相關數據;

--unix: 顯示unixsock接口相關的統計數據;

--socket:顯示套接字,相當於--raw --tcp --udp一起使用

 

-a:顯示CPU,磁盤,網絡,頁面,系統相關信息,相當於-cdngy


kill命令用法:

IPC: 進程間通信

  常見形式:

    message queue

    semerphore

    shared memory

    signal

   

signal: 傳遞給進程的短小信息

Linux主機支持的進程間可用到的信息:

(1)kill -l   [上面jobs有描述]

(2)man 7 signal

 

向進程發信號:

kill[-SIGNAL] PID

默認的信號爲SIGTERM

 

信號表示方式:

(1) 完整名稱,例如SIGINT

(2) 簡寫名稱,例如INT

(3) 數據代稱,例如2

常用信號:

SIGHUP

1

通知進程重讀其配置文件以讓新的配置生效,但不用重新啓動進程

SIGINT

2

打斷正在運行中的進程,相當於鍵盤組合鍵Ctrl+c

SIGKILL

9

強行中止正在運行中的進程

SIGTERM

15

安全中止正在運行中的進程

SIGSTOP

19

暫停進程

SIGCONT

18

繼續運行指定進程

kill -15 1521

      kill -SIGTERM 1521

      kill -TERM 1521

kill相似的一組進程:

killall[-SIGNAL] PROGRAM

例:killall -15 http


進程優先級調整:

   靜態優先級:

通過指定進程的nice值來調整其優先級;用戶空間運行的進程一般都有其nice值;

nice值: -20,19

優先級:  100, 139

注意:值越低優先級越高

默認啓動進程時,其nice值爲0, 其優先級爲120

   

   (1) 對於尚未啓動的進程,調整nice值:

nice -n NICE COMMAND

nice -n 3 vim test.txt

    (2) 對於已經啓動並處於運行中的進程,調整nice值:

 renice -n NICE PID

renice -n 4 1521 

   注意:普通用戶僅能夠調大nice,調低優先級;只有root可以提高優先級




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章