uptime
查看系统平均负载
1. $ uptime
2. 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
这是一个快捷展示系统负载的命令。
上面的load average分别代表的是1分钟、15分钟和30分钟的系统平均负载。
这里的数字代表了等待CPU运行的进程数和被不可中断I/O阻塞的进程数。
如上面命令所示的情况来看,1分钟的平均负载明显高于15分钟的平均负载,这从侧面证明有事情正在发生。如果平均负载从右到左是逐级递减的,则说明登录机器查看问题的时间太迟,已经错过了。
dmesg
查看系统日志
常用方法:
[root@192 ~]# dmesg | tail
[351102.316183] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
[408985.586372] perf: interrupt took too long (41870 > 41842), lowering kernel.perf_event_max_sample_rate to 4000
[424458.796480] e1000: ens33 NIC Link is Down
[424462.802161] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
[424466.814100] e1000: ens33 NIC Link is Down
[424470.823094] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
[424492.874992] e1000: ens33 NIC Link is Down
[424498.887893] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
[424502.899194] e1000: ens33 NIC Link is Down
[424508.911823] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
这里展示的是最近10条的系统消息日志,如果系统消息没有就不会展示。主要是看由于性能问题导致的错误。在排查问题时,该命令值得一用。
iostat
查看磁盘的性能详情
常用方法:
[root@192 ~]# iostat -xz 1
Linux 3.10.0-1062.el7.x86_64 (192.168.127.139) 10/26/2022 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.02 0.01 0.00 99.94
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.03 0.38 1.38 7.97 46.00 0.00 0.52 0.90 0.48 0.31 0.01
avg-cpu: %user %nice %system %iowait %steal %idle
0.00 0.00 0.25 0.00 0.00 99.75
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 1.00 2.00 8.00 5.50 9.00 0.00 1.00 2.00 0.50 1.00 0.30
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 2.00 0.00 5.00 5.00 0.00 0.50 0.00 0.50 0.50 0.10
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.25 0.00 0.00 99.50
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 4.00 0.00 10.00 5.00 0.00 0.75 0.00 0.75 0.75 0.30
- r/s w/s rkb/s wkb/s;表示每秒读写次数和每秒读写的字节数,可以看出设备的负载情况。
- await;I/O等待的平均时间(单位是毫秒)。这是应用程序所等待的时间,包含了等待队列中的时间和被调度服务的时间。过大的平均等待时间就预示着设备超负荷运行或者说设备有问题了。
- avgqu-sz;设备上请求的平均数。数值大于1可能表示设备饱和了。
- %util;设备利用率。是使用率的百分数,展示每秒设备的工作时间。这个数字如果大于60%则会导致性能很低(结合await看,同时I/O性能低不一定是应用程序的问题)。
vmstat
vmstat是一个常用命令,每行打印关键的服务信息统计摘要,这些统计数据统统来自/proc虚拟文件。
[root@192 ~]# vmstat 1
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 5710004 2072 1555216 0 0 0 2 13 25 0 0 100 0 0
0 0 0 5709988 2072 1555248 0 0 0 6 130 189 0 0 100 0 0
0 0 0 5709988 2072 1555248 0 0 0 0 70 129 0 0 100 0 0
0 0 0 5709988 2072 1555248 0 0 0 674 126 218 0 0 100 0 0
0 0 0 5709988 2072 1555248 0 0 0 15 125 204 0 0 100 0 0
- 刚出现的一行数据是启动后的平均值,不是前一秒的数据展示,没有参考价值。
- r列表示的是等待CPU运行的可运行进程数,它不包含I/O等待的进程,当r列的值比CPU数值大的时候就是饱和状态了。
- free列展示的是还有多少空闲内存可以使用,单位是KB。
- swap列中的si、so表示有多少数据被交换进来和交换出去,如果不为零则证明内存不足。
- CPU列中的us、sy、id、wa、st,表示的是从四个小时间去分解CPU时间:用户时间、系统时间、空间时间、等待I/O时间、被偷走的时间。CPU时间的分解可以帮忙确定CPU是不是非常忙(通过用户时间和系统时间结合看),如果持续的I/O等待则表明磁盘是瓶颈(说明CPU比较空闲,算是另一个维度的空闲率),系统时间较高超过20%就要看是什么引起的了。
mpstat
查看各个CPU的时间统计,可以看出整体CPU的使用是不是均衡的。如果有一个使用率明显较高的CPU就可以看出来是一个单线程应用。
[root@192 ~]# mpstat -P ALL 1
Linux 3.10.0-1062.el7.x86_64 (192.168.127.139) 10/26/2022 _x86_64_ (4 CPU)
06:16:17 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
06:16:18 PM all 0.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 99.75
06:16:18 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
06:16:18 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
06:16:18 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
06:16:18 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
pidstat
类似top命令可以为每个CPU统计信息功能,但不像top那样每秒清屏会覆盖上一秒展示的内容,通过这个命令能更好的看清楚变化的趋势。
[root@192 ~]# pidstat 1
Linux 3.10.0-1062.el7.x86_64 (192.168.127.139) 10/26/2022 _x86_64_ (4 CPU)
06:19:28 PM UID PID %usr %system %guest %CPU CPU Command
06:19:29 PM 0 34854 0.00 0.97 0.00 0.97 0 pidstat
06:19:29 PM UID PID %usr %system %guest %CPU CPU Command
06:19:30 PM 0 1163 0.00 1.00 0.00 1.00 2 tuned
06:19:30 PM 1003 33293 1.00 0.00 0.00 1.00 1 zabbix_server
06:19:30 PM UID PID %usr %system %guest %CPU CPU Command
06:19:31 PM 0 34854 0.00 1.00 0.00 1.00 0 pidstat
06:19:31 PM UID PID %usr %system %guest %CPU CPU Command
06:19:32 PM 996 33377 1.00 0.00 0.00 1.00 1 mysqld
06:19:32 PM 0 34854 1.00 0.00 0.00 1.00 0 pidstat
06:19:32 PM UID PID %usr %system %guest %CPU CPU Command
06:19:33 PM 0 24191 0.00 1.00 0.00 1.00 0 kworker/0:1
06:19:33 PM 0 34854 0.00 1.00 0.00 1.00 0 pidstat
ps
查看系统中运行的进程
常用:
ps -ef or ps -aux
- -a 显示现行终端机上运行的进程,包括其他用户的进程
- -u 显示以当前用户身份运行的进程
- -x 显示所有的进程,不区分终端
ps -ef 效果与ps -aux效果大致,不同在于ps -ef可以看到运行进程的父进程号。
free
查看内存的使用情况
[root@192 ~]# free -g
total used free shared buff/cache available
Mem: 7 0 5 0 1 6
Swap: 0 0 0
buffers: 用于块设备I/O缓冲的缓存
cached: 用于文件系统的页缓存
在查看主机剩余内存的情况只需要关注free就可以了,buffer和cache的占用是linux用空闲内存作为缓存,如果应用程序需要,可以快速拿回去。一般应用进程占用内存的比率超过70%就要考虑扩容了。
那什么是页缓存?
linux中页缓存的本质就是对于磁盘中的部分数据在内存中保留一定的副本,使得应用程序能够快速的读取到磁盘中相应的数据,并实现不同进程之间的数据共享。因此,linux中页缓存的引入主要是为了解决两类重要的问题:
1.磁盘读写速度较慢(ms 级别);
2.实现不同进程之间或者同一进程的前后不同部分之间对于数据的共享;
如果没有进程之间的共享机制,那么对于系统中所启动的所有进程在打开文件的时候都要将需要的数据从磁盘加载进物理内存空间,这样不仅造成了加载速度变慢(每次都从磁盘中读取数据),而且造成了物理内存的浪费。为了解决以上问题,linux操作系统使用了缓存机制。在虚拟内存机制出现以前,操作系统使用块缓存机制,但是在虚拟内存出现以后操作系统管理IO的粒度更大,因此采用了页缓存机制。此后,和后备存储的数据交互普遍以页为单位。页缓存是基于页的、面向文件的一种缓存机制。
df
查看系统整体磁盘使用情况
[root@192 ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 20M 3.8G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda3 xfs 45G 11G 34G 25% /
/dev/sda1 xfs 297M 124M 173M 42% /boot
tmpfs tmpfs 781M 0 781M 0% /run/user/0
- -T 显示挂载磁盘的文件系统类型
- -h 以对人类友好的可读性展示
- -i 显示磁盘的inode使用详情
lsmod
显示已载入系统的模块,通常会通过这个命令来查看系统中是否加载了某个模块。例如:
[root@192 ~]# lsmod |grep -i "xfs"
xfs 993020 2
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
第一列是已加载模块名称、第二列是模块大小(单位字节)、第三列是依赖模块数(表示有多少其他模块依赖)、第四列是依赖本模块的模块名
netstat
查看系统监听端口的状态
[root@192 ~]# netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 33267/zabbix_server
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1157/sshd
tcp6 0 0 :::10051 :::* LISTEN 33267/zabbix_server
tcp6 0 0 :::3306 :::* LISTEN 33377/mysqld
tcp6 0 0 :::80 :::* LISTEN 33521/httpd
tcp6 0 0 :::22 :::* LISTEN 1157/sshd
- -a 显示所有的socket服务
- -n 不将端口号解析成服务
- -p 显示socket对应的pid和进程名
- -l 显示处于监听的端口
- -t 显示tcp协议的socket
sar
查看系统网络吞吐的接口
[root@192 ~]# sar -n DEV 1
Linux 3.10.0-1062.el7.x86_64 (192.168.127.139) 10/26/2022 _x86_64_ (4 CPU)
06:46:58 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
06:46:59 PM lo 2.00 2.00 0.17 0.17 0.00 0.00 0.00
06:46:59 PM br-aca9582efd46 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:46:59 PM ens33 1.00 3.00 0.11 0.20 0.00 0.00 0.00
06:46:59 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:46:59 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
06:47:00 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:47:00 PM br-aca9582efd46 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:47:00 PM ens33 6.00 8.00 0.40 1.02 0.00 0.00 0.00
06:47:00 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:47:00 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
06:47:01 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:47:01 PM br-aca9582efd46 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:47:01 PM ens33 5.94 7.92 0.40 1.00 0.00 0.00 0.00
06:47:01 PM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
rxkB/s和txkB/s,作为收发数据负载的度量,也是检测是否达到收发极限。
[root@192 ~]# sar -n TCP,ETCP 1
Linux 3.10.0-1062.el7.x86_64 (192.168.127.139) 10/26/2022 _x86_64_ (4 CPU)
06:50:08 PM active/s passive/s iseg/s oseg/s
06:50:09 PM 1.00 0.00 5.00 5.00
06:50:08 PM atmptf/s estres/s retrans/s isegerr/s orsts/s
06:50:09 PM 0.00 0.00 0.00 0.00 0.00
06:50:09 PM active/s passive/s iseg/s oseg/s
06:50:10 PM 1.00 0.00 6.00 6.00
06:50:09 PM atmptf/s estres/s retrans/s isegerr/s orsts/s
06:50:10 PM 0.00 0.00 0.00 0.00 0.00
对TCP关键指标的统计,含义如下:
active/s:每秒本地发起的TCP连接数(例如通过connect()发起的连接)
passive/s:每秒远程发起的连接数(例如通过accept()接受的连接)
retrans/s:每秒TCP重传数
- 这种主动和被动统计数通常用作对系统负载的粗略估计:新接受连接数(被动),下游连接数(主动)。可以把主动看作是外部的,被动的是内部,但是这个通常也不是非常准确(例如:当有本地到本地的连接时)。
- 重传是网络或者服务器有问题的一个信号;可能是一个不可靠的网络(例如:公网),或者可能是因为服务器过载了开始丢包。
ss
查看系统连接数的命令,性能比netstat强(如果系统负载很高,netstat打开很慢,推荐用ss)。
ss -a 查看机器的socket连接数
ss -l 查看机器监听端口的情况
ss -s 查看机器的网络连接数
top
top 是比较全面的命令,但是它的一个缺陷也比较明显,很难看出变化趋势,其它像 vmstat 和 pidstat 这样的工具就会很清晰,它们是以滚动的
方式输出统计信息。