常用的Linux状态查询命令整理
uptime 1 2 # 9:25 up 3 days, 8:36, 3 users, load averages: 1.92 1.81 1.69
输出信息:系统现在的时间,开机运行时间,当前登录用户个数,系统在一分钟内、5分钟内、15分钟内的平均负载
如果load average值长期大于系统CPU个数,则说明CPU很繁忙,负载很高,可能会影响系统性能
top 实时状态
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 '进程标识' # 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 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 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瓶颈 :当us + sy接近于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
参考: