Linux常用监控命令

words: 4.3k    views:    time: 18min

常用的Linux状态查询命令整理

uptime

1
2
## uptime
9:25 up 3 days, 8:36, 3 users, load averages: 1.92 1.81 1.69

输出信息:系统现在的时间,开机运行时间,当前登录用户个数,系统在一分钟内、5分钟内、15分钟内的平均负载

如果load average值长期大于系统CPU个数,则说明CPU很繁忙,负载很高,可能会影响系统性能

top 实时状态

  • 定位java进程CPU飙高原因
1
2
3
4
5
6
7
top结果默认按CPU使用率排序,找到进程pid;

top -H -p <pid> 找到线程 tid

将线程id转换成16进制

jstack pid | grep <tid> -A 20 查看线程堆栈

ps 进程状态

ps是进程查看命令,可以确定有哪些进程正在运行和运行的状态、进程是否结束、有没有僵死、哪些进程占用了过多的资源等;

  • 参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-N 忽略选择
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on
-l 长格式(有F,wchan,C 等字段)
-j 作业格式
-o 用户自定义格式
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
h 不显示第一行
  • 常见用法:
1
2
3
4
5
6
7
8
9
10
## 查看进程资源占用
ps -aux --sort=-%cpu | head -11

ps -aux --sort=-%mem | head -11

## 查看进程指定资源
ps -eo pid,%cpu,%mem,vsz,rss,etime,cmd --sort=-%cpu | grep -E '进程标识'

## 查看完整命令行(-w -ww 可以加宽输出,不截断)
ps -ef -ww | grep nginx

lsof 打开文件

  • 列出打开指定文件的进程

直接使用文件名作为参数,可以列出打开此文件的进程

lsof /var/log/syslog
1
2
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 488 syslog    1w   REG    8,1     1151 268940 /var/log/syslog

  • 列出进程所打开的文件

使用 -p 选项,可以列出特定进程打开的所有文件

lsof -p 1753
1
2
3
4
5
COMMAND  PID       USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    1753 lakshmanan  cwd    DIR    8,1     4096  393571 /home/lakshmanan/test.txt
bash    1753 lakshmanan  rtd    DIR    8,1     4096       2 /
bash    1753 lakshmanan  255u   CHR  136,0      0t0       3 /dev/pts/0
...

  • 列出进程使用的网络文件
1
lsof -i -a -p 234

输出说明

1
2
3
4
5
6
7
8
9
10
11
12
FD 表示文件描述符
• cwd - 当前工作目录
• txt - 文本文件
• mem – 内存映射文件
• mmap – 内存映射设备
• NUMBER – 表示实际的文件描述符。数字后面的字符,即'1u',代表文件打开的模式,r读,w写,u读和写

TYPE 文件类型
• REG – 常规文件
• DIR——目录
• FIFO——先进先出
• CHR——字符特殊文件

netstat 网络统计

netstat是在内核中访问网络及相关信息的程序,它能提供IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。通过此命令可以知道一个进程占用了哪些端口,或者一个端口被哪个进程占用了。

  • 格式:
1
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
  • 参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-a或–all 显示所有连线中的Socket
-A<网络类型>或–<网络类型> 列出该网络类型连线中的相关地址
-c或–continuous 持续列出网络状态
-C或–cache 显示路由器配置的快取信息
-e或–extend 显示网络其他相关信息
-F或–fib 显示FIB
-g或–groups 显示多重广播功能群组组员名单
-h或–help 在线帮助
-i或–interfaces 显示网络界面信息表单
-l或–listening 显示监控中的服务器的Socket
-M或–masquerade 显示伪装的网络连线
-n或–numeric 直接使用IP地址,而不通过域名服务器
-N或–netlink或–symbolic 显示网络硬件外围设备的符号连接名称
-o或–timers 显示计时器
-p或–programs 显示正在使用Socket的程序识别码和程序名称
-r或–route 显示Routing Table
-s或–statistice 显示网络工作信息统计表
-t或–tcp 显示TCP传输协议的连线状况
-u或–udp 显示UDP传输协议的连线状况
-v或–verbose 显示指令执行过程
-V或–version 显示版本信息
-w或–raw 显示RAW传输协议的连线状况
-x或–unix 此参数的效果和指定”-A unix”参数相同
–ip或–inet 此参数的效果和指定”-A inet”参数相同

-输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Recv-Q 接收队列
Send-Q 发送队列
State 连接状态

状态说明:
SYN-SENT 客户端已发送SYN,等待ACK(出现大量这样的状态,可能被当成肉鸡用来攻击了)
SYN-RECEIVED 服务端已收到SYN,并且已发送SYN+ACK,等待ACK;(出现大量这样的状态,可能被flood攻击了)
ESTABLISHED 连接已建立,数据传输状态;

