ps、top、htop、dstat命令详解
在讲命令之前先简要讲解一下进程的概念性问题。
进程的创建:
除了init外,每个进程都是由父进程创建,init是女娲创建
父进程可以通过fork()请求创建子进程,子进程需要读取的数据可以与父进程共用
如果子进程要写入自己的数据,父进程就把数据复制给子进程一份,这样子进程就有了自己的数据。
子进程任务完成后就被毁尸灭迹了,就像从没存在过一样
进程的切换:
在一个进程运行一段时间后,由于cpu需要运行其他进程,这个进程就必须把位置腾出来让给其他进程。这个进程运行的当前状态,会被放在寄存器中,下次轮到这个进程运行时就从寄存器中读取这个状态,然后从这个状态继续运行。就这样叫做保存现场。但如果在现场来回切换,就会浪费CPU时间降低系统性能。进程的相关信息存储在进程结构体:task struct,多个任务的task struct组件的链表为tasklist。
进程优先级
0-139:实时优先级,优先级与静态相反
100-139:静态优先级,数字越小,优先级越高,必要时可让出优先级
nice值:-20到19,分别对应100-139可改变优先级
进程内存:
把内存分隔成许多个小片段叫做page,每个进程按进程大小分一些page。内核把这些片段page伪装成一个完整内存,所以进程不知道还有其他进程存在,以为自己占据了所有内存。
进程的查看:
内核通过一个接口/proc,查看内核中的状态信息,即内核参数,这是一个伪文件系统。每个进程在/proc目录下都一个以进程号命令的目录。每个目录下都记录着该进程的详细信息。
内核参数有两类:
可设置其值从而调整内核运行特性的参数;可设置的都在/proc/sys/
状态变量:其用于输出内核中统计信息或状态信息,仅用于查看;
进程按启动方式分类:
系统启动过程中自动启动:与终端无关的进程;
用户通过终端启动:与终端相关的进程;如果中断关掉,这些进程也会结束。
ps命令:- report a snapshot of the current processes.
ps可以查看所有进程的状态,但只是查看那一刻的状态,不能够刷新。
ps命令的选项有三种风格:
1 UNIX options, which may be grouped and mustbe preceded by a dash.必须带一个“-”
2 BSD options, which may be grouped and mustnot be used with a dash.坚决不能带“-”
3 GNU long options, which are preceded by two dashes.要带“--”
options选项:
a:查看所有与终端相关的进程;
[root@yph7proc]# ps a PID TTY STAT TIME COMMAND 1116 tty1 Ss+ 0:00 /sbin/agetty --nocleartty1 2419 pts/0 Ss+ 0:02 -bash 2908 pts/1 Ss 0:01 -bash 4486 pts/1 R+ 0:00 ps a
PID:进程号
TTY:登陆的终端类型
STAT:进程状态
TIME:累计占用cpu的时间
COMMAND:由那个命令启动的此进程,带中括号的是内核线程
x:查看所有与终端无关的进程;
[root@yph7 proc]#ps x PID TTY STAT TIME COMMAND 2 ? S 0:00 [kthreadd] 3 ? S 0:09 [ksoftirqd/0] 5 ? S< 0:00 [kworker/0:0H]
u:查看以用户为中心查看进程状态信息显示;pid号进行排序
[root@yph7proc]# ps u
常用组合之一:ps aux
[root@yph7 proc]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.0 0.0 0 0 ? S 12月25 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 12月25 0:09 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 12月25 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 12月25 0:02 [migration/0]
USER:进程的属主
PID:进程的id号
%CPU:累计对cpu的占用百分比
%MEM:占用整个内存空间的比率
VSZ:虚拟内存集,占用虚拟内存的大小。虚拟内存是内核把进程实际占用的内存page伪装成的一个完整内存,把这个虚拟完整内存提供给进程的,让进程自以为自己霸占了整个内存。进程占用的虚拟内存可能包括一些公共内存page,但进程并不知道是公共的。这些公共内存page不算进程占用的实际内存。
RSS: ResidentSize,常驻内存集。一定不能放到交换内存swap中去的进程。
TTY:进程属主登陆的终端类型
STAT: 进程处于的状态
R:running,正常运行的状态
S:interruptable sleeping,可中断的睡眠状态
D:uninterruptable sleeping不可中断的运行状态
T:Stopped,停止运行的状态
Z:zombie,已经僵死的状态,等待被清除
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader,会话领导者。比如shell下运行好多进程,这个shell就是领导者,若这个shell被关闭,其下的所有进程全部会关闭。
START:进程启动的时间
TIME:进程累计占用cpu的时间
COMMAND:由那个命令启动的此进程,带中括号的是内核线程
-e:显示所有进程
-f:显示完整格式的进程信息
常用组合之二:ps -ef
[root@yph7 proc]#ps -ef UID PID PPID C STIME TTY TIME CMD root 2 0 0 12月25 ? 00:00:00 [kthreadd] root 3 2 0 12月25 ? 00:00:09 [ksoftirqd/0] root 5 2 0 12月25 ? 00:00:00 [kworker/0:0H]
PPID:指父进程的进程号
C:进程占用cpu百分比,0表示太小,近似为0
STIME:启动进程的时间
-F:显示更完整格式的进程信息;与“-f”相似
-H:以层级结构显示进程的相关信息;
常用组合之三:-eFH
[root@yph7 proc]#ps -eFH UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 2 0 0 0 0 1 12月25 ? 00:00:00 [kthreadd] root 3 2 0 0 0 0 12月25 ? 00:00:09 [ksoftirqd/0] root 5 2 0 0 0 0 12月25 ? 00:00:00 [kworker/0:0H]
C:进程占用cpu百分比,0表示太小,近似为0
PSR:进程运行在哪个cpu上
常用组合之四:-eo和 axo
o field1, field2,...:自定义要显示的字段列表,以逗号分隔;
常用的field:pid, ni, priority, psr, pcpu, stat, comm, tty, ppid, rtprio
pcpu:cpu的利用率
ni:nice值;
priority:, 优先级;
rtprio:real time priority,实时优先级;
[root@yph7 proc]#ps -eo pid,ni,priority PID NI PRI --------------查看进所有程id,nice值和优先级。 1 0 20 2 0 20 3 0 20 [root@yph7 proc]#ps axo psr,pcpu,stat PSR %CPU STAT-------查看所有进程进程运行在哪个cpu,占cpu百分比,运行状态 0 0.0 Ss 1 0.0 S 0 0.0 S
[root@yph7 proc]#ps ao comm,tty,ppid,rtprio COMMAND TT PPID RTPRIO bash pts/0 2415 - bash pts/1 2904 - ps pts/1 2908 - 查看所有与终端相关的进程,以及这些进程的由哪些进程发起,关联的终端类型,进程的父进程号,以及实时优先级。
top命令:- display Linux processes
top命令时显示进程信息的非常重要的工具
下面详细解释top命令显示出的信息代表的意思
[root@yph7 ~]#top top- 18:41:19up 28 min, 2 user, load average: 0.00,0.04, 0.07
18:41:19:指当前系统的时间;
up28min:系统已经启动了28分钟;
2 user:当前系统有两个用户登录
load average:0.00, 0.04, 0.07:分别在过去1分钟,5分钟,15分钟的在cpu上等待运行的进程的平均队列长度,长度越长,说明cpu的压力越大,cpu太慢,应付不了当前业务需求.队列长度一般不能大于cpu的数量.
uptime命令:也能显示上述信息.
Tasks: 370total, 1 running, 369 sleeping, 0 stopped, 0 zombie
当前系统上任务总数,即一共运行370个进程; 1个进程正在运行,369个处于睡眠状态;0个进程处于停止(stop)状态, 0个进程处于僵死(zombie)状态.
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
进程占用百分比
us:user space,用户空间.用户空间里的所有进程占用cpu百分比
sy:system,系统空间,内核占用cpu百分比
ni:nice值,nice值调整后给nice值调整占用的cpu的比率
id:cpu空闲百分比
wa:wait,cpu等待IO设备的时间.如果这个时间很长说明IO设备会成为系统性能的瓶颈
hi:hardwareinterrupt处理硬件终端所消耗的cpu的百分比
si:softwareinterrupt,处理软中断所消耗的cpu百分比
st:被虚拟化程序偷走的cpu时间的百分比
KiBMem: 1003184 total, 761088 free, 99096 used, 143000 buff/cache
以KB为单位显示物理内存的使用情况。
total:总内存大小; free:空闲、可用内存大小; used:已用内存大小; buff/cache:用于缓冲和缓存的内存空间大小,这段可以回收的,不算真正被占用
KiBSwap: 2097148 total, 2097148 free, 0 used. 753948 avail Mem
avail Mem:可用空间。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2242 root 20 0 130156 2028 1268 R 0.7 0.2 0:00.84 top 137 root 20 0 0 0 0 S 0.3 0.0 0:01.69 rcu_sched 1 root 20 0 59632 7672 2632 S 0.0 0.8 0:03.13 systemd
PR:优先级
NI:nice值
VIRT:虚拟内存集
RES:常驻内存集
SHR:共享内存空间
S:当前状态
排序:默认以占用cpu百分比由大到小排序
敲下列大写字母键,分别以对应的方式排序
P:以占据CPU百分比排序;
M:以占据内存百分比排序;
T:以累积占用CPU时间排序;
首部信息查看:
l:第一行属于uptime信息:敲l键可以显示和隐藏此信息。也可在命令行直接输入uptime命令查看。
t:第二行和第三行的tasks及cpu信息:可以敲t键查看和隐藏
1:按下数字1键可以查看和隐藏每个cpu的使用情况
m:第四行和第五行的内存信息:敲m键查看和隐藏
其它命令:
q:退出命令:按q键退出top查看页面
s:修改刷新时间间隔。按下s键,然后按下数字,即可修改刷新时间间隔为你输入的数字,单位为秒。例如:按下s键,在按数字1键,即可实现每秒刷新一次
k:终止指定的进程。按下k键---à再输入要杀死的进程的pid--à按enter键--à(选择信号类型,以数字标示,默认15为杀死)本步可省略à按enter键
top的选项:
-d #:指定刷新时间间隔,默认为3秒;
[root@yph7~]# top -d 2 ------打开后就是2秒钟刷新一次的
-b:以批次方式显示;按一屏一屏的刷新显示,可以Ctrl+c退出
[root@yph7~]# top �Cb
-n #:显示多少批次;
[root@yph7~]# top -n 4 --------------刷新4次就自动退出了
[root@yph7~]# top -b -n 3 ----------按批次刷新3次就自动退出
htop命令:比top更强大、更漂亮的工具,在xshell中支持鼠标点击操作。安装时要用epel源
[root@yph7 ~]#htop
左上方的1,2,3,4分别代表的是哪一颗cpu的使用情况。Mem,Swp分别是物理内存和交换内存的使用情况。
右上方Tasks表示用户空间进程有35个。thr指线程数量13个。有一个正在运行的进程。
uptime:指系统已经启动了多久
查看帮助:用鼠标点击左下角”help“或按F1键,可以查看帮助。如下图
Memorybar一行中,绿色的”used“表明绿色的进度条表示是已用内存。蓝色的”buffer“表明蓝色的进度条是缓冲部分。橙色的”cache“表明橙色进度条代表缓存部分。
CPU一行中,low-priority指低优先级占用时间;normal正常; kernel内核占用的时间;virtual虚拟化占用的cpu时间
Status一行中,R,运行状态;S,睡眠状态;T,停止状态;Z,僵死状态;D,不可中断睡眠状态。
u,表示按用户查看进程。敲一下u键,在屏幕左侧,可以用上下箭头移动光标实现用户的选择,按enter确定。
H:隐藏或显示右上角thr线程数量。通过敲”H“键实现
K:在右上角显示或隐藏内核线程。通过敲K键实现。默认为隐藏
P,M,T:敲大写的P,M,T分别以cpu占用比率,物理内存占用,累计占用cpu时间进行排序。
F6:敲F6键可以选择按自己需要的字段colume进行排序。用上下箭头进行选择
a:把一个进程限定在某个或某几个cpu上运行,不允许其在其他cpu上运行。上下箭头移动光标,空格键进行选择,enter键确定。
l:查看指定进程所打开的所有文件。使用上下箭头选择进程,然后敲l键进行查看。敲ESC退出
s:跟踪一个检查发起的系统调用。选中进程后敲s键。ESC退出。
t,F5:以树状图的形式显示各进程的状态
F2:设置一些显示属性。按”F2“键,在”setup“列选择Meters,在”left colume“列选择cpu,按enter可进行cpu显示的界面切换,可以切换才LED形式或者百分比形式。选择”right colume“列的Tasks counter,按enter可对右上角的显示界面进行切换,同样也有LED形式和其他形式。选中“Availablemeters“列的一些选项,然后按F5,把这项添加的左上角列表显示,按F6可添加到右上角列表中进行显示。还有其他的选项,可以自行摸索。
选项:
-d #:指定延迟时间间隔;不过指定的是#/10 秒,即0.#秒。看下面例子
[root@yph7 ~]#htop -d 2
[root@yph7 ~]#htop -d 5 ----------0.5秒刷新一次 [root@yph7 ~]#htop -d 20 -------2秒刷新一次 [root@yph7 ~]#htop -d 30 ----------3秒刷新一次
-u UserName:仅显示指定用户的进程;
[root@yph7~]# htop -u flimmer
-s COLUME:以指定字段进行排序;
[root@yph7~]# htop -s PID
dstat命令:- versatile tool for generating system resource statistics系统资源使用统计的工具
dstat [-afv][options..] [delay [count]]
常用选项:dstat 2 5 每两秒刷新一次,5次后退出
-c, --cpu:显示cpu使用情况;
[root@yph7 ~]# dstat -c ----total-cpu-usage---- usr sys idl wai hiq siq 0 0 99 0 0 0 0 0 99 0 0 0
-C #,#,...,total:显示第几号cpu的信息,可以指定多个,用逗号隔开。total表示全部cpu。
-d, --disk:显示磁盘的相关信息
-D sda,sdb,...,或者total,显示指定磁盘设备,多个以逗号隔开
-g:显示page相关的速率数据;
[root@yph7 ~]#dstat -g ---paging-- in out 0 0 0 0
-m:Memory的相关统计数据
[root@yph7 ~]#dstat -m ------memory-usage----- used buff cach free 165M 1084k 89.0M 724M 165M 1084k 89.0M 724M
-n:Interface的相关统计数据;
[root@yph7 ~]#dstat -n -net/total- recv send 0 0 7892B 202B 2160B 154B
-p:显示process的相关统计数据;
[root@yph7 ~]#dstat -p ---procs--- run blk new 0 0 0.2 0 0 0
-r:显示io请求的相关的统计数据;
[root@yph7 ~]#dstat -r --io/total- read writ 0.55 0.19 0 0 0 0
-s:显示swapped的相关统计数据;
[root@yph7 ~]#dstat -s ----swap--- used free 0 2048M 0 2048M
--tcp显示tcp各链接状态的数量
[root@yph7 ~]#dstat --tcp ----tcp-sockets---- lis act syn timclo 4 2 0 0 0 4 2 0 0 0
--udp 显示udp状态的信息
[root@yph7 ~]#dstat --udp --udp-- lis act 5 0 5 0
--raw裸套接字相关信息
[root@yph7 ~]#dstat --raw raw raw 0 0
--socket:显示socket状态的信息
[root@yph7 ~]#dstat --socket ------sockets------ tot tcp udp raw frg 448 4 3 0 0 448 4 3 0 0
--ipc显示各进程间通信的相关数据
[root@yph7 ~]#dstat --ipc --sysv-ipc- msg sem shm 0 0 0 0 0 0
--top-cpu:显示最占用CPU的进程;
[root@yph7 ~]#dstat --top-cpu -most-expensive- cpu process rcu_sched 0.1 xz 25 xz 25
--top-io:最占用io的进程;
[root@yph7 ~]#dstat --top-io ----most-expensive---- i/o process bash 27k 1710B sshd: root@ 146B 196B sshd: root@ 78B 168B
--top-mem:查看最占用内存的进程;
[root@yph7 ~]#dstat --top-mem --most-expensive- memory process polkitd 10.0M polkitd 10.0M polkitd 10.0M
--top-latency:查看延迟最大的进程;
[root@yph6 ~]# dstat --top-latency --highest-total-- latency process kblockd/0 201 events/0 42 vmmemctl 95 events/0 82