一.mpstat

1.1mpstat概述

mpstat全称为Multiprocessor Statistics 可以查看所有cpu的平均负载,也可以查看指定cpu的负载。所以mpstat其实就是主要查看CPU负载的一个工具。

mpstat是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标。

1.2命令安装

mpstat是Linux性能工具集sysstat中的一个工具,所以我们要装上sysstat,安装方法随不同的系统略有不同,sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如:CPU 使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行

[root@yzq ~]# yum install -y sysstat
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.ustc.edu.cn
正在解决依赖关系
--> 正在检查事务
---> 软件包 sysstat.x86_64.0.10.1.5-17.el7 将被 升级
---> 软件包 sysstat.x86_64.0.10.1.5-19.el7 将被 更新
--> 解决依赖关系完成

依赖关系解决

================================================
 Package  架构    版本              源     大小
================================================
正在更新:
 sysstat  x86_64  10.1.5-19.el7     base  315 k

事务概要
================================================
升级  1 软件包

总计:315 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在更新    : sysstat-10.1.5-19.el7.x86   1/2 
  清理        : sysstat-10.1.5-17.el7.x86   2/2 
  验证中      : sysstat-10.1.5-19.el7.x86   1/2 
  验证中      : sysstat-10.1.5-17.el7.x86   2/2 

更新完毕:
  sysstat.x86_64 0:10.1.5-19.el7                

完毕!

参数介绍
mpstat [-P {ALL}] [internal [count]]

-P: 指定要监控哪个CPU,范围是[0 ~ n-1], ALL表示监控所有CPU都监控
internal: 相邻两次采样的间隔时间
count: 采样次数,count只能和internval一起使用
在这里插入图片描述
第一个部分:输出首先显示所有CPU的合计指标,然后显示了每个CPU各项指标

第二个部分:在结尾处显示所有CPU的平均值
在这里插入图片描述

1.3mpstat参数介绍

[root@yzq ~]# mpstat
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

14时32分55秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
14时32分55秒  all    0.58    0.00    0.97    0.03    0.00    0.03    0.00    0.00    0.00   98.38

CPU : 显示的是某个CPU 还是全部CPU all=全部

%usr : 表示用户所有使用的CPU百分比

%nice : 表示使用 nice 值的 CPU 的百分比

%sys : 表示内核进程使用的 CPU 百分比

%iowait : 表示等待进行 I/O 所使用的 CPU 时间百分比

%irq : 表示用于处理系统中断的CPU百分比

%soft : 表示用于软件中断的CPU百分比

%steal : 虚拟机强制CPU等待的时间百分比

%guest : 虚拟机占用CPU时间的百分比

%gnice : CPU运行niced guest虚拟机所花费的时间百分比

%idle : CPU的空闲时间的百分比
mpstat主要用在当系统变慢,平均负载增大时,我们想判断到底是CPU的使用率增大了,还是IO压力增大的情况

1.4平均负载查看

当系统变慢,用top或uptime来了解系统的负载情况。
系统平均负载是指在特定时间间隔内运行队列中的平均进程数
如果单个CPU过去一分钟平均负载不大于3的话,那么系统的性能是良好的。2核是6依次类推

[root@yzq ~]# uptime 
 15:22:47 up  1:05,  1 user,  load average: 0.00, 0.01, 0.05

二:压力测试工具stress

2.1stress简介

stress是Linux下的一个压力测试工具,可以对cpu、memory(内存)、IO以及磁盘进行压力测试,可以指定负载的cpu个数。

2.2下载压力工具软件包

需要先下载所需要的依赖包否则直接下载stress软件包工具不成功

yum install -y epel-release  #安装epel软件库
yum install -y stress        #安装软件包

2.3stress参数

常用参数
-c --cpu 产生n个进程,每个进程都反复不停的计算随机数的平方根
-i --io 产生n个进程,每个进程反复调用 将内存上的内容写到硬盘上
-m --vm 产生n个进程,每个进程不断分配和释放内存
-t --timout 在n秒后结束进程
-d --hdd 产生n个不断执行 write 和unlink函数的进程(创建文件、写入内容、删除文件)

三:查看运行中的进程/任务、CPU、内存等统计信息——pidstat

pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

3.1常用选项

用法: pidstat [ 选项 ] [ <时间间隔> [ <次数> ] ]

-u 默认的参数,显示各个进程的CPU使用统计
-r 显示各个进程的内存使用统计
-d 显示各个进程的IO使用情况
-p 指定进程号
-w 显示每个进程的上下文切换情况
-t 显示选择任务的线程的统计信息外的额外信息
-V 版本号
-h 在一行上显示了所有活动,这样其他程序可以容易解析。
-I(大写) 在SMP环境,表示任务的CPU使用率/内核数量
-l 显示命令名和所有参数

pidstat -u 查看本机全部进程的CPU使用
pidstat -u -p [PID] 2 3 每两秒输出一次进程号为PID的进程CPU使用情况,输出3次

四:iostat

Linux下最基本的IO监测工具就是iostat了,它属于sysstat这个rpm包。
iostat 主要用于输出磁盘IO 和 CPU的统计信息。
可以用yum install sysstat 直接安装。

[root@yzq ~]# yum install sysstat

4.1iostat 用法

用法:iostat [选项] [<时间间隔>] [<次数>]

4.2命令参数:

-c: 显示CPU使用情况
-d: 显示磁盘使用情况
-N: 显示磁盘阵列(LVM) 信息
-n: 显示NFS 使用情况
-k: 以 KB 为单位显示
-m: 以 M 为单位显示
-t: 报告每秒向终端读取和写入的字符数和CPU的信息
-V: 显示版本信息
-x: 显示详细信息
-p:[磁盘] 显示磁盘和分区的情况

iostat
显示所有设备负载情况

[root@yzq ~]# iostat 
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.99    0.00    0.22    0.02    0.00   97.77

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.16         0.00       1028          0
sdb               0.03         1.24         0.00       8232          0
sdc               0.03         0.83         0.00       5528          0
sda               2.46        85.13        12.54     564475      83152
sdd               0.03         0.83         0.00       5528          0
sde               0.03         0.83         0.00       5528          0
dm-0              2.20        80.24        12.22     532065      81048
dm-1              0.01         0.37         0.00       2460          0

cpu属性值说明

%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。

disk属性值说明:
磁盘名称
device:磁盘名称
tps:每秒钟发送到的I/O请求数.
Blk_read/s:每秒读取的block数.
Blk_wrtn/s:每秒写入的block数.
Blk_read:读入的block总数.
Blk_wrtn:写入的block总数.

iostat 1 5
间隔1秒,总共显示5次

iostat -d 2
每隔2秒,显示一次设备统计信息.

iostat -d 2 3
每隔2秒,显示一次设备统计信息.总共输出3次.

iostat -x sda sdb 2 3
每隔2秒显示一次sda, sdb两个设备的扩展统计信息,共输出3次.

iostat -p sda 2 3
每隔2秒显示一次sda及上面所有分区的统计信息,共输出3次.

iostat -m
以M为单位显示所有信息

[root@yzq ~]# iostat -m
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.81    0.00    0.20    0.01    0.00   97.97

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
scd0              0.00         0.00         0.00          1          0
sdb               0.03         0.00         0.00          8          0
sdc               0.02         0.00         0.00          5          0
sda               2.24         0.08         0.01        551         81
sdd               0.02         0.00         0.00          5          0
sde               0.02         0.00         0.00          5          0
dm-0              2.00         0.07         0.01        519         79
dm-1              0.01         0.00         0.00          2          0

iostat -d sda
显示指定硬盘信息

[root@yzq ~]# iostat -d sda
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               2.22        76.77        11.32     564483      83260

iostat -t
报告每秒向终端读取和写入的字符数。

[root@yzq ~]# iostat -t
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

2022年07月17日 16时20分39秒
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.79    0.00    0.20    0.01    0.00   97.99

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.14         0.00       1028          0
sdb               0.03         1.12         0.00       8232          0
sdc               0.02         0.75         0.00       5528          0
sda               2.21        76.51        11.29     564483      83283
sdd               0.02         0.75         0.00       5528          0
sde               0.02         0.75         0.00       5528          0
dm-0              1.98        72.11        11.00     532073      81178
dm-1              0.01         0.33         0.00       2460          0

iostat -d -k 1 1
查看TPS和吞吐量信息

[root@yzq ~]# iostat -d -k 1 1
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.14         0.00       1028          0
sdb               0.03         1.11         0.00       8232          0
sdc               0.02         0.75         0.00       5528          0
sda               2.21        76.17        11.25     564483      83340
sdd               0.02         0.75         0.00       5528          0
sde               0.02         0.75         0.00       5528          0
dm-0              1.97        71.79        10.96     532073      81236
dm-1              0.01         0.33         0.00       2460          0

iostat -d -x -k 1 1
查看设备使用率(%util)、响应时间(await)

[root@yzq ~]# iostat -d -x -k 1 1
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.14     0.00   114.22     0.00    1.22    1.22    0.00   0.89   0.00
sdb               0.00     0.00    0.03    0.00     1.11     0.00    74.84     0.00    0.10    0.10    0.00   0.08   0.00
sdc               0.00     0.00    0.02    0.00     0.74     0.00    65.42     0.00    0.14    0.14    0.00   0.10   0.00
sda               0.01     0.06    1.88    0.32    75.93    11.21    79.27     0.00    0.63    0.54    1.19   0.36   0.08
sdd               0.00     0.00    0.02    0.00     0.74     0.00    65.42     0.00    0.15    0.15    0.00   0.09   0.00
sde               0.00     0.00    0.02    0.00     0.74     0.00    65.42     0.00    0.10    0.10    0.00   0.07   0.00
dm-0              0.00     0.00    1.59    0.38    71.57    10.93    83.95     0.00    0.72    0.60    1.22   0.39   0.08
dm-1              0.00     0.00    0.01    0.00     0.33     0.00    54.67     0.00    0.16    0.16    0.00   0.14   0.00

说明:

tps:每秒钟发送到的I/O请求数。
Blk_read/s:每秒读取的block数。
Blk_wrtn/s:每秒写入的block数。
Blk_read:读入的block总数。
Blk_wrtn:写入的block总数。
rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
r/s: 每秒完成的读 I/O 设备次数。即 rio/s
w/s: 每秒完成的写 I/O 设备次数。即 wio/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz: 平均I/O队列长度。
rsec/s: 每秒读扇区数。即 rsect/s
wsec/s: 每秒写扇区数。即 wsect/s
r_await:每个读操作平均所需的时间
不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间。
w_await:每个写操作平均所需的时间
不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间。
await: 平均每次设备I/O操作的等待时间 (毫秒)。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
%util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。

iostat -c 1 2
查看cpu状态
间隔1秒显示一次,总共显示2次

[root@yzq ~]# iostat -c 1 2
Linux 3.10.0-957.el7.x86_64 (yzq) 	2022年07月17日 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.76    0.00    0.20    0.01    0.00   98.03

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.00    0.00    0.00  100.00

五:iotop

1.命令简介

iotop 是一个类似 top 的工具,用来显示实时的磁盘活动。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况。iotop 监控 Linux 内核输出的 I/O 使用信息,并且显示一个系统中进程或线程的当前 I/O 使用情况。它显示每个进程/线程读写 I/O 带宽。它同样显示当等待换入和等待 I/O 的线程/进程花费的时间的百分比。

2.命令安装

[root@yzq ~]# yum install -y iotop

3.常用选项

-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户。
-P 只显示进程,不显示所有线程
-a 累积的I/O,显示从iotop启动后每个进程累积的I/O总数,便于诊断问题
-k 显示使用KB单位
-t 非交互模式下,加上时间戳
-q 只在第一次监测时显示列名. 去除头部一些行:这个参数可以设置最多3次来移除头部行:-q列头部只在最初交互显示一次;-qq列头部不显示;-qqq,I/O的总结不显示

[root@yzq ~]# iotop

在这里插入图片描述
输出解释:
Total DISK READ:从磁盘中读取的总速率
Total DISK WRITE:往磁盘里写入的总速率
Actual DISK READ:从磁盘中读取的实际速率
Actual DISK WRITE:往磁盘里写入的实际速率
TID:线程ID,按p可转换成进程ID
PRIO:优先级
USER:线程所有者
DISK READ:从磁盘中读取的速率
DISK WRITE:往磁盘里写入的速率
SWAPIN:swap交换百分比
IO>:IO等待所占用的百分比
COMMAND:具体的进程命令

4.I/O常用快捷键

左右箭头:改变排序方式,默认是按IO排序。

r:改变排序顺序。
o:只显示有IO输出的进程。
p:进程/线程的显示方式的切换。
a:显示累积使用量。
q:退出。

5.iotop示例

-o, --only://仅显示实际执行I / O的进程或线程,只显示在划硬盘的程序

[root@yzq ~]# iotop -o

在这里插入图片描述
-b, --batch://非交互模式,批量处理 用来记录日志的

[root@yzq ~]# iotop -b

在这里插入图片描述
-n NUM, --iter=NUM://设定循环几次

[root@yzq ~]# iotop -n 5

在这里插入图片描述
-d SEC, --delay=SEC://设定显示时间间隔[秒]

[root@yzq ~]# iotop -d 2

在这里插入图片描述
-p PID, --pid=PID://要监控的进程/线程[全部]

[root@yzq ~]# iotop -p 5

在这里插入图片描述
-u USER, --user=USER://用户监控[全部]

[root@yzq ~]# iotop -u root

在这里插入图片描述
显示指定用户
-b是非交互式,-n 2指监控2次,-d 5 表示5秒刷新一次,-u是指定用户

[root@yzq ~]# iotop -b -n 2 -d 5 -p1
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:     204.52 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22

显示指定用户
-b是非交互式,-n 2指监控2次,-d 5 表示5秒刷新一次,-u是指定用户

[root@yzq ~]# iotop -b -n 2 -d 5 -u root
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
     2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
     3 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
     4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0]
     5 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]
     7 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
     8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_bh]
     9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
    10 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [lru-add-drain]
    11 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    12 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/1]
    13 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
    14 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
    16 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/1:0H]
  3089 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kdmflush]
    18 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kdevtmpfs]
    19 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [netns]

打印指定PID的时间戳
-t表示打印时间戳,-k是单位为KB

[root@yzq ~]# iotop -b -n 2 -d 5 -u root -p 1 -t -k
16:54:13 Total DISK READ :       0.00 K/s | Total DISK WRITE :       0.00 K/s
16:54:13 Actual DISK READ:       0.00 K/s | Actual DISK WRITE:       0.00 K/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
16:54:13      1 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
16:54:18 Total DISK READ :       0.00 K/s | Total DISK WRITE :       0.00 K/s
16:54:18 Actual DISK READ:       0.00 K/s | Actual DISK WRITE:       0.00 K/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
16:54:18      1 be/4 root        0.00 K/s    0.00 K/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22

六:lsof

1.lsof命令

lsof (list open files)是一个列出当前系统打开文件的工具。在linux系统环境下,任何事物都可以以文件形式存在,通过文件不仅可以访问常规的数据,还可以访问网络连接和硬件。

适应条件:lsof访问的是核心文件和各种文件,所以必须以root用户的身份运行才能充分发挥其功能。
因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

2.语法

lsof【选项】[绝对路径的文件名]

3.选项

-a 列出打开文件存在的进程;
-c<进程名> 列出指定进程所打开的文件;
-g 列出GID号进程详情;
-d<文件号> 列出占用该文件号的进程;
+d<目录> 列出目录下被打开的文件;
+D<目录> 递归列出目录下被打开的文件;
-n<目录> 列出使用NFS的文件;
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件;
-u 列出UID号进程详情;
-h 显示帮助信息;
-v 显示版本信息。

4.示列

列出所有打开的文件

[root@yzq ~]# lsof | head -10
COMMAND     PID  TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                root  cwd       DIR              253,0       277         64 /
systemd       1                root  rtd       DIR              253,0       277         64 /
systemd       1                root  txt       REG              253,0   1616360  101132888 /usr/lib/systemd/systemd
systemd       1                root  mem       REG              253,0     20112     198497 /usr/lib64/libuuid.so.1.3.0
systemd       1                root  mem       REG              253,0    265624     207360 /usr/lib64/libblkid.so.1.1.0
systemd       1                root  mem       REG              253,0     90248     148203 /usr/lib64/libz.so.1.2.7
systemd       1                root  mem       REG              253,0    157424     198511 /usr/lib64/liblzma.so.5.2.2
systemd       1                root  mem       REG              253,0     23968     198505 /usr/lib64/libcap-ng.so.0.0.0
systemd       1                root  mem       REG              253,0     19896     198245 /usr/lib64/libattr.so.1.1.0


COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

FD文件描述符列表:
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX)(库引用);
er:FD information error (see NAME column)(fd信息错误);
jld:jail directory (FreeBSD)(监控目录);
ltx:shared library text (code and data)(共享库文本);
mxx :hex memory-mapped type number xx(十六进制内存映射类型号xx);
m86:DOS Merge mapped file(DOS合并映射文件);
mem:memory-mapped file(内存映射文件);
mmap:memory-mapped device(内存映射设备);
pd:parent directory(父目录);
rtd:root directory(跟目录);
tr:kernel trace file (OpenBSD)(内核跟踪文件);
v86 VP/ix mapped file(VP/IX映射文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。

同时在文件状态模式后面,还跟着相关的锁:

N:for a Solaris NFS lock of unknown type(对于未知类型的Solaris NFS锁);
r:for read lock on part of the file(用于对文件的一部分进行读取锁定);
R:for a read lock on the entire file(整个文件的读取锁定);
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length(对于任意长度的读写锁);
U:for a lock of unknown type(对于未知类型的锁);
x:for an SCO OpenServer Xenix lock on part of the file(对于文件的sco openserver xenix锁);
X:for an SCO OpenServer Xenix lock on the entire file(对于整个文件的sco openserver xenix锁);
space:if there is no lock(如果没有锁).

文件类型:

DIR:表示目录。
CHR:表示字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:网际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

查看端口现在运行的情况
ls -i:port #某个端口
ls -i:port1-port2 #
ls -i:1-80 #查看端口1-80运行情况

[root@yzq ~]# lsof -i:1-80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    6867   root    3u  IPv4  40954      0t0  TCP *:ssh (LISTEN)
sshd    6867   root    4u  IPv6  40956      0t0  TCP *:ssh (LISTEN)
sshd    6880   root    3u  IPv4  43486      0t0  TCP yzq:ssh->192.168.28.1:59000 (ESTABLISHED)
master  7319   root   13u  IPv4  45685      0t0  TCP localhost:smtp (LISTEN)
master  7319   root   14u  IPv6  45686      0t0  TCP localhost:smtp (LISTEN)
dnsmasq 7411 nobody    3u  IPv4  46296      0t0  UDP *:bootps 
dnsmasq 7411 nobody    5u  IPv4  46299      0t0  UDP yzq:domain 
dnsmasq 7411 nobody    6u  IPv4  46300      0t0  TCP yzq:domain (LISTEN)
sshd    9460   root    3u  IPv4  63312      0t0  TCP yzq:ssh->192.168.28.1:60481 (ESTABLISHED)

常用方式

#列出所有打开的文件:
lsof
备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位

# 查看谁正在使用某个文件
lsof   /filepath/file

#递归查看某个目录的文件信息
lsof +D /filepath/filepath2/
备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

# 比使用+D选项,遍历查看某个目录的所有文件信息 的方法
lsof | grep ‘/filepath/filepath2/’

# 列出某个用户打开的文件信息
lsof  -u username
备注: -u 选项,u其实是user的缩写

# 列出某个程序所打开的文件信息
lsof -c mysql
备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了

# 列出多个程序多打开的文件信息
lsof -c mysql -c apache

# 列出某个用户以及某个程序所打开的文件信息
lsof -u test -c mysql

# 列出除了某个用户外的被打开的文件信息
lsof   -u ^root
备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

# 通过某个进程号显示该进行打开的文件
lsof -p 1

# 列出多个进程号对应的文件信息
lsof -p 123,456,789

# 列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1

# 列出所有的网络连接
lsof -i

# 列出所有tcp 网络连接信息
lsof  -i tcp

# 列出所有udp网络连接信息
lsof  -i udp

# 列出谁在使用某个端口
lsof -i :3306

# 列出谁在使用某个特定的udp端口
lsof -i udp:55

# 特定的tcp端口
lsof -i tcp:80

# 列出某个用户的所有活跃的网络端口
lsof  -a -u test -i

# 列出所有网络文件系统
lsof -N

#域名socket文件
lsof -u

#某个用户组所打开的文件信息
lsof -g 5555

# 根据文件描述列出对应的文件信息
lsof -d description(like 2)

# 根据文件描述范围列出文件信息
lsof -d 2-3

恢复删除文件
当系统中的某个文件被意外删除了,只要这个时候系统中有进程正在访问这个文件,那么可以通过lsof 从/proc目录下恢复文件的内容
假如/var/log/messages文件被删了,恢复这个文件的方法:
首先使用lsof 查看当前是否有进程打开/var/log/messages文件,
#lsof |grep /var/log/messages
[root@localhost ~]# rm /var/log/messages
rm:是否删除普通文件 “/var/log/messages”?y
[root@localhost ~]# lsof |grep /var/log/messages
rsyslogd 5925 root 1w REG 8,2 4369 266184 /var/log/messages (deleted)

从上面的信息可以看到PID 5925(syslogd)打开文件的文件描述符为1,同时发现/var/log/messages已经被删除了。
因此可以通过/var/log/messages文件描述符来查看文件信息。
cat /pro/5925/fd/1
最后通过重定向的方法恢复被删除的/var/log/messages
cat /pro/5925/fd/1 >/var/log/messages

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