进程
进程状态
进程状态的分类:
- 运行态
running
- 就绪态
ready
- 睡眠态的可中断态
interruptable
- 睡眠态的不可中断态
uninterruptable
- 停止态
stopped
- 僵死态
zombie
僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态的子进程
处理僵尸进程的方法
## 准备工作
bash
# 查看子进程
echo $BASHPID
27116
# 查看父进程
echo $PPID
26805
# 或者可以通过pstree命令查看bash中父子进程的关系
pstree -p|grep bash
|-sshd(3572)---sshd(25663)---sshd(25667)---bash(25668)---su(26803)---bash(26805)---bash(27116)-+-grep(28074)
# 查看当前父子进程的状态:父子进程都是睡眠态中的可中断
ps aux|grep bash
root 26805 0.0 0.0 116992 3764 pts/0 S 10:07 0:00 -bash
root 27116 0.0 0.0 117032 3776 pts/0 S 10:07 0:00 bash
## 设置僵尸态
# 将父进程26805设置为停止态
kill -19 26805
# 杀死子进程27116,使其进入僵尸态
kill -9 27116
# 查看父子进程状态:父进程为停止态,而子进程为僵尸态
ps aux|grep bash
root 26805 0.0 0.0 116992 3764 pts/0 T 10:07 0:00 -bash
root 27116 0.0 0.0 0 0 pts/0 Z 10:07 0:00 [bash] <defunct>
## 清除僵尸态的进程的方法
## 恢复父进程
kill -18 26805
## 杀死父进程
kill -9 26805
# 查看父子进程状态:
# 如果是恢复父进程的话,只能看见父进程的存在,子进程已经没有
# 如果是杀死父进程的话,父子进程都没有了
ps aux|grep bash
kfx 25668 0.0 0.0 118748 5456 pts/0 Ss 10:06 0:00 -bash
root 26805 0.0 0.0 116992 3772 pts/0 S+ 10:07 0:00 -bash
kfx 29422 0.0 0.0 118748 5448 pts/1 Ss 10:16 0:00 -bash
root 29777 0.0 0.0 116992 3760 pts/1 S 10:16 0:00 -bash
进程管理和性能工具
pstree
pstree
进程树 可以用来以树形结构显示进程的父子关系
格式:pstree [ OPTION ] [ PID | USER ]
常用选项
-p
显示PID
-T
不显示线程Thread,默认显示线程
-u
显示用户切换
-H <PID>
高亮显示指定进程及其前辈进程
实例:
# 显示一级树结构
pstree 1
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─denyhosts.py
├─firewalld───{firewalld}
├─irqbalance
├─lvmetad
├─polkitd───6*[{polkitd}]
├─qemu-ga
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───sshd───bash───su───bash───pstree
├─supervisord─┬─java───92*[{java}]
│ ├─java───93*[{java}]
│ ├─java───79*[{java}]
│ └─java───94*[{java}]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─zabbix_agentd───5*[zabbix_agentd]
# 只显示kfx这个用户对应的进程
pstree kfx
sshd───bash───su───bash───pstree
java───92*[{java}]
java───93*[{java}]
java───79*[{java}]
java───94*[{java}]
# 显示pid
pstree -p
systemd(1)─┬─NetworkManager(4102)─┬─{NetworkManager}(4119)
│ └─{NetworkManager}(4122)
├─agetty(4091)
├─auditd(4013)───{auditd}(4014)
├─chronyd(4052)
├─crond(4083)
├─dbus-daemon(4047)
├─denyhosts.py(7135)
├─firewalld(4096)───{firewalld}(4397)
├─irqbalance(4046)
├─lvmetad(2147)
├─polkitd(4059)─┬─{polkitd}(4085)
│ ├─{polkitd}(4089)
│ ├─{polkitd}(4090)
│ ├─{polkitd}(4092)
│ ├─{polkitd}(4093)
│ └─{polkitd}(4094)
├─qemu-ga(4060)
├─rsyslogd(4584)─┬─{rsyslogd}(4593)
│ └─{rsyslogd}(4594)
├─sshd(4580)───sshd(4489)───sshd(4493)───bash(4494)───su(4522)───bash(4524)───pstree(5592)
├─supervisord(10149)─┬─java(11134)─┬─{java}(11135)
│ │ ├─{java}(11136)
│ │ ├─{java}(11137)
│ │ ├─{java}(11138)
│ ├─java(11796)─┬─{java}(11800)
│ │ ├─{java}(11802)
│ │ ├─{java}(11803)
│ │ ├─{java}(11804)
│ ├─java(11799)─┬─{java}(11811)
│ │ ├─{java}(11816)
│ │ ├─{java}(11817)
│ │ ├─{java}(11818)
│ └─java(19766)─┬─{java}(19767)
│ ├─{java}(19768)
│ ├─{java}(19769)
│ ├─{java}(19770)
├─systemd-journal(2127)
├─systemd-logind(4045)
├─systemd-udevd(2156)
├─tuned(4582)─┬─{tuned}(4854)
│ ├─{tuned}(4855)
│ ├─{tuned}(4856)
│ └─{tuned}(4869)
└─zabbix_agentd(4599)─┬─zabbix_agentd(4600)
├─zabbix_agentd(4601)
├─zabbix_agentd(4602)
├─zabbix_agentd(4603)
└─zabbix_agentd(4604)
# 高亮显示pid为4599的进程
pstree -H 4599
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─denyhosts.py
├─firewalld───{firewalld}
├─irqbalance
├─lvmetad
├─polkitd───6*[{polkitd}]
├─qemu-ga
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───sshd───bash───su───bash───pstree
├─supervisord─┬─java───92*[{java}]
│ ├─java───93*[{java}]
│ ├─java───79*[{java}]
│ └─java───94*[{java}]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─zabbix_agentd───5*[zabbix_agentd]
ps
ps
显示进程信息
格式:ps [ OPTION ]
支持三种选项:
- UNIX选项:eg:
-a|-e
- BSD选项:eg:
a
- GNU选项:eg:
--help
常用选项
a
显示包括所有终端中的进程
x
显示包括不链接终端的进程
u
显示进程所有者的信息
f
显示进程树,相当于--forest
k|--sort
显示指定内容排序,指定内容前加-
表示倒序
eg:k %mem
表示按照内存使用率正排;k -%mem
表示按照内存使用率倒排
o
自定义显示内容;pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm等
L
显示支持自定义显示的内容
ps
显示内容的含义
ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan04 ? 00:10:31 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 133776 3844 ? Ss Jan04 10:31 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
# C:CPU使用率
# VSZ:Virtual memory SiZe 虚拟内存集,线性内存
# RSS:RsSident Size 常驻内存集(实际使用的物理内存)
# STAT: 进程状态
# R:running
# S:interruptable sleeping
# D:uniterruptable sleeping
# T:stoped
# Z:zobie
# +:前台进程
# l:多线程进程
# L:内存分页并带锁
# N:低优先级进程
# <:高优先级进程
# s:session leader 会话(子进程)发起者
# I:Idle kernel thread CentOS 8 新特性
# ni:nice值(-20-19之间)
# pri:priority 优先级
# rtprio:实时优先级
# psr:processor cpu编号
实例:
# 显示详细进程
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 133776 3844 ? Ss Jan04 10:28 /usr/lib/systemd/systemd --switched-root --s
root 2 0.0 0.0 0 0 ? S Jan04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jan04 0:12 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Jan04 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Jan04 0:12 [migration/0]
root 8 0.0 0.0 0 0 ? S Jan04 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S Jan04 10:39 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Jan04 0:00 [lru-add-drain]
# 显示进程的父子关系
ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S Jan04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jan04 0:12 \_ [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S Jan04 0:12 \_ [migration/0]
root 8 0.0 0.0 0 0 ? S Jan04 0:00 \_ [rcu_bh]
root 9 0.0 0.0 0 0 ? S Jan04 10:39 \_ [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Jan04 0:00 \_ [lru-add-drain]
root 11 0.0 0.0 0 0 ? S Jan04 0:06 \_ [watchdog/0]
root 12 0.0 0.0 0 0 ? S Jan04 0:05 \_ [watchdog/1]
root 13 0.0 0.0 0 0 ? S Jan04 0:11 \_ [migration/1]
# 自定义显示内容
ps axo user,pid,%cpu,%mem,comm
USER PID %CPU %MEM COMMAND
root 1 0.0 0.0 systemd
root 2 0.0 0.0 kthreadd
root 3 0.0 0.0 ksoftirqd/0
root 5 0.0 0.0 kworker/0:0H
root 7 0.0 0.0 migration/0
root 8 0.0 0.0 rcu_bh
root 9 0.0 0.0 rcu_sched
root 10 0.0 0.0 lru-add-drain
root 11 0.0 0.0 watchdog/0
root 12 0.0 0.0 watchdog/1
root 13 0.0 0.0 migration/1
root 14 0.0 0.0 ksoftirqd/1
root 16 0.0 0.0 kworker/1:0H
root 18 0.0 0.0 kdevtmpfs
root 19 0.0 0.0 netns
# 按照cpu的使用率正排
ps axo user,pid,%cpu,%mem,comm k %cpu
USER PID %CPU %MEM COMMAND
root 1 0.0 0.0 systemd
root 2 0.0 0.0 kthreadd
root 3 0.0 0.0 ksoftirqd/0
root 5 0.0 0.0 kworker/0:0H
root 7 0.0 0.0 migration/0
root 8 0.0 0.0 rcu_bh
............
root 20507 0.0 0.0 ps
root 20737 0.0 0.0 kworker/u8:1
root 32667 0.0 0.0 sshd
kfx 32671 0.0 0.0 sshd
kfx 32672 0.0 0.0 bash
oracle 4867 0.1 2.8 java
kfx 19816 0.1 0.0 bash
oracle 20431 0.4 0.4 oracle
# 按照cpu的使用率倒排
ps axo user,pid,%cpu,%mem,comm k -%cpu
USER PID %CPU %MEM COMMAND
oracle 4867 0.1 2.8 java
root 1 0.0 0.0 systemd
root 2 0.0 0.0 kthreadd
root 3 0.0 0.0 ksoftirqd/0
root 5 0.0 0.0 kworker/0:0H
root 7 0.0 0.0 migration/0
root 8 0.0 0.0 rcu_bh
# 显示进程的有效用户及实际用户
# 普通用户使用passwd修改密码
$ passwd
# 这个s位通常都是给可执行的文件设置的。使执行者拥有对文件属主对资源的权限
ll /bin/passwd
-rwsr-xr-x. 1 root root 28K Jun 10 2014 /bin/passwd
# 用户及有效用户表示这个进程的所有权,而实际用户表示真正在运行这个进程的用户
ps axo pid,cmd,user,euser,ruser|grep passwd
21037 passwd root root kfx
prtstat
prtstat
显示进程信息;yum provides */prtstat
通过yum命令可以看到在psmisc
包组中
格式:prtstat [ OPTION ] PID
常用选项
-r
raw格式显示
实例:
prtstat 4085
Process: oracle State: S (sleeping)
CPU#: 1 TTY: 0:0 Threads: 1
Process, Group and Session IDs
Process ID: 4085 Parent ID: 1
Group ID: 4085 Session ID: 4085
T Group ID: -1
Page Faults
This Process (minor major): 58716 8
Child Processes (minor major): 0 0
CPU Times
This Process (user system guest blkio): 169.38 109.25 0.00 1362.23
Child processes (user system guest): 0.00 0.00 0.00
Memory
Vsize: 4567 MB
RSS: 238 MB RSS Limit: 18446744073709 MB
Code Start: 0x400000 Code Stop: 0x9b6e57c
Stack Start: 0x7ffd167c2210
Stack Pointer (ESP): 0x7ffd167bfae8 Inst Pointer (EIP): 0x7f06fda2273a
Scheduling
Policy: normal
Nice: 0 RT Priority: 0 (non RT)
pgrep
pgrep
搜索进程
格式:pgrep [ OPTION ] pattern
常用选项
-u uid
effective user 生效者
-U uid
real user 真正发起运行命令者
-t terminal
与指定终端相关的进程
-l
显示进程名
-a
显示完整格式的进程名
-p pid
显示指定进程的子进程
-f
显示全部命令行
实例:
uptime与w
uptime
显示负载情况
格式:uptime|w
实例:
uptime
16:22:31 up 31 days, 1:48, 1 user, load average: 0.00, 0.01, 0.05
w
16:24:55 up 31 days, 1:50, 1 user, load average: 0.02, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
kfx pts/0 192.168.168.252 10:24 7.00s 0.20s 0.03s sshd: kfx [priv]
# 当前时间|系统已启动时长|当前在线人数|系统平均负载(1、5、15分钟的平均负载)
# 系统平均负载:指定时间段内运行队列中平均进程数;
# 通常每个cpu内核的当前活动进程数不大于3,那么系统的性能良好。
# 如果每个cpu内核的任务数大于5,那么该服务器性能有严重问题
# 实践中测试如果平均负载在5以上,则服务器的负载已经很严重了
cat /proc/uptime
2687313.69 5297574.91
# 包含两个值(系统启动时长|空闲进程总时长),单位:s秒
mpstat
mpstat
Multi Processor Statistics
的缩写,是实时监控工具,报告与cpu的一些统计信息这些信息都存在/proc/stat
文件中,在多CPU系统里,其不但能查看所有的CPU的平均状况的信息,而且能够有查看特定的cpu信息
mpstat
最大的特点是:可以查看多核心的cpu中每个计算核心的统计数据,而且类似工具vmstat
只能查看系统的整体cpu情况
mpstat
是常用的多核CPU性能分析工具,用来实时查看CPU的性能指标以及所有CPU的平均指标
yum provides */mpstat
通过yum命令可以看到在sysstat
包组中
格式:mpstat [ -A ] [ -u ] [ -V ] [ -I { SUM | CPU | SCPU | ALL } ] [ -P { cpu [,...] | ON |ALL } ] [ interval [count ] ]
常用选项
-P {cpu l ALL}
表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
internal
相邻的两次采样的间隔时间
count
采样的次数,count只能和delay一起使用
实例:
# 当mpstat不带参数时,输出为从系统启动以来的平均值
mpstat
Linux 3.10.0-957.21.3.el7.x86_64 (oracle211) 02/05/2021 _x86_64_ (2 CPU)
10:15:06 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:15:06 AM all 0.43 0.00 0.35 0.63 0.00 0.01 0.00 0.00 0.00 98.58
# 针对所有的cpu,每隔2秒产生一个报告,一共产生6个
mpstat 2 6
Linux 3.10.0-957.21.3.el7.x86_64 (oracle211) 02/05/2021 _x86_64_ (2 CPU)
10:15:44 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:15:46 AM all 2.26 0.00 1.00 2.01 0.00 0.00 0.00 0.00 0.00 94.74
10:15:48 AM all 0.25 0.00 0.25 0.50 0.00 0.00 0.00 0.00 0.00 98.99
10:15:50 AM all 1.25 0.00 1.25 0.75 0.00 0.00 0.00 0.00 0.00 96.74
10:15:52 AM all 0.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 99.75
10:15:54 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:15:56 AM all 0.00 0.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 99.75
Average: all 0.63 0.00 0.46 0.58 0.00 0.00 0.00 0.00 0.00 98.33
# 针对cpu0,每隔2秒产生一个报告,一共产生6个
mpstat -P 0 2 6
Linux 3.10.0-957.21.3.el7.x86_64 (oracle211) 02/05/2021 _x86_64_ (2 CPU)
10:17:57 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:17:59 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:18:01 AM 0 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 98.99
10:18:03 AM 0 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 99.00
10:18:05 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:18:07 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
10:18:09 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: 0 0.17 0.00 0.17 0.00 0.00 0.00 0.00 0.00 0.00 99.67
# CPU:CPU的ID
# 下列说明的都是在internal时间段里的百分比
# %usr:用户态的CPU时间(%),不包含 nice值为负进程 usr/total*100
# %nice:nice值为负进程的CPU时间(%) nice/total*100
# %sys:核心时间(%) system/total*100
# %iowait:硬盘IO等待时间(%) iowait/total*100
# %irq:硬中断时间(%) irq/total*100
# %soft:软中断时间(%) softirq/total*100
# %steal:显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比(可以理解为虚拟机占用的cpu是被盗取的时间片) steal/total*100
# %guest:显示运行虚拟处理器时CPU花费时间的百分比 guest/total*100
# %gnice:gnice/total*100
# %idle:CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%) idle/total*100
# CPU总的工作时间
# total_cur = 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
# 其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点
dstat
dstat
dstat命令是一个用来替换vmstat、iostat、netstat、nfsstat和ifstat这些命令的工具,是一个全能系统信息统计工具
格式:dstat [-afv] [options..] [delay [count]]
常用选项
-c
显示cpu相关信息
-C
当有多个CPU时候,此参数可按需分别显示cpu状态;eg:-C 0,1
显示cpu0和cpu1的信息
-d
显示disk相关信息
-D
统计指定磁盘或汇总信息;eg:-D sda,total
显示sda硬盘的汇总信息
-g
显示page相关统计信息
-m
显示memory相关统计信息
-n
显示network相关统计信息
-N
显示指定网路接口相关信息;eg:-N eth0,total
显示eth0网卡的相关信息
-p
显示process相关统计信息
-r
显示io请求相关统计信息
-s
显示swapped请求相关统计信息
--tcp
开启tcp统计,包括(listen, established, syn, time_wait, close)
--udp
开启udp统计,包括 (listen, active)
--unix
开启tcp统计,包括(listen, established, syn, time_wait, close)
--raw
开启raw统计 (raw sockets)
--socket
用来显示tcp、udp
端口状态
--ipc
显示ipc消息队列,信号等信息
--top-cpu
显示占用CPU最多的进程
--top-io
显示占用io最多的进程
--top-mem
显示占用内存最多的进程
--top-latency
显示延迟最大的进程
实例:
dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 99 1 0 0|3411B 35k| 0 0 | 8B 23B| 350 474
0 1 100 0 0 0| 0 4096B|1373B 1642B| 0 0 | 260 315
0 0 100 0 0 0| 0 4096B|1855B 1070B| 0 0 | 282 321
1 1 94 6 0 0| 0 120k|1858B 1070B| 0 0 | 326 441
0 0 100 0 0 0| 0 0 |1751B 717B| 0 0 | 231 268
0 0 100 0 0 0| 0 0 |1000B 709B| 0 0 | 222 277
# 显示最占用内存、cpu、io的进程
dstat --top-mem --top-cpu --top-io
--most-expensive- -most-expensive- ----most-expensive----
memory process | cpu process | i/o process
ora_dbw0_orc 874M|java 0.1|systemd 98k 22k
ora_dbw0_orc 874M|zabbix_agentd0.5|zabbix_agen1335B 23B
ora_dbw0_orc 874M| |ora_pmon_or3510B 0
ora_dbw0_orc 874M| |ora_ckpt_or 80k 32k
ora_dbw0_orc 874M| |irqbalance 3355B 0
ora_dbw0_orc 874M|ora_j000_orcl1.0|systemd 1029k 12k
ora_dbw0_orc 874M| |ora_ckpt_or 16k 32k
ora_dbw0_orc 874M|java 0.5|systemd 257k 3064B
扩展
面试题:找到未知进程的执行程序文件路径
# 找到java -jar iam.jar这个进程的执行程序文件的路径
ps -ef|grep java
kfx 11134 10149 1 Jan18 ? 22:46:26 /usr/local/java/bin/java -jar iam.jar
# 通过pid找到对应路径
# exe找出的是程序命令
ls -la /proc/11134/exe
lrwxrwxrwx 1 kfx kfx 0 Mar 11 16:37 /proc/11134/exe -> /data/jdk/jdk1.8.0_101/bin/java
# cwd找出的是工作路径
ls -la /proc/11134/cwd
lrwxrwxrwx 1 kfx kfx 0 Feb 4 09:46 /proc/11134/cwd -> /data/seal_v4/iam
进程和计划任务
# 查看内存超分大小:
grep -i commit /proc/meminfo
CommitLimit: 6036068 kB
Committed_AS: 4540868 kB