1、进程简介
linux上进程有5种状态
- 运行(正在运行或在运行队列中等待)
- 中断(休眠中,受阻,在等待某个条件的形成或接收到信号)
- 不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生)
- 僵死(进程已终止,但进程描述符存在,知道父进程调用wait4()系统调用后释放)
- 停止(进程收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号后停止运行运行)
ps工具标识进程的5种状态码:
- D 不可中断 uninterruptible sleep (usually IO)
- R 运行 runnable (on run queue)
- S 中断 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (”zombie”) process
平时在查看linus进程状态是,查看最多的三个状态是R、S、D
S 即 sleep进程,休眠进程。其又分为两种:
-
Interruptible Sleep
(可中断睡眠,在ps命令中显示“S”)。处在这种睡眠状态的进程是可以通过给它发送signal来唤醒的,比如发HUP信号给nginx的master进程可以让nginx重新加载配置文件而不需要重新启动nginx进程; -
Uninterruptible Sleep
(不可中断睡眠,在ps命令中显示“D”)。处在这种状态的进程不接受外来的任何signal,这也是为什么之前我无法用kill杀掉这些处于D状态的进程,无论是“kill”, “kill -9”还是“kill -15”,因为它们压根儿就不受这些信号的支配。
D 即上面提到的Uninterruptible Sleep ,如果从广义上来分,D状态算是一种特殊的S状态进程。进程为什么会被置于D状态呢?
D状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,那么就很会不幸地被ps看到了,同时也就意味着很有可能有IO出了问题,可能是外设本身出了故障,也可能是比如NFS挂载的远程文件系统已经不可访问了。
正是因为得不到IO的响应,进程才进入了uninterruptible sleep状态,所以要想使进程从uninterruptible sleep状态恢复,就得使进程等待的IO恢复,比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的,那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个Linux系统(D进程并不能通过kill 和kill -9 杀掉) 。
2、ps命令
2.1 简介
ps命令是linux最常用的进程查看命令,它会列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,可以使用top命令。
2.2 命令参数
-
a
显示所有进程 -
-a
显示同一终端下的所有程序 -
-A
显示所有进程 -
c
显示进程的真实名称 -
-N
反向选择 -
-e
等于“-A” -
e
显示环境变量 -
f
显示程序间的关系 -
-H
显示树状结构 -
r
显示当前终端的进程 -
T
显示当前终端的所有程序 -
u
指定用户的所有进程 -
-au
显示较详细的资讯 -
-aux
显示所有包含其他使用者的行程,显示内存信息 -
-C
<命令> 列出指定命令的状况 -
–lines
<行数> 每页显示的行数 -
–width
<字符数> 每页显示的字符数 -
–help
显示帮助信息 -
–version
显示版本显示
常用的命令参数有“-ef ”、“-u” "aux",再接和grep使用
2.3 输出列的含义
-
F
代表这个程序的旗标 (flag), 4 代表使用者为 super user -
S
代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍 -
UID
程序被该 UID 所拥有 -
PID
进程的ID -
PPID
则是其上级父程序的ID -
%CPU
:该 process 使用掉的 CPU 资源百分比 -
%MEM
:该 process 所占用的物理内存百分比 -
VSZ
:该 process 使用掉的虚拟内存量 (Kbytes) -
SZ
使用掉的内存大小 -
RSS
:该 process 占用的固定的内存量 (Kbytes) -
PRI
这个是 Priority (优先执行序) 的缩写,详细后面介绍 -
ADDR
这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 “-“ -
WCHAN
目前这个程序是否正在运作当中,若为 - 表示正在运作 -
TTY
登入者的终端机位置 -
TIME
使用掉的 CPU 时间。 -
CMD
所下达的指令为何
3、jps命令
3.1 简介
jps命令是linux下java进程查看命令,jps仅查看当前用户的java进程,而不是当前进程中的所有进程。
3.2 原理
java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata_{userName}/),有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。
3.3 命令参数
-
-q
仅输出VM标识符,不包括class name,jar name,arguments in main method -
-m
输出main method的参数 -
-l
输出完全的包名,应用主类名,jar的完全路径名 -
-v
输出jvm参数 -
-V
输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 -
-Joption
传递参数到vm,例如:-J-Xms48m
4、top命令
4.1 简介
top命令是Linux下最常用的性能分析工具,能够 实时 显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top命令有两种模式,一种是常见的交互式(实时)方式,另一种是批处理模式,用于观看历史记录(调试专用)。
4.2 命令参数:
-
-b
批处理 -
-c
显示完整的命令 -
-I
忽略失效过程 -
-s
保密模式 -
-S
累积模式 -
-d
设置更新时间,默认是每3s刷新一次系统性能情况 -
-i
<时间> 设置间隔时间 -
-u
<用户名> 指定用户名 -
-p
<进程号> 指定进程 -
-n
<次数> 循环显示的次数
4.3 批处理模式
批处理模式是指批处理,这意味着自动处理,无需人工干预。 批处理与交互相对。
在批处理模式下,top产生的输出对于收集到日志文件或解析更为明智(尽管top甚至在批处理模式下也不能很好地生成可解析的输出)。 输出行数没有限制,输出中不包含任何格式化的转义序列。
在交互模式下,top产生用于人类观看的输出。 特别是,它只显示一个屏幕数据。 输出包含一些用于格式化的转义序列。 Top即使将其输出重定向到文件,也以交互模式运行; 只有-b选项的存在才有意义。
top-批处理模式在-SHELL下通过选项b来控制。
eg:常用的命令:top -b -n 5 > top.txt
4.4 交互模式
在交互模式下,只显示一个屏幕的数据,是一个实时数据。显示的信息如:4.4.1 统计信息区
统计信息区:
前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,同 uptime 命令的执行结果,具体参数说明情况如下:
14:06:23 — 当前系统时间
up 70 days, 16:44 — 系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!)
2 users — 当前有2个用户登录系统
load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行,Tasks — 任务(进程),具体信息说明如下:
系统现在共有206个进程,其中处于运行中的有1个,205个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
第三行,cpu状态信息,具体属性说明如下:
5.9%us — 用户空间占用CPU的百分比。
3.4% sy — 内核空间占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
90.4% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
0.2% si — 软中断(Software Interrupts)占用CPU的百分比
备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统用户空间和内核空间的相关知识!
第四行,内存状态,具体信息如下:
32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)
18537836k free — 空闲内存总量(18GB)
169884k buffers — 缓存的内存量 (169M)
第五行,swap交换分区信息,具体信息说明如下:
32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB)
备注:
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
4.4.2 状态监控区
项目列信息说明如下:
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
— 进程名称(命令名/命令行)
4.5 使用技巧
1. 多U多核CPU监控
在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况:
2. 高亮显示显示当前进程
敲击键盘“b”(打开/关闭加亮效果),top的视图变化如下:
我们发现进程id为2570的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果。
3.进程字段排序
默认进入top时,各进程是按照CPU的占用量来排序的,在下图中进程ID为28894的java进程排在第一(cpu占用142%),进程ID为574的java进程排在第二(cpu占用16%)。
可以看到,top默认的排序列是“%CPU”。
4. 通过”shift + >”或”shift + <”可以向右或左改变排序列
下图是按一次”shift + >”的效果图,视图现在已经按照%MEM来排序。