進程相關命令
top,ps,vmstat,ss
#
top
top - 08:43:01 up 13 min, 5 users, load average: 0.01, 0.22, 0.24
Tasks: 189 total, 1 running, 188 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.3%us, 0.3%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 674684k total, 510748k used, 163936k free, 32368k buffers
Swap: 2047992k total, 0k used, 2047992k free, 204960k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2785 root 20 0 193m 33m 8960 S 1.3 5.0 0:12.49 Xorg
3286 root 20 0 295m 14m 9.8m S 1.0 2.1 0:03.54 gnome-terminal
---------------------------------------------------------------------------------------------------------
說明:
第一行:top - 08:43:01 up 13 min, 5 users, load average: 0.01, 0.22, 0.24
當前系統時間 系統運行時間 當前登錄的用戶數 平均負載:1分鍾、5分鍾、15分鍾
第二行:Tasks: 189 total, 1 running, 188 sleeping, 0 stopped, 0 zombie
總共有多少個進程 運行中的進程數 處於睡眠中的進程 stop狀態的進程數 僵屍進程數
第三行:
Cpu(s): 1.3%us, 0.3%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
1.3%us:用戶空間占用CPU的百分比1.3%
0.3%sy:內核空間占用CPU的百分比0.3%
0.0%ni:改變過優先級的進程占用CPU的百分比0.0%
98.3%id:空閑CPU百分比98.3%
0.0%wa:IO等待占用CPU的百分比0.0%
0.0%hi:硬中斷(Hardware IRQ)
0.0%si:軟中斷(Software Interrupts)占用CPU的百分比 0.0%
0.0%st:虛擬機占用百分比
第七行以下:各進程(任務)的狀態監控
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
PID:進程id
USER:進程所有者
PR:進程優先級
NI:nice值。負值表示高優先級,正值表示低優先級
VIRT:進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES:進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR:共享內存大小,單位kb
S:進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵屍進程
%CPU:上次更新到現在的CPU時間占用百分比
%MEM:進程使用的物理內存百分比
TIME+:進程使用的CPU時間總計,單位1/100秒
COMMAND:進程名稱(命令名/命令行)
-----------------------------------------
在top視圖界面:
1> 在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況;
2> 進入top時,各進程默認是按照CPU的占用量來排序的;
3> b:打開/關閉加亮效果;
x:打開/關閉排序列的加亮效果;
shift + >”或”shift + <”可以向右或左改變排序列;
f:top進入另一個視圖,在這里可以編排基本視圖中的顯示字段;有”*”表示可顯示,沒有”*”表示不顯示;若要顯示,按對應的字母;
4> M:根據駐留內存大小進行排序;
P:根據CPU使用百分比大小進行排序;
k:終止一個進程。系統將提示用戶輸入需要終止的進程PID,以及需要發送給該進程什么樣的信號;
r:重新安排一個進程的優先級別。系統提示用戶輸入需要改變的進程PID以及需要設置的進程優先級值;
s:改變兩次刷新之間的延遲時間;
t:切換顯示進程和CPU狀態信息;
W:將當前設置寫入~/.toprc文件中;
-----------------------------------------
top [options]
-d:指定每兩次屏幕信息刷新之間的時間間隔;
-p:通過指定監控進程ID來僅僅監控某個進程的狀態;
-u:指定特定用戶的進程;
top -b -n 1 ----可看到所有的進程狀態(-n 1:顯示一次)
#########################################################################
#
ps命令
選項:
a:顯示現行終端機下的所有進程,包括其他用戶的進程;
u:顯示進程擁有者、狀態、資源占用等的詳細信息(注意有“-”和無“-”的區別);
x:顯示沒有控制終端的進程。通常與 a 這個參數一起使用,可列出較完整信息;
-e:顯示所有進程;
-f:完整輸出顯示進程之間的父子關系;
-l:較長、較詳細的將該 PID 的的信息列出;
-o:自定義顯示的字段;
注:ps -aux 不同於 ps aux
-----------------------------------------
# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:29 ? 00:00:00 /sbin/init
root 13 2 0 08:29 ? 00:00:00 [sync_supers]
PPID:父進程PID
--------------------------------------------------------------------------------------
# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 19356 968 ? Ss 08:29 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S 08:29 0:00 [kthreadd]
說明:
USER: 運行進程的用戶
PID: 進程ID
%CPU: CPU占用率
%MEM: 內存占用率
VSZ: 占用虛擬內存
RSS: 占用實際內存 駐留內存
TTY: 進程運行的終端
STAT: 進程狀態 man ps (/STATE)
R 運行
S 可中斷睡眠 Sleep
D 不可中斷睡眠
T 停止的進程
Z 僵屍進程
X 死掉的進程
Ss s進程的領導者,父進程
S< <優先級較高的進程
SN N優先級較低的進程
R+ +表示是前台的進程組
Sl 以線程的方式運行
START: 進程的啟動時間
TIME: 進程占用CPU的總時間
COMMAND: 進程文件,進程名
------------------------------------------------------
查看當前系統進程的uid,pid,stat,pri, 以uid號排序:
ps -eopid,stat,pri,uid --sort uid
ps axo user,pid,rss,cmd | head ----自定義顯示的字段:user,pid,rss,cmd
pidof (httpd)進程名:查看指定進程(httpd)的PID
通過cpu/mem的使用來過濾排序:
ps aux --sort -%cpu | more ----more:分頁顯示,按cpu使用排序
ps aux --sort -pcpu | more ----按cpu使用排序
ps aux --sort -pmem | more ----按mem使用排序
ps -aux | sort -k4nr | head -10
root 1244 0.0 3.1 286056 15460 ? Ssl 20:17 0:02 /usr/bin/kube-proxy --logtostderr=true --v=0 --master=http://192.168.1.50:8080
root 1233 0.0 2.5 553052 12564 ? Ssl 20:17 0:01 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 3715 0.0 2.5 457180 12192 ? Ss 20:46 0:00 /usr/sbin/httpd -DFOREGROUND
root 4987 0.2 2.5 219116 12300 ? Ssl 21:46 0:00 /usr/bin/flanneld -etcd-endpoints=http://192.168.1.50:2379 -etcd-prefix=/atomic.io/network
root 929 0.0 1.9 285296 9384 ? Ssl 20:16 0:00 /usr/sbin/rsyslogd -n
root 1248 0.0 1.7 558076 8276 ? Ssl 20:17 0:00 /usr/sbin/libvirtd
apache 4628 0.0 1.6 459264 7780 ? S 21:26 0:00 /usr/sbin/httpd -DFOREGROUND
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
sort -k4nr中(k代表從根據哪一個關鍵詞排序,后面的數字4表示按照第四列排序;n指代numberic sort,根據其數值排序;r指代reverse,這里是指反向比較結果,輸出時默認從小到大,反向后從大到小。)。本例中,可以看到%MEM在第4個位置,根據%MEM的數值進行由大到小的排序。-k3表示按照cpu占用率排序。
通過進程名和PID:
ps -C java
---> PID TTY TIME CMD
ps -f -C java
---> UID PID PPID C STIME TTY TIME CMD
根據線程來過濾進程:想知道特定進程的線程:
ps -L pid
ps -p 3785 -L
ps -eLf ---查看線程
顯示安全信息,如果想要查看現在有誰登入了你的服務器:
ps -eo user,pid,args
格式化輸出某用戶(真實的或有效的UID)創建的進程: 系統管理員想要查看由pag用戶運行的進程和這個進程的其他相關信息時: ps -U root -u pag u -U:參數按真實用戶ID(RUID)篩選進程,它會從用戶列表中選擇真實用戶名或ID。真實用戶即實際創建該進程的用戶; -u:參數用來篩選有效用戶ID(EUID) 最后的u參數用來決定以針對用戶的格式輸出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND這幾 列組成。
ps實時監控進程狀態:與watch命令結合:
watch -n 1 ‘ps -aux --sort -pmem’
watch命令:
watch [options] COMMAND
-n:周期
-d:高亮顯示
-t:關閉watch命令在頂部的時間間隔
---------------------------------
pstree:查看進程樹
監控線程數:ps -ef | grep java | wc -l
監控網絡客戶連接數:netstat -n | grep tcp | grep 偵聽端口 | wc -l
#########################################################################
# vmstat
vmstat 2 3
每2s采集一次數據,共采集3次(單位為kb)
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 142044 79772 8560 42540 1 6 22 9 106 193 1 1 98 1 0
說明:
r:可運行隊列。單核cpu,不應該超過3(經驗得到的數據,只是表明大於這個值表明運行隊列有點長)
b:當前被阻塞的進程,一般這些進程都是在等待某些外部資源而被阻塞。>3需要注意,而且一直出現或者經常出現,就更值得注意
swpd:虛擬內存已使用的大小,如果大於0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那么你該升級內存了或者把耗內存的任務遷移到其他機器。
free:空閑的物理內存的大小
buff:緩存
cache:cache直接用來記憶打開的文件,給文件做緩沖,當程序使用內存時,buffer/cached會很快地被使用。)
si:有多少數據從swap到物理內存;
so:有多少數據從物理內存到swap;
bi:有多少數據從塊設備讀取到內存中(讀磁盤);
bo:有多少數據從內存中寫到塊設備中(寫磁盤);
in:中斷數。一般代表大量設備操作成功通知內核。
cs:上下文切換。一般代表任務需要緊急被cpu處理。數字高,只能說明內核在充分發揮它的任務調度作用。不能簡單通過該數字判斷cpu就出現瓶頸。
us:用戶進程所占用的cpu時間的百分比
sy:內核在進行任務調度所占用的cpu時間的百分比
id:cpu空閑所占用的時間百分比.僅僅0不能簡單判斷cpu出現瓶頸,只能說它被充分被留用。
wa:等待IO所消耗時間百分比
st:被硬件虛擬化的虛擬機所消耗掉的時間百分比
-----------------------------------------------------------------
vmstst [選項] [參數]
選項:
-a:顯示活動內頁;
-f:顯示啟動后創建的進程總數;
-m:顯示slab信息;
-n:頭信息僅顯示一次;
-s:以表格方式顯示事件計數器和內存狀態;
-d:報告磁盤狀態;
-p:顯示指定的硬盤分區狀態;
-S:指定輸出信息的單位,如:M,K(默認為K/1024bytes);
參數:
時間間隔:狀態信息刷新的時間間隔;
次數:顯示報告的次數;
#################################################################################
# mpstat
可以查看多核心cpu中每個計算核心的統計數據;而vmstat只能查看系統整體cpu情況。
# mpstat
Linux 2.6.32-431.el6.x86_64 (vm4.cluster.com) 09/17/2017 _x86_64_ (1 CPU)
04:06:12 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
04:06:12 PM all 0.71 0.00 0.69 0.68 0.00 0.08 0.00 0.00 97.84
說明:
%user:表示處理用戶進程所使用CPU的百分比。用戶進程是用於應用程序(如Oracle數據庫)的非內核進程;
%nice:表示使用nice命令對進程進行降級時CPU的百分比;
%system:表示內核進程使用的CPU百分比;
%iowait:表示等待進行I/O所使用的CPU時間百分比;
%irq:表示用於處理系統中斷的CPU百分比;
%soft:表示用於軟件中斷的CPU百分比;
%idle:顯示CPU的空閑時間;
%intr/s:顯示每秒CPU接收的中斷總數;
計算公式:
total_current=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
---------------------------------
mpstat -P CPU 時間間隔 采集次數
mpstat -P ALL 1 5 ----所有的cpu
mpstat -P 0 1 5 ----第一顆cpu
##########################################################################
# sar
##########################################################################
# iostat
iostat用於輸出CPU和磁盤I/O相關的統計信息.
# iostat
Linux 2.6.32-431.el6.x86_64 (vm4.cluster.com) 09/17/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.59 0.00 0.67 0.89 0.00 97.84
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 1.94 57.33 22.14 1714948 662300
scd0 0.00 0.09 0.00 2560 0
說明:
avg-cpu段:
%user: 在用戶級別運行所使用的CPU的百分比;
%nice: nice操作所使用的CPU的百分比;
%sys: 在系統級別(kernel)運行所使用CPU的百分比;
%iowait: CPU等待硬件I/O時,所占用CPU百分比;
%idle: CPU空閑時間的百分比;
Device段:
tps:每秒鍾發送到的I/O請求數;
Blk_read /s:每秒讀取的block數;
Blk_wrtn/s:每秒寫入的block數;
Blk_read:讀入的block總數;
Blk_wrtn:寫入的block總數;
----------------------------------------------
iostat命令的參數說明
-c:僅顯示 CPU 統計信息。與 -d 選項互斥。
-d:僅顯示磁盤統計信息。與 -c 選項互斥。
-k:以 KB為單位顯示每秒的磁盤請求數,默認單位塊。
-m:以MB為單位顯示每秒的磁盤請求數。
-N:顯示磁盤陣列信息
-n:顯示網絡文件系統NFS報告。此選項僅適用於Linux內核2.6.17以上版本。
-p device | ALL
與 -x 選項互斥,用於顯示塊設備及系統分區的統計信息,也可以在 -p 后指定一個設備名,如:
# iostat -p hda
或顯示所有設備:
# iostat -p ALL
-t 在輸出數據時,打印收集數據的時間。
-V 打印版本號和幫助信息。
-x 輸出擴展信息。
iostat 2 ----每兩秒顯示所有的分區IO狀態
# iostat /dev/sda* 2 ----每兩秒顯示所有分區的io狀態
# iostat -kx -d sda 2 3
----查看sda的IO狀態報告,每兩秒打印一次,總共三次 ; -k是表示把默認以每秒多少塊顯示成每次多少KB;-x打印了一些擴展選項
說明:
rrqm/s:每秒的讀請求數
wrqm/s:每秒的寫請求數
r/s:每秒完成多少個讀IO
w/s:每秒完成多少個寫IO <-- IOPS=(r/s+w/s)
rsec/s:每秒讀取了多少扇區的數據。 一個扇區=512字節數據
wsec/s:每秒寫了多少扇區的數據。
rkB/s:每秒讀了多少kb數據
wkB/s:每秒寫了多少kb數據
avgrq-sz:平均請求數據的大小
avgqu-sz:是平均請求隊列的長度。毫無疑問,隊列長度越短越好。
await:平均完成IO需要等待多少時間, 包含服務時間,還有在隊列中等待的時間。
svctm:服務時間,從IO請求產生到,完成IO的時間。從源代碼里可以看出:
(r/s+w/s)*(svctm/1000)=util。
舉例子:如果util達到100%,那么此時svctm=1000/(r/s+w/s),
假設IOPS是1000,那么svctm大概在1毫秒左右,如果長時間大於這個數值,
說明系統出了問題。
不過前面已經說過在磁盤陣列等多盤系統中util可能出現偏大的情況,所以svctm相應的也可
能偏大。
%util:磁盤帶寬使用百分比。如果一直都是100%,說明磁盤很忙。
################################################
kill
ps -ef|grep 進程 ---獲取到pid
kill -9 pid
# kill -TERM PPID ---給父進程發送一個TERM信號,試圖殺死它和它的子進程。
# killall httpd ---命令殺死同一進程組內的所有進程。其允許指定要終止的進程的名稱,而非PID。
# kill -HUP PID ---該命令讓Linux和緩的執行進程關閉,然后立即重啟。在配置應用程序的時候,這個命令很方便,在對配置文件修改后需要重啟進程時就可以執行此命令。
pkill命令:
可以按照進程名殺死進程
pkill(選項)(參數)
-o:僅向找到的最小(起始)進程號發送信號; -n:僅向找到的最大(結束)進程號發送信號; -P:指定父進程號發送信號; -g:指定進程組; -t:指定開啟進程的終端。
僵屍進程:
# ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
-A 參數列出所有進程
檢查當前僵屍進程信息:
# ps -ef|grep defunct
殺掉僵屍進程的語句:
# ps -ef|grep defunct |grep -v grep |awk '{print "kill -9" $2,$3}'
再次殺掉其父進程:
# ps -ef|grep defunct |grep -v grep |awk '{print "kill -18" $3}'
