2 进程管理和性能工具
参考链接:http://www.brendangregg.com/linuxperf.html
2.1 进程树 pstree
pstree 可以用来显示进程的父子关系,以树形结构显示
格式:
pstree [OPTION] [ PID | USER ]
常用选项:
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程
范例:
[19:17:24 root@centos8 ~]#pstree 1
[19:18:01 root@centos8 ~]#pstree zhang
bash───ping
[19:18:47 root@centos8 ~]#pstree -pT
[19:19:05 root@centos8 ~]#pstree -u
2.2 进程信息 ps
ps 即 process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux 系统各进程的相关信息均保存在/proc/PID 目录下的各文件中
ps 格式
ps [OPTION]...
支持三种选项:
- UNIX 选项如: -A -e
- BSD 选项如: a
- GNU 选项如: --help
常用选项:
a 选项包括所有终端中的进程x 选项包括不链接终端的进程u 选项显示进程所有者的信息
f 选项显示进程树,相当于 --forest
k|--sort 属性 对属性排序,属性前加 - 表示倒序
o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem L 显示支持的属性列表
-C cmdlist 指定命令,多个命令用,分隔
-L 显示线程
-e 显示所有进程,相当于-A
-f 显示完整格式程序信息
-F 显示更完整格式的进程信息
-H 以进程层级格式显示进程相关信息
-u userlist 指定有效的用户ID或名称
-U userlist 指定真正的用户ID或名称
-g gid或groupname 指定有效的gid或组名称
-G gid或groupname 指定真正的gid或组名称
-p pid 显示指pid的进程
--ppid pid 显示属于pid的子进程
-t ttylist 指定tty,相当于 t
-M 显示SELinux信息,相当于Z
ps 输出属性
C : ps -ef 显示列 C 表示cpu利用率
VSZ: Virtual memory SiZe,虚拟内存集,线性内存RSS: ReSident Size, 常驻内存集
STAT:进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程L:
内存分页并带锁N:
低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
I:Idle kernel thread,CentOS 8 新特性
ni: nice值
pri: priority 优先级
rtprio: 实时优先级
psr: processor CPU编号
示例:
[19:19:25 root@centos8 ~]#ps axo pid,cmd,psr,ni,pri,rtprio
常用组合
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
范例:查看进程详细信息
[19:23:25 root@centos8 ~]#ps -ef
[19:24:57 root@centos8 ~]#ps aux
#查看进程特定属性
[19:25:59 root@centos8 ~]#ps axo pid,cmd,%mem,%cpu
范例:针对属性排序,Centos6 以下版本不支持
#按CPU利用率倒序排序
[19:27:36 root@centos8 ~]#ps aux k -%cpu
#按内存倒序排序
[19:29:46 root@centos8 ~]#ps axo pid,cmd,%cpu,%mem k -%mem
范例:有效用户和实际用户
[zhang@centos8 ~]$ passwd
Changing password for user zhang.
Current password:
[19:30:34 root@centos8 ~]#ps axo pid,cmd,%cpu,%mem,user,euser,ruser | grep passwd
1878 passwd 0.0 0.8 root root zhang
1880 grep --color=auto passwd 0.0 0.1 root root root
euser:为有效用户,执行这个进程生效的用户,一般执行文件带有suid权限会出现实际用户和有效用户不一样
ruser:为实际用户,实际执行这个进程的用户
范例:
#查询你拥有的所有进程
[19:38:23 root@centos8 ~]#ps -x
#显示指定用户名(RUID)或用户ID的进程
[19:38:52 root@centos8 ~]#ps -u postfix
[19:39:22 root@centos8 ~]#ps -u 89
#显示指定用户名(EUID)或用户ID的进程
[19:39:54 root@centos8 ~]#ps -fu postfix
[19:39:29 root@centos8 ~]#ps -fu 89
#查看以root用户权限(实际和有效ID)运行的每个进程
[19:40:36 root@centos8 ~]#ps -U root -u root
#列出某个组拥有的所有进程(实际组ID:RGID或名称)
[19:40:36 root@centos8 ~]#ps -fG postfix
#列出有效组名称(或会话)所拥有的所有进程
[19:41:53 root@centos8 ~]#ps -fg postfix
[19:42:37 root@centos8 ~]#ps -fg 89
#显示指定的进程ID对应的进程
[19:43:30 root@centos8 ~]#ps -fp 1853
#以父进程ID来显示其下所有的进程,如显示父进程为855的所有进程
[19:45:04 root@centos8 ~]#ps -f --ppid 855
#显示指定PID的多个进程
[19:46:42 root@centos8 ~]#ps -fp 1,835
#要按tty显示所属进程
[19:46:46 root@centos8 ~]#ps -ft pts/0
#以进程树显示系统中的进程如何相互链接
[19:47:30 root@centos8 ~]#ps -e --forest
#以进程树显示指定的进程
[19:48:18 root@centos8 ~]#ps -e --forest -C sshd
[19:48:18 root@centos8 ~]#ps -e --forest | grep -v grep | grep sshd
#要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列
[19:50:05 root@centos8 ~]#ps -fL -C nginx
#要列出所有格式说明符
[19:50:23 root@centos8 ~]#ps -L
#查看进程的PID,PPID,用户名和命令
[19:51:14 root@centos8 ~]#ps -eo pid,ppid,user,cmd
#自定义格式显示文件系统组,ni值开始时间和进程的时间
[19:51:28 root@centos8 ~]#ps -p 1 -o pid,ppid,fgroup,ni,lstart,etime
#使用其PID查找进程名称:
[19:52:06 root@centos8 ~]#ps -p 1830 -o comm=
#要以其名称选择特定进程,显示其所有子进程
[19:52:50 root@centos8 ~]#ps -C sshd,bash
#查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用
[19:53:11 root@centos8 ~]#ps -C sshd -o pid=
#检查一个进程的执行时间
[19:53:38 root@centos8 ~]#ps -eo comm,etime,user | grep nginx
#排序,查找占用最多内存和CPU的进程
[19:54:06 root@centos8 ~]#ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%mem | head
[19:55:04 root@centos8 ~]#ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head
#显示安全信息
[19:55:38 root@centos8 ~]#ps -eM
[19:55:50 root@centos8 ~]#ps --context
#使用以下命令以用户定义的格式显示安全信息
[19:56:51 root@centos8 ~]#ps -eo euser,ruser,suser,fuser,f,comm,label
#使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
[19:58:12 root@centos8 ~]#watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
面试题:查看未知进程的执行程序文件路径
[20:00:27 root@centos8 ~]#ls -l /proc/1852/exe
lrwxrwxrwx 1 root root 0 Jan 4 19:31 /proc/1852/exe -> /usr/bin/su
范例:查看优先级和 CPU 绑定关系
[20:02:06 root@centos8 ~]#ps axo pid,cmd,ni,pri,psr,rtprio | grep bash
1363 -bash 0 19 0 -
1830 -bash 0 19 0 -
1853 -bash 0 19 0 -
4324 grep --color=auto bash 0 19 0 -
范例:实现进程和 CPU 的绑定
[20:04:14 root@centos8 ~]#taskset --help
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]
#并不能固定永久绑定,只要pid号变化就无效了
2.3 查看进程信息 prtstat
可以显示进程信息,来自于 psmisc 包
格式:
prtstat [options] PID ...
选项:
-r raw 格式显示
[20:06:56 root@centos8 ~]#prtstat -r 4325
[20:07:38 root@centos8 ~]#prtstat 4325
2.4 设置和调整进程优先级
进程优先级调整
- 静态优先级:100-139
- 进程默认启动时的 nice 值为 0,优先级为 120
- 只有根用户才能降低 nice 值(提高优先性)
nice 命令
以指定的优先级来启动进程
nice [OPTION] [COMMAND [ARG]...]
-n, --adjustment=N add integer N to the niceness (default 10)
renice 命令
可以调整正在执行中的进程的优先级
renice [-n] priority pid...
查看
ps axo pid,comm,ni
范例:
[20:08:03 root@centos8 ~]#nice -n -10 ping 127.0.0.1
[20:10:24 root@centos8 ~]#ps axo pid,cmd,nice | grep ping
4409 ping 127.0.0.1 -10
4415 grep --color=auto ping 0
[20:11:35 root@centos8 ~]#renice -n 20 4417
4417 (process ID) old priority -10, new priority 19
[20:11:46 root@centos8 ~]#ps axo pid,cmd,nice | grep ping
4417 ping 127.0.0.1 19
4422 grep --color=auto ping 0
2.5 搜索进程
按条件搜索进程
- ps 选项 | grep 'pattern' 灵活
- pgrep 按预定义的模式
- /sbin/pidof 按确切的程序名称查看 pid
2.5.1 pgrep
命令格式
pgrep [options] pattern
常用选项
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
范例:
[20:14:23 root@centos8 ~]#pgrep -u zhang
4427
[20:14:29 root@centos8 ~]#pgrep -lu zhang
4427 bash
[20:14:36 root@centos8 ~]#pgrep -au zhang
[20:14:49 root@centos8 ~]#pgrep -aP 4427
4455 dd if=/dev/zero of=/dev/null
[20:15:27 root@centos8 ~]#pgrep -at pts/1
1830 -bash
4426 su - zhang
4427 -bash
4455 dd if=/dev/zero of=/dev/null
[20:15:47 root@centos8 ~]#
2.5.2 pidof
命令格式:
pidof [options] [program [...]]
常用选项
-x 按脚本名称查找pid
范例:
[20:15:47 root@centos8 ~]#pidof bash
4476 1830 1363
[20:17:39 root@centos8 ~]#pidof 1.sh
[20:17:43 root@centos8 ~]#pidof -x 1.sh
4476
2.6 负载查询 uptime
/proc/uptime 包括两个值,单位 s
- 系统启动时长
- 空闲进程的总时长(按总的 CPU 核数计算)
uptime 和 w 显示以下内容
- 当前时间
- 系统已启动的时间
- 当前上线人数
- 系统平均负载(1、5、15 分钟的平均负载,一般不会超过 1,超过 5 时建议警报)
系统平均负载: 指在特定时间间隔内运行队列中的平均进程数,通常每个 CPU 内核的当前活动进程数不大于 3,那么系统的性能良好。如果每个 CPU 内核的任务数大于 5,那么此主机的性能有严重问题
如:linux 主机是 1 个双核 CPU,当 Load Average 为 6 的时候说明机器已经被充分使用
范例:
[20:18:04 root@centos8 ~]#uptime
20:19:22 up 2:33, 2 users, load average: 0.10, 0.42, 0.42
[20:19:22 root@centos8 ~]#w
20:19:27 up 2:33, 2 users, load average: 0.09, 0.41, 0.42
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.10.1 19:07 1:40 0.29s 0.29s -bash
root pts/1 192.168.10.1 19:31 6.00s 0.03s 0.00s w
2.7 显示 CPU 相关统计 mpstat
来自于 sysstat 包
范例:
[20:20:44 root@centos8 ~]#mpstat
Linux 4.18.0-193.el8.x86_64 (centos8) 01/04/2021 _x86_64_ (1 CPU)
08:20:48 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:20:48 PM all 3.36 0.02 3.17 0.08 0.14 0.08 0.00 0.00 0.00 93.15
[20:20:48 root@centos8 ~]#mpstat 1 3
Linux 4.18.0-193.el8.x86_64 (centos8) 01/04/2021 _x86_64_ (1 CPU)
08:20:59 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:21:00 PM all 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 99.00
08:21:01 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
08:21:02 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.00 0.00 0.33 0.00 0.00 0.00 0.00 99.67
2.8 查看进程实时状态 top 和 htop
2.8.1 top
top 提供动态的实时进程状态
有许多内置命令
帮助:h 或 ? ,按 q 或esc 退出帮助
排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+
首部信息显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令
退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W
top 命令栏位信息简介
us: 用 户 空 间
sy: 内 核 空 间
ni:调整nice时间
id: 空 闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间
top 选项
-d # 指定刷新实际间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
-H 线程模式
示例:
[20:28:03 root@centos8 ~]#top -H -p 855
2.8.2 htop
htop 命令是增强版的 TOP 命令,来自 EPEL 源,比 top 功能更强
选项:
-d #: 指定延迟时间;
-u UserName: 仅显示指定用户的进程
-s COLUME: 以指定字段进行排序
子命令:
s:跟踪选定进程的系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某指定CPU核心
t:显示进程树
2.9 内存空间 free
向/proc/sys/vm/drop_caches 中写入相应的修改值,会清理缓存。建议先执行 sync(sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行 echo 1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的
如果因为是应用有像内存泄露、溢出的问题时,从 swap 的使用情况是可以比较快速可以判断的,但通 过执行 free 反而比较难查看。但核心并不会因为内存泄露等问题并没有快速清空 buffer 或 cache(默认值是 0),生产也不应该随便去改变此值。
一般情况下,应用在系统上稳定运行了,free 值也会保持在一个稳定值的。当发生内存不足、应用获取 不到可用内存、OOM 错误等问题时,还是更应该去分析应用方面的原因,否则,清空 buffer,强制腾 出 free 的大小,可能只是把问题给暂时屏蔽了。
排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉 buffer,以判断应用的内存使用情况; 或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清 空 buffer。
说明: man 5 proc
[root@centos8 ~]#man proc
.....
To free pagecache, use:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes, use:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes, use:
echo 3 > /proc/sys/vm/drop_caches
范例:清理缓存
[20:32:40 root@centos8 ~]#cat /proc/sys/vm/drop_caches
0
[20:32:52 root@centos8 ~]#free -h
total used free shared buff/cache available
Mem: 952Mi 202Mi 353Mi 6.0Mi 395Mi 590Mi
Swap: 2.0Gi 0B 2.0Gi
[20:32:58 root@centos8 ~]#echo 3 > /proc/sys/vm/drop_caches
[20:33:19 root@centos8 ~]#free -h
total used free shared buff/cache available
Mem: 952Mi 181Mi 649Mi 6.0Mi 121Mi 636Mi
Swap: 2.0Gi 0B 2.0Gi
2.10 进程对应的内存映射 pmap
格式:
pmap [options] pid [...]
常用选项
-x: 显示详细格式的信息
范例:
[20:33:20 root@centos8 ~]#pmap 1
[20:35:04 root@centos8 ~]#cat /proc/1/maps
范例:查看系统调用与库调用
#系统调用
[20:36:16 root@centos8 ~]#strace ls
#库调用
[20:37:01 root@centos8 ~]#ltrace ls
2.11 虚拟内存信息 vmstat
格式:
vmstat [options] [delay [count]]
显示项说明
procs:
r:可运行(正运行或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd: 交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率
system:
in: interrupts 中断速率,包括时钟
cs: context switch 进程切换速率
cpu:
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11前, unknown.
选项:
-s 显示内存的统计数据
范例:
[20:39:42 root@centos8 ~]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 495288 72 276680 0 0 41 27 113 129 3 3 94 0 0
[20:39:46 root@centos8 ~]#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
2 0 0 495288 72 276700 0 0 41 27 113 129 3 3 94 0 0
0 0 0 495228 72 276700 0 0 0 0 60 109 0 0 100 0 0
0 0 0 495228 72 276700 0 0 0 0 58 110 0 0 100 0 0
[20:39:54 root@centos8 ~]#vmstat -s
974876 K total memory
202756 K used memory
210360 K active memory
83320 K inactive memory
495348 K free memory
72 K buffer memory
276700 K swap cache
2097148 K total swap
0 K used swap
2097148 K free swap
31561 non-nice user cpu ticks
213 nice user cpu ticks
29939 system cpu ticks
978883 idle cpu ticks
889 IO-wait cpu ticks
1465 IRQ cpu ticks
877 softirq cpu ticks
0 stolen cpu ticks
427309 pages paged in
284609 pages paged out
0 pages swapped in
0 pages swapped out
1182780 interrupts
1347479 CPU context switches
1609753548 boot time
6035 forks
2.12 统计 CPU 和设备 IO 信息 iostat
iostat 可以提供更丰富的 IO 性能状态数据
此工具由 sysstat 包提供
常用选项:
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
范例:
[20:42:19 root@centos8 ~]#iostat 1 3
Linux 4.18.0-193.el8.x86_64 (centos8) 01/04/2021 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.98 0.02 3.06 0.08 0.00 93.85
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.63 40.34 26.87 427409 284764
dm-0 1.68 39.25 26.87 415920 284752
dm-1 0.01 0.21 0.00 2220 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.00 0.00 0.00 100.00
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.00 0.00 0.00 0 0
dm-0 0.00 0.00 0.00 0 0
dm-1 0.00 0.00 0.00 0 0
tps:该设备每秒的传输次数(Indicate the number of transfers per second that were
issued to the device.)。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O
请求"。"一次传输"请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read: 读 取 的 总 数 据 量 ;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
范例:
[20:44:09 root@centos8 ~]#iostat -d sda -x
Linux 4.18.0-193.el8.x86_64 (centos8) 01/04/2021 _x86_64_ (1 CPU)
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 1.06 0.55 39.92 26.60 0.01 0.08 0.64 12.94 0.94 0.51 0.00 37.62 48.31 0.43 0.07
r/s: 每秒合并后读的请求数w/s: 每秒合并后写的请求数rsec/s:每秒读取的扇区数; wsec/:每秒写入的扇区数。
rKB/s:The number of read requests that were issued to the device per second; wKB/s:The number of write requests that were issued to the device per second; rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到 各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge); wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
%rrqm: The percentage of read requests merged together before being sent to the device.
%wrqm: The percentage of write requests merged together before being sent to the device.
avgrq-sz 平均请求扇区的大小
avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系 统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一 般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明 系统出了问题。
svctm 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示 几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运 行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘 的并发能力,所以磁盘使用未必就到了瓶颈)。
2.13 监视磁盘 I/O iotop
来自于 iotop 包
iotop 命令是一个用来监视磁盘 I/O 使用状况的 top 类工具 iotop 具有与 top 相似的 UI,其中包括 PID、用 户、I/O、进程等相关信息,可查看每个进程是如何使用 IO
iotop 输出
- 第一行:Read 和 Write 速率总计
- 第二行:实际的 Read 和 Write 速率
- 第三行:参数如下:
- 线程 ID(按 p 切换为进程 ID)
- 优先级
- 用户
- 磁盘读速率
- 磁盘写速率
- swap 交换百分比
- IO 等待所占的百分比
iotop 常用参数
-o, --only只显示正在产生I/O的进程或线程,除了传参,可以在运行过程中按o生效
-b, --batch非交互模式,一般用来记录日志
-n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用
-d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
-p PID, --pid=PID指定监测的进程/线程
-u USER, --user=USER指定监测某个用户产生的I/O
-P, --processes仅显示进程,默认iotop显示所有线程
-a, --accumulated显示累积的I/O,而不是带宽
-k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用
-t, --time 加上时间戳,非交互非模式
-q, --quiet 禁止头几行,非交互模式,有三种指定方式
-q 只在第一次监测时显示列名
-qq 永远不显示列名
-qqq 永远不显示I/O汇总
交互按键
left和right方向键:改变排序
r:反向排序
o:切换至选项--only
p:切换至--processes选项
a:切换至--accumulated选项
q:退出
i:改变线程的优先级
2.14 显示网络带宽使用情况 iftop
通过 EPEL 源的 iftop 包安装
[20:50:46 root@centos8 ~]#iftop -ni eth0
2.15 查看网络实时吞吐量 nload
nload 是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况,通过 EPEL 源安装
界面操作
上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况
按 F2 显示选项窗口
按 q 或者 Ctrl+C 退出 nload
范例:
#默认只查看第一个网络的流量进出情况
[20:51:51 root@centos8 ~]#nload
#在nload后面指定网卡,可以指定多个,按左右键分别显示网卡状态
[20:52:51 root@centos8 ~]#nload eth0 eth1
#设置刷新间隔:默认刷新间隔是100毫秒,可通过 -t 命令设置刷新时间(单位是毫秒)
[20:54:19 root@centos8 ~]#nload -t 500 eth0
#设置单位:显示两种单位一种是显示Bit/s、一种是显示Byte/s,默认是以Bit/s,也可不显示/s
#-u h|b|k|m|g|H|B|K|M|G 表示的含义: h: auto, b: Bit/s, k: kBit/s, m: MBit/s, H: auto, B: Byte/s, K: kByte/s, M: MByte/s
[20:54:52 root@centos8 ~]#nload -u M eth0
2.16 网络监视工具 iptraf-ng
来自于 iptraf-ng 包,可以进网络进行监控,对终端窗口大小有要求.图形化操作。
2.17 系统资源统计 dstat
dstat 由 pcp-system-tools 包提供,但安装 dstat 包即可, 可用于代替 vmstat,iostat 功能格
格式:
dstat [-afv] [options..] [delay [count]]
常用选项:
-c 显示cpu相关信息
-C #,#,...,total
-d 显示disk相关信息
-D total,sda,sdb,...
-g 显示page相关统计数据
-m 显示memory相关统计数据
-n 显示network相关统计数据
-p 显示process相关统计数据
-r 显示io请求相关的统计数据
-s 显示swapped相关的统计数据
--tcp
--udp
--unix
--raw
--socket
--ipc
--top-cpu:显示最占用CPU的进程
--top-io: 显示最占用io的进程
--top-mem: 显示最占用内存的进程
--top-latency: 显示延迟最大的进程
范例:
[20:58:56 root@centos8 ~]#dstat 1 3
2.18 综合监控工具 glances
此工具可以通过 EPEL 源安装,CentOS 8 目前没有提供(已提供,但测试问题)
格式:
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
内建命令:
常用选项
-b: 以Byte为单位显示网卡数据速率
-d: 关闭磁盘I/O模块
-f /path/to/somefile: 设定输入文件位置
-o {HTML|CSV}:输出格式
-m: 禁用mount模块
-n: 禁用网络模块
-t #: 延迟时间间隔
-1:每个CPU的相关数据单独显示
C/S 模式下运行 glances 命令
- 服务器模式:
- glances -s -B IPADDR
- IPADDR: 指明监听的本机哪个地址,端口默认为 61209/tcp
- glances -s -B IPADDR
- 客户端模式:
- glances -c IPADDR
- IPADDR:要连入的服务器端地址注意: 不同版本不兼容
- glances -c IPADDR
注意: 不同版本不兼容
2.19 查看进程打开文件 lsof
lsof:list open files,查看当前系统文件的工具。在 linux 环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字等, 系统在后台都为该应用程序分配了一个文件描述符
命令选项:
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-g:列出GID号进程详情
-d<文件号>:列出占用该文件号的进程
+d<目录>:列出目录下被打开的文件
+D<目录>:递归列出目录下被打开的文件
-n<目录>:列出使用NFS的文件
-i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件
-u:列出UID号进程详情
-h:显示帮助信息
-v:显示版本信息。
-n: 不反向解析网络名字
范例:
#lsof 列出当前所有打开的文件
[20:59:14 root@centos8 ~]#lsof | head
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 244 128 /
systemd 1 root rtd DIR 253,0 244 128 /
systemd 1 root txt REG 253,0 1609264 50745933 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 2191808 16963 /usr/lib64/libm-2.28.so
systemd 1 root mem REG 253,0 628744 537890 /usr/lib64/libudev.so.1.6.11
systemd 1 root mem REG 253,0 969832 20530 /usr/lib64/libsepol.so.1
systemd 1 root mem REG 253,0 1805368 76817 /usr/lib64/libunistring.so.2.1.0
systemd 1 root mem REG 253,0 355456 93758 /usr/lib64/libpcap.so.1.9.0
systemd 1 root mem REG 253,0 145984 39813 /usr/lib64/libgpg-error.so.0.24.2
#查看当前那个进程正在使用此文件
[21:05:01 root@centos8 ~]#lsof /var/log/messages
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 963 root 5w REG 253,0 474858 17000254 /var/log/messages
#查看由登录用户启动而非系统启动的进程
[21:05:17 root@centos8 ~]#lsof /dev/pts/0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1363 root 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1363 root 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1363 root 2u CHR 136,0 0t0 3 /dev/pts/0
bash 1363 root 255u CHR 136,0 0t0 3 /dev/pts/0
#指定进程号,可以查看该进程打开的文件
[21:08:15 root@centos8 ~]#lsof -p 3967
#查看程序打开的文件
[21:10:06 root@centos8 ~]#lsof -c bc
#查看指定用户打开的文件
[21:11:07 root@centos8 ~]#lsof -u zhang | more
#查看指定目录下被打开的文件,参数+D为递归列出目录下被打开的文件,参数+d为列出目录下被打开的文件
[21:11:16 root@centos8 ~]#lsof +D /var/log/
[21:11:50 root@centos8 ~]#lsof +d /var/log/
#查看所有网络连接,通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例 如:sshd等。也可以通过指定ip查看该ip的网络连接情况
[21:12:02 root@centos8 ~]#lsof -i -n
[21:12:38 root@centos8 ~]#lsof -i@127.0.0.1
#查看端口连接情况,通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
[21:12:48 root@centos8 ~]#lsof -i :80 -n
#查看指定进程打开的网络连接,参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进 程
[21:13:28 root@centos8 ~]#lsof -i -n -a -p 7531
#查看指定状态的网络连接,-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
[21:14:05 root@centos8 ~]#lsof -n -P -i TCP -s TCP:ESTABLISHED
范例:利用 lsof 恢复正在使用中的误删除的文件
[21:16:17 root@centos8 ~]#lsof | grep /home/zhang/fstab
[21:16:55 root@centos8 ~]#cat /proc/7812/fd/3
[21:17:02 root@centos8 ~]#cat /proc/7812/fd/3 > /home/zhang/fstab
2.20 综合管理平台 webmin
下载:http://www.webmin.com/download.html
Webmin 是目前功能最强大的基于 Web 的 Unix 系统管理工具。管理员通过浏览器访问 Webmin 的各种管 理功能并完成相应的管理动作。目前 Webmin 支持绝大多数的 Unix 系统,这些系统除了各种版本的 linux 以外还包括:AIX、HPUX、Solaris、Unixware、Irix 和 FreeBSD 等
[09:12:59 root@centos8 ~]#yum install /root/webmin-1.962-1.noarch.rpm
[09:13:20 root@centos8 ~]#chkconfig --list
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
webmin 0:off 1:off 2:on 3:on 4:off 5:on 6:off
[09:15:21 root@centos8 ~]#service webmin start
[09:15:39 root@centos8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 0.0.0.0:10000 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:111 [::]:*
LISTEN 0 128 [::]:22
2.21 Centos8 新特性 cockpit
由 cockpit 包提供
Cockpit 是 CentOS 8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理
- 监控系统活动(CPU、内存、磁盘 IO 和网络流量)
- 查看系统日志条目
- 查看磁盘分区的容量
- 查看网络活动(发送和接收) 查看用户帐户
- 检查系统服务的状态提取已安装应用的信息
- 查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统
- 打开并使用终端窗口
范例:安装 cockpit
[09:24:24 root@centos8 ~]#dnf install cockpit
[09:25:04 root@centos8 ~]#systemctl start cockpit
[09:25:20 root@centos8 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 :9090 :
LISTEN 0 128 [::]:111 [::]:
LISTEN 0 128 [::]:22 [::]:*
2.22 信号发送 kill
kill:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以 SIG 开头(可省略),不区分大小写
显示当前系统可用信号:
[09:25:23 root@centos8 ~]#kill -l
[09:27:54 root@centos8 ~]#trap -l
查看帮助:man 7 signal
常用信号:
1) SIGHUP 无须关闭进程而让其重读配置文件
2) SIGINT 中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT 相当于ctrl+\
4) SIGKILL 强制杀死正在运行的进程
5) SIGTERM 终止正在运行的进程,默认信号
6) SIGCONT 继续运行
7) SIGSTOP 后台休眠
指定信号的方法:
- 信号的数字标识:1, 2, 9
- 信号完整名称:SIGHUP,sighup
- 信号的简写名称:HUP,hup
向进程发送信号:
按 PID:
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
范例:
[09:35:10 root@centos8 ~]#kill -1 9548
[09:37:14 root@centos8 ~]#kill -n 9 11440
[09:41:30 root@centos8 ~]#kill -s SIGINT 11440
按名称:killall 来自于 psmisc 包
killall [-SIGNAL] comm…
[09:45:12 root@centos8 ~]#killall -n 1 vim
按模式:
pkill [options] pattern
常用选项
-SIGNAL
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名(pgrep可用)
-a: 显示完整格式的进程名(pgrep可用)
-P pid: 显示指定进程的子进程
范例:查看 HUP 信号
#许多服务的支持的reload操作,实际就是发送了HUP信号#service httpd reload 即相当于 killall -1 httpd
[root@centos6 ~]#grep -A 10 -w reload -m 1 /etc/init.d/httpd
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=6
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
# Force LSB behaviour from killproc
LSB=1 killproc -p ${pidfile} $httpd -HUP RETVAL=$?
if [ $RETVAL -eq 7 ]; then
[root@centos6 ~]#
范例:利用 0 信号实现进程的健康性检查
[09:45:13 root@centos8 ~]#killall -0 ping
[09:48:48 root@centos8 ~]#echo $?
0
[09:48:53 root@centos8 ~]#killall -0 ping
ping: no process found
[09:49:02 root@centos8 ~]#echo $?
1
#此方式有局限性,即使进程处于停止或僵尸状态,此方式仍然认为是进程是健康的
范例: pkill 和 pgrep 支持正则表达式
[09:51:14 root@centos8 ~]#pkill '^p'
[09:51:47 root@centos8 ~]#pgrep -a '^p'
11993 ping 127.1
2.23 作业管理
Linux 的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
让作业运行于后台
- 运行中的作业: Ctrl+z
- 尚未启动的作业: COMMAND &
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台 后,剥离与终端的关系
- nohup COMMAND &>/dev/null &
- screen;COMMAND tmux;
- COMMAND
查看当前终端所有作业:
[09:54:35 root@centos8 ~]#jobs
[1]+ Stopped ping 127.1
作业控制:
fg [[%]JOB_NUM]:把指定的后台作业调回前台
bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
kill [%JOB_NUM]: 终止指定的作业
范例:后台运行的进程和终端关系
#终端1运行后台进程
[10:03:30 root@centos8 ~]#ping 127.1 &
#终端2 可以查看到进程
[10:02:59 root@centos8 ~]#ps aux | grep ping
root 12100 0.0 0.2 32424 2248 pts/0 T 10:03 0:00 ping 127.1
root 12105 0.0 0.1 12112 1092 pts/1 R+ 10:04 0:00 grep --color=auto ping
#关闭终端1后,在终端2查看不到进程
[10:04:04 root@centos8 ~]#ps aux | grep ping
root 12108 0.0 0.1 12112 1096 pts/1 R+ 10:04 0:00 grep --color=auto ping
范例:nohup
[10:05:49 root@centos8 ~]#nohup ping 127.1
nohup: ignoring input and appending output to 'nohup.out'
[10:06:42 root@centos8 ~]#tail -f nohup.out
64 bytes from 127.0.0.1: icmp_seq=48 ttl=64 time=0.031 ms
64 bytes from 127.0.0.1: icmp_seq=49 ttl=64 time=0.040 ms
64 bytes from 127.0.0.1: icmp_seq=50 ttl=64 time=0.024 ms
[10:07:15 root@centos8 ~]#nohup ping 127.0.0.1 &>/dev/null &
[1] 12181
[10:07:37 root@centos8 ~]#pstree -p | grep ping
├─sshd(951)─┬─sshd(12112)───sshd(12114)───bash(12115)─┬─ping(12181)
#关闭对应的终端在观察进程的父进程
[10:07:13 root@centos8 ~]#pstree -p
├─ping(12181)
2.24 并行运行
利用后台执行,实现并行功能,即同时运行多个进程,提高效率
方法 1
cat all.sh
f1.sh&
f2.sh&
f3.sh&
方法 2
(f1.sh&);(f2.sh&);(f3.sh&)
方法 3
f1.sh&f2.sh&f3.sh&
范例:多组命令实现并行
[root@centos8 ~]#{ ping -c3 127.1; ping 127.2; }& { ping -c3 127.3 ;ping 127.4;}&
范例:
NET=192.168.10
for i in {1..254};do
{
ping -c1 -W1 $NET.$i &>/dev/null && echo $NET.$i is up || echo $NET.$i is down
}&
done
wait
使用并行可以加快网段扫描速度,wait命令的意思是后台运行结束后自动退出
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于