FIN-WAIT-1 主动方发送FIN,等待ACK
CLOSE-WAIT 被动方收到FIN,已返回ACK,等待应用层关闭;
FIN-WAIT-2 主动方收到ACK,等待被动方的FIN
LAST-ACK 被动方应用层完成关闭,发送FIN,等待主动方的ACK(出现大量这样的状态,也可能被攻击了)
TIME-WAIT 主动方收到FIN,并返回了ACK,等待2MSL后关闭;
CLOSED 已关闭的连接

LISTEN 服务端监听
CLOSING 双方都发送FIN,在等待对方的ACK(网络拥塞或双方同时关闭时出现)
  • 示例:
netstat -ntp
1
2
3
4
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.141.21:22 192.168.141.17:51749 ESTABLISHED 55063/sshd: root@pt
tcp 0 0 192.168.141.21:22 192.168.141.17:52641 ESTABLISHED 70231/sshd: root@pt
  • 查看接口统计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Iface         网络设备的接口名称
MTU 表示最大传输单元,单位为字节
RX-OK/TX-OK 表示已经准确无误地接收/发送了多少数据包
RX-ERR/TX-ERR 表示接收/发送数据包时候产生了多少错误
RX-DRP/TX-DRP 表示接收/发送数据包时候丢弃了多少数据包
RX-OVR/TX-OVR 表示由于误差而丢失了多少数据包

Flg标记:
B 已经设置了一个广播地址
L 该接口是一个回送设备
M 接收所有数据包(混乱模式)
N 避免跟踪
O 在该接口上,禁用ARP
P 这是一个点到点链接
R 接口正在运行
U 接口处于活动状态

iostat 磁盘IO

Linux上可以通过命令iostat来系统设备的IO负载情况,其首次运行时显示自系统启动开始的各项统计信息,之后的运行将显示自上次运行该命令以后的统计信息。一般用来查看磁盘的活动统计情况,但是它只能对系统的整体情况进行分析,如果项对某个进程分析,可以通过命令iotop。

  • 格式:
1
iostat [参数] [时间] [次数]
  • 参数:
1
2
3
4
5
6
7
8
9
10
-c 显示CPU使用情况
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS 使用情况
-p [磁盘] 显示磁盘和分区的情况
-t 显示终端和CPU的信息
-x 显示详细信息
-V 显示版本信息
  • 输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
avg-cpu:
%user: CPU处在用户模式下的时间百分比
%nice: CPU处在带NICE值的用户模式下的时间百分比
%system:CPU处在系统模式下的时间百分比
%iowait:CPU等待输入输出完成时间的百分比
%steal: 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle: CPU空闲时间百分比

Device: 监测设备名称
rrqm/s: 每秒进行的读操作次数
wrqm/s: 每秒进行的写操作次数
r/s: 每秒完成的读I/O设备次数
w/s: 每秒完成的写I/O设备次数
rkB/s: 每秒读取的字节数
wkB/s: 每秒写入的字节数
avgrq-sz:平均每次设备I/O操作的数据大小
avgqu-sz:平均I/O等待队列长度
await: 平均每次设备I/O操作的等待时间 (毫秒)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)
%util: 被I/O需求消耗的CPU百分比

如果%iowait过高,表示磁盘存在I/O瓶颈;

如果%idle值高,表示CPU较空闲;

如果%idle值高但系统响应慢,则有可能是CPU等待分配内存,此时应加大内存容量;

如果%idle值持续低于10,那么可能系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU;

如果%util接近100,说明I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈;

如果svctm`接近await,说明I/O几乎没有等待时间;如果await远大于svctm,说明I/O队列太长,响应太慢,需要进行必要优化;

  • 示例:
iostat -x -p 1 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Linux 3.10.0-862.el7.x86_64 (bogon)     03/20/22    _x86_64_    (4 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.01 0.00 0.06 0.00 0.00 99.92

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.02 0.13 0.12 3.93 1.29 43.04 0.00 1.94 0.53 3.48 0.85 0.02
sda1 0.00 0.00 0.02 0.00 0.60 0.05 79.35 0.00 0.34 0.32 1.60 0.27 0.00
sda2 0.00 0.02 0.11 0.12 3.30 1.24 40.29 0.00 2.06 0.56 3.48 0.90 0.02
dm-0 0.00 0.00 0.11 0.13 3.18 1.24 37.40 0.00 2.25 0.59 3.59 0.85 0.02
dm-1 0.00 0.00 0.00 0.00 0.08 0.00 48.41 0.00 0.25 0.25 0.00 0.18 0.00

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

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

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

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

vmstat 虚拟内存

vmstat是虚拟内存统计(Virtual Meomory Statistics)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。它提供了一种低开销的系统性能观察方式,即使在高负荷的服务器上也能查看并监控系统的健康情况,但它是对系统的整体情况进行统计,无法对某个进程进行深入分析。

  • 格式:
1
2
3
4
5
6
7
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
  • 参数:
1
2
3
4
5
6
7
8
9
10
11
-a:  显示活跃和非活跃内存
-f: 显示从系统启动至今的fork数量 。
-m: 显示slabinfo
-n: 只在开始时显示一次各字段名称。
-s: 显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d: 显示磁盘相关统计信息。
-p: 显示指定磁盘分区统计信息
-S: 使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K
-V: 显示vmstat版本信息。
  • 输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
r:  运行队列中进程数量(如果长期大于1的话,可能需要增加CPU)   
b: 等待IO的进程数量

swpd: 使用虚拟内存大小(如果swpd不为0,但是si,so长期为0的话,这种情况不会影响系统性能)
free: 空闲物理内存大小
buff: 缓存文件元数据(inode 等)和来自原始块设备的数据
cache: 缓存文件数据块和内存映射信息(即调用mmap()映射的文件)

如果cache的值大,说明cache的文件数多,如果频繁访问的文件都能被cache处,那么磁盘的读IO bi会非常小。

si: 每秒从交换区写到内存的大小,由磁盘调入内存
so: 每秒写入交换区的内存大小,由内存调入磁盘

如果这si和so长期大于0,系统性能会受到影响,磁盘IO和CPU都会被消耗。有时看空闲内存(free)很少的或接近于0时,就认为内存不够用了。
其实不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少,那么不用担心,系统性能这时不会受到影响

bi: 每秒读取的块数
bo: 每秒写入的块数

随机磁盘读写的时候,bi和bo越大,CPU花在IO等待上的值也会越大

in: 每秒中断数,包括时钟中断
cs: 每秒上下文切换数

us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间,以百分比表示
wa: 等待IO时间

识别CPU瓶颈:当ussy接近于100时,表示CPU正接近于满负荷工作,但CPU满负荷工作并不能说明什么,Linux总会试图让CPU尽可能的繁忙,以便任务的吞吐量最大化,最能确定CPU瓶颈的还是r,即队列中等待运行的进程数。

如果r长期大于CPU个数(可以通过cat /proc/cpuinfo|grep processor|wc -l查看CPU数),且id很低,则说明cpu的负荷很重,一般出现这种情况,应用程序的问题会比较大一些,比如一些sql语句不合理的情况。

识别RAM内存瓶颈:通过虚拟内存机制,可以将RAM移到SWAP磁盘上,这样会出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会进行页导出,但经常出现页导入操作就表明服务器需要更多的内存了,页导入需要从SWAP复制回RAM,导致服务器速度变慢。即如果si和so长期非零的话,则可能存在内存瓶颈。

wa表示CPU用于等待IO的时间,如果内存够大,可以修改文件/proc/sys/vm/swappiness中的值,它表示实际内存区和交换区进行数据交换的倾向性大小,默认60,设置小一点以降低数据交换次数。但如果交换区Swap本身就使用很少,那么修改也没有意义,可能进程本身就是偏IO类型的任务。

  • 示例:
vmstat 1 5
1
2
3
4
5
6
7
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3476280 2116 229340 0 0 1 0 16 15 0 0 100 0 0
0 0 0 3476288 2116 229340 0 0 0 0 77 58 0 0 100 0 0
0 0 0 3476304 2116 229340 0 0 0 0 59 56 0 0 100 0 0
0 0 0 3476296 2116 229340 0 0 0 0 61 53 0 0 100 0 0
0 0 0 3476296 2116 229340 0 0 0 0 55 50 0 0 100 0 0
  • 查看内存使用情况:
vmstat -s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
   3863576 K total memory
155384 K used memory
104780 K active memory
100092 K inactive memory
3476916 K free memory
2116 K buffer memory
229160 K swap cache
4193624 K total swap
0 K used swap
4193624 K free swap
2594 non-nice user cpu ticks
15 nice user cpu ticks
10945 system cpu ticks
19097245 idle cpu ticks
423 IO-wait cpu ticks
0 IRQ cpu ticks
596 softirq cpu ticks
0 stolen cpu ticks
169858 pages paged in
57641 pages paged out
0 pages swapped in
0 pages swapped out
3044881 interrupts
2914117 CPU context switches
1647746249 boot time
51300 forks


参考: