首页 > 数据库 > 数据库开发技术 > 如何让你三分钟了解到系统性能情况
如果你的服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?或者如何在短时间完成对系统性能的巡检;通过执行以下,可以在3分钟内对系统资源使用情况有个大致的了解

uptimedmesg | tailvmstat 1mpstat -P ALL 1pidstat 1iostat -xz 1free -msar -n DEV 1sar -n TCP,ETCP 1top
其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法。
下面简单介绍下这些命令,有关这些命令更多的参数和说明,请参照命令的help手册或者man。

uptime
[root@k8s-master-node1 ~]# uptime09:50:25 up 190 days, 16:25, 3 users, load average: 2.02, 1.54, 1.75[root@k8s-master-node1 ~]#

这个命令提供了一种快速查看系统负载情况的方式。在Linux系统中,它显示了正在等待CPU资源的进程数量以及阻塞在不可中断IO状态的进程数量(通常标记为状态"D")。
这些数据能够让我们对系统的整体资源利用情况有一个宏观了解。输出结果分别表示了过去1分钟、5分钟和15分钟的平均负载情况。通过比较这三个时间段的数据,可以判断系统负载是处于紧张状态还是有所缓解。
举例来说,如果1分钟平均负载很高,但15分钟平均负载相对较低,那可能意味着系统当前正面临着高负载情况,需要进一步查明哪些进程正在消耗CPU资源。相反,如果15分钟平均负载较高,而1分钟平均负载较低,那可能是之前的CPU资源紧张情况已经过去。
总之,通过这个命令的输出,我们可以初步了解系统的负载情况,从而采取进一步的排查和处理措施。可以通过下文将会说明的vmstat、mpstat等命令进一步排查。

dmesg | tail
[][] IPv6: ADDRCONF(NETDEV_UP): veth0405b3b: link is not ready[] br-6c878d64ce7f: port 7(veth0405b3b) entered blocking state[] br-6c878d64ce7f: port 7(veth0405b3b) entered forwarding state[] br-6c878d64ce7f: port 7(veth0405b3b) entered disabled state[] IPVS: Creating netns size=2048 id=1206[] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready[] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready[] IPv6: ADDRCONF(NETDEV_CHANGE): veth0405b3b: link becomes ready[] br-6c878d64ce7f: port 7(veth0405b3b) entered blocking state[] br-6c878d64ce7f: port 7(veth0405b3b) entered forwarding state[]
这个命令可以显示系统日志的最后10行,示例中的输出包括了一次内核的OOM(Out of Memory)kill以及一次TCP丢包。这些日志对于排查系统性能问题至关重要,因此务必不要忽略这一步。

vmstat 1
~]# vmstat 1procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 9151316 501988 52385724 0 0 1 56 0 0 2 2 96 0 00 0 0 9149860 501992 52385796 0 0 0 440 82334 142021 3 3 94 0 00 0 0 9149780 501992 52385744 0 0 0 284 77161 137741 1 1 98 0 01 0 0 9146768 501996 52385744 0 0 0 516 91386 153985 4 2 94 0 06 0 0 9145004 501996 52385780 0 0 0 300 88535 149407 2 2 96 0 01 0 0 9147712 501996 52385784 0 0 0 352 89493 149028 3 2 95 0 02 0 0 9147172 501996 52385792 0 0 0 256 80757 140743 2 1 97 0 02 0 0 9144564 502000 52385796 0 0 0 536 89887 150353 2 2 95 0 01 0 0 9146208 502000 52385808 0 0 0 464 92529 155185 3 2 94 0 00 0 0 9148888 502000 52385820 0 0 0 260 82309 143054 4 2 94 0 00 0 0 9147188 502000 52385856 0 0 0 456 73555 134222 2 2 96 0 02 0 0 9149372 502008 52385848 0 0 0 392 77921 138347 3 2 94 0 01 0 0 9148968 502008 52385852 0 0 0 316 78868 139650 2 2 97 0 01 1 0 9146776 502008 52385868 0 0 0 416 82080 143668 3 2 94 0 00 0 0 9146112 502008 52385888 0 0 0 376 88744 154722 3 2 95 0 0^C~]#
mstat(8) 命令每行输出一些系统核心指标,让我们更详细地了解系统状态。后面跟的参数1表示每秒输出一次统计信息。以下是一些与性能调优相关的列:
r:等待在CPU资源上的进程数。这个数据比平均负载更能反映CPU负载情况,不包含等待IO的进程。如果这个数值大于机器CPU核数,说明CPU资源已经饱和。
free:系统可用内存数(以千字节为单位)。如果剩余内存不足,也会导致系统性能问题。通过后文介绍的free命令,可以更详细了解系统内存使用情况。
si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),物理内存已经不足。
us, sy, id, wa, st:这些代表了CPU时间的消耗,分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。
上述CPU时间数据能够让我们快速了解CPU是否处于繁忙状态。通常情况下,如果用户时间和系统时间相加非常大,CPU可能正忙于执行指令。如果IO等待时间很长,系统的瓶颈可能在磁盘IO。
示例输出显示大量CPU时间消耗在用户态,即用户应用程序消耗了CPU时间。但这不一定是性能问题,需要结合r队列等信息一起分析。

mpstat-P ALL 1
此命令需要手动安装
yum install sysstat[root@k8s-master-node1 ~]# mpstat -P ALL 1Linux 3.10.0-1160.90.1.el7.x86_64 (k8s-master-node1) 04/18/2024 _x86_64_ (32 CPU)09:57:05 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle09:57:06 AM all 2.28 0.00 1.36 0.19 0.00 0.41 0.00 0.00 0.00 95.7509:57:06 AM 0 4.85 0.00 3.88 0.97 0.00 2.91 0.00 0.00 0.00 87.3809:57:06 AM 1 4.04 0.00 2.02 1.01 0.00 1.01 0.00 0.00 0.00 91.9209:57:06 AM 2 2.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 96.0009:57:06 AM 3 2.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 97.98...
该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。
参数和说明-P 指定监控哪个CPU,范围是[ 0~(N-1)],ALL表示监控所有CPU都监控internal 两次采样的间隔时间count 总采样次数字段 说明CPU 全部CPU和某个CPU,从0开始。下面每一行项加起来就是100%usr 用户态所使用CPU时间的百分比,CPU使用率nice nice值为负进程的CPU时间,即使用nice命令对进程进行降级时CPU的百分比sys 内核态所使用CPU时间的百分比,CPU使用率iowait CPU在等待I/O操作完成所消耗的时间,高表示可能I/O存在瓶颈irq 用于硬中断的CPU百分比soft 用于软中断的CPU百分比steal 虚拟机强制CPU等待的时间百分比guest 虚拟机占用CPU时间的百分比gnice CPU运行niced guest虚拟机所花费的时间百分比idle CPU空闲且系统没有未完成的磁盘I/O请求的时间百分比,CPU使用率低,iowait高,idle低的话可能是等待IO

pidstat 1
[root@k8s-master-node1 ~]# pidstat 1Linux 3.10.0-1160.90.1.el7.x86_64 (k8s-master-node1) 04/18/2024 _x86_64_ (32 CPU)09:57:53 AM UID PID %usr %system %guest %CPU CPU Command09:57:54 AM 0 1 0.94 0.94 0.00 1.89 9 systemd09:57:54 AM 0 9 0.00 0.94 0.00 0.94 16 rcu_sched09:57:54 AM 0 153 0.00 0.94 0.00 0.94 29 migration/2909:57:54 AM 1010 598 0.00 0.94 0.00 0.94 22 java09:57:54 AM 1010 890 0.00 0.94 0.00 0.94 20 java09:57:54 AM 1010 1783 2.83 3.77 0.00 6.60 21 operation-task09:57:54 AM 1010 2345 0.94 1.89 0.00 2.83 19 operation-admin09:57:54 AM 1010 4218 0.94 0.94 0.00 1.89 17 java09:57:54 AM 1010 18320 1.89 0.94 0.00 2.83 1 java09:57:54 AM 1010 42400 0.94 0.94 0.00 1.89 5 java09:57:54 AM 1010 44959 0.00 0.94 0.00 0.94 8 java...
pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态
参数说明和解释-u 默认的参数,显示各个进程的CPU使用统计,监控CPU,pidstat和pidstat -u -p ALL是等效的-r 显示各个进程的内存使用统计,监控内存-d 显示各个进程的IO使用情况,监控硬盘-p 指定进程号,比如pidstat -p 5-w 显示每个进程的上下文切换情况-t 显示选择任务的线程的统计信息外的额外信息字段 说明PID 进程IDusr 进程在用户态所使用的CPU时间的百分比,CPU使用率system 进程在内核态所使用的CPU时间的百分比,CPU使用率guest 进程在虚拟机占用cpu的百分比wait 进程等待CPU的时间百分比,进程处于就绪队列中的状态等待CPU调度运行的百分比CPU 进程占用cpu的百分比,和top命令一样 等于 用户态CPU+内核态 CPU,如果要区分cpu哪个态多则用pidstat,不包括 %waitCPU 处理进程的CPU编号Command 当前进程对应的命令

iostat -xz 1
[root@k8s-master-node1 ~]# iostat -xz 1Linux 3.10.0-1160.90.1.el7.x86_64 (k8s-master-node1) 04/18/2024 _x86_64_ (32 CPU)avg-cpu: %user %nice %system %iowait %steal %idle2.42 0.01 1.54 0.19 0.00 95.85Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda 0.00 3.87 0.06 9.48 2.10 61.46 13.32 0.02 2.00 5.63 1.98 0.89 0.85sdb 0.00 36.79 1.18 44.80 42.59 1758.28 78.34 0.25 5.52 2.63 5.59 0.93 4.26
iostat命令提供了查看系统磁盘IO情况的功能,通过输出的不同列可以了解到关于IO操作的各种指标。其中,r/s和w/s表示每秒的读取和写入次数,rkB/s和wkB/s则表示每秒读取和写入的数据量(以千字节为单位)。如果这些值过大,可能会导致性能问题。
await列显示的是IO操作的平均等待时间,即应用程序与磁盘交互所需的时间。如果这个值异常地高,可能是由于硬件设备遇到了瓶颈或出现了故障。
avgqu-sz表示向设备发出的平均请求数量。如果这个值大于1,可能意味着硬件设备已经饱和,部分前端硬件设备支持并行写入。
%util则是设备利用率,表示设备的繁忙程度。超过60%可能会影响IO性能,而达到100%则意味着硬件设备已经饱和。
需要注意的是,如果显示的是逻辑设备的数据,设备利用率并不一定代表后端实际的硬件设备已经饱和。另外,即使IO性能不理想,也不一定会导致应用程序性能下降,可以通过使用预读取、写缓存等策略来提升应用性能。
选项和参数-c: 仅显示CPU利用率相关信息;-d: 仅显示磁盘I/O相关信息;-k: 显示输出的数据单位为KB/s而不是默认的字节/s;-t: 在输出中显示时间戳(时间戳格式YYYY-MM-DD HH:MM:SS)。-m:显示状态以兆字节每秒为单位;-p:仅显示块设备和所有被使用的其他分区的状态;-V:显示版号并退出;-x:显示扩展状态。选项含义%user:表示用户空间程序执行的CPU时间百分比。%nice:表示以较高的优先级运行的用户进程的CPU时间百分比。%system:表示内核空间程序执行的CPU时间百分比。%iowait:表示CPU等待I/O操作完成的时间百分比。%steal:表示由于运行虚拟机等原因被其他虚拟机占用的CPU时间百分比。%idle:表示CPU空闲时间的百分比。Device 监测设备名称rrqm/s 每秒需要读取需求的数量wrqm/s 每秒需要写入需求的数量r/s 每秒实际读取需求的数量w/s 每秒实际写入需求的数量rsec/s 每秒读取区段的数量wsec/s 每秒写入区段的数量rkB/s 每秒实际读取的大小,单位为KBwkB/s 每秒实际写入的大小,单位为KBavgrq-sz 需求的平均大小区段avgqu-sz 需求的平均队列长度await 等待I/O平均的时间(milliseconds)svctm I/O需求完成的平均时间%util 被I/O需求消耗的CPU百分比
如果r/s和w/s较高,说明磁盘IO压力较大,需要考虑更换更高性能的硬盘;
如果await和svctm较高,说明磁盘处理I/O请求的能力不足,可能需要更换磁盘控制器或升级磁盘阵列等。
如果%user和%system较高,说明CPU的负载较大,可能需要考虑升级CPU或增加CPU核心数
如果%iowait较高,说明CPU等待IO完成的时间较长,可能需要优化磁盘性能或者减少磁盘IO操作;
如果%idle值高,表示CPU较空闲,系统处于空闲状态,无太多处理任务;
如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。
如果%idle较低,说明CPU负载较大,可能需要考虑优化应用程序或增加CPU资源等。

free -m
[]total used free shared buff/cache availableMem: 96501 35915 8682 2330 51903 57610Swap: 0 0 0[]
free命令用于查看系统内存的使用情况,而使用-m参数则以兆字节为单位展示。在free命令输出的结果中,最后两列分别表示用于IO缓存的内存数和用于文件系统页缓存的内存数。但需要注意的是,第二行中的-/+ buffers/cache,显示了缓存占用了大量内存空间的情况。这实际上是Linux系统的内存管理策略,系统尽可能地利用内存,并将空闲内存用作缓存,以提高性能。如果应用程序需要更多内存,系统会立即回收这部分缓存并分配给应用程序使用。因此,这部分被用作缓存的内存通常也被视为可用内存。
然而,如果可用内存变得非常少,系统可能会开始使用交换区(如果配置了的话)。这会增加IO开销,因为数据需要在内存和硬盘之间进行频繁的交换,从而降低系统性能。这种情况通常可以通过观察iostat命令的输出来反映。

sar -n DEV 1
[root@k8s-master-node1 ~]# sar -n DEV 1Linux 3.10.0-1160.90.1.el7.x86_64 (k8s-master-node1) 04/18/2024 _x86_64_ (32 CPU)10:09:43 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s10:09:44 AM veth192a6c8e 715.00 611.00 100.48 42.48 0.00 0.00 0.0010:09:44 AM cni0 3042.00 3417.00 218.57 1091.15 0.00 0.00 0.0010:09:44 AM veth3a7fd825 1755.00 2138.00 115.45 617.26 0.00 0.00 0.0010:09:44 AM br-42f2d512da3f 0.00 0.00 0.00 0.00 0.00 0.00 0.0010:09:44 AM vethad7dead4 3.00 3.00 0.93 0.89 0.00 0.00 0.0010:09:44 AM veth0e090221 1.00 1.00 0.06 0.06 0.00 0.00 0.00...
sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和
参数和字段解释-u:显示CPU利用率。-r:显示内存利用率。-b:显示缓冲区和缓存利用率。-d:显示磁盘活动情况。-n:显示网络活动情况。-q:显示队列长度和负载情况。-W:显示交换活动情况。-f:指定sar数据文件。-s:指定起始时间。-e:指定结束时间。CPU利用率 (-u):%user:用户空间CPU时间的百分比。%nice:以较高优先级运行的用户进程的CPU时间百分比。%system:系统空间CPU时间的百分比。%iowait:等待IO完成的CPU时间百分比。%steal:由于运行另一个虚拟处理器而被虚拟化的CPU时间百分比。%idle:CPU空闲时间的百分比。内存利用率 (-r):kbmemfree:可用内存。kbmemused:已使用的内存。kbbuffers:用作内核缓冲区的内存量。kbcached:用作文件系统缓存的内存量。缓冲区和缓存利用率 (-b):kbmemfree:可用内存。kbmemused:已使用的内存。kbbuffers:用作内核缓冲区的内存量。kbcached:用作文件系统缓存的内存量。磁盘活动情况 (-d):tps:每秒钟的传输率。rd_sec/s:每秒钟从磁盘读取的字节数。wr_sec/s:每秒钟写入磁盘的字节数。await:IO操作的平均等待时间。%util:磁盘的利用率。网络活动情况 (-n):rxpck/s:每秒接收的数据包数。txpck/s:每秒发送的数据包数。rxkB/s:每秒接收的数据量(千字节)。txkB/s:每秒发送的数据量(千字节)。队列长度和负载情况 (-q):runq-sz:运行队列的长度。plist-sz:进程列表的长度。ldavg-1:1分钟的平均负载。交换活动情况 (-W):pswpin/s:每秒钟写入交换区的页面数。pswpout/s:每秒钟从交换区读取的页面数。
具体应用 sar -n TCP,ETCP 1
[root@k8s-master-node1 ~]# sar -n TCP,ETCP 1Linux 3.10.0-1160.90.1.el7.x86_64 (k8s-master-node1) 04/18/2024 _x86_64_ (32 CPU)10:12:55 AM active/s passive/s iseg/s oseg/s10:12:56 AM 3.00 1.00 242.00 240.0010:12:55 AM atmptf/s estres/s retrans/s isegerr/s orsts/s10:12:56 AM 0.00 1.00 1.00 0.00 1.0010:12:56 AM active/s passive/s iseg/s oseg/s10:12:57 AM 18.00 3.00 183.00 196.0010:12:56 AM atmptf/s estres/s retrans/s isegerr/s orsts/s10:12:57 AM 0.00 2.00 0.00 0.00 2.00
sar命令在这里用于查看TCP连接状态,其中包括:
active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
retrans/s:每秒TCP重传数量;
TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

top
~]# toptop - 10:13:18 up 190 days, 16:48, 3 users, load average: 1.39, 1.42, 1.45Tasks: 758 total, 2 running, 756 sleeping, 0 stopped, 0 zombie: 2.7 us, 2.1 sy, 0.0 ni, 94.7 id, 0.2 wa, 0.0 hi, 0.3 si, 0.0 stKiB Mem : 98817584 total, 9888084 free, 36020680 used, 52908816 buff/cacheKiB Swap: 0 total, 0 free, 0 used. 59946632 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND113051 root 20 0 10.7g 43408 13840 S 17.6 0.0 231:14.94 containerd1 root 20 0 193656 6432 2480 S 11.8 0.0 4652:41 systemd35260 root 20 0 162800 2916 1552 R 11.8 0.0 0:00.03 top57565 1010 20 0 228728 151032 1120 S 11.8 0.2 96:47.27 redis-server73325 1010 20 0 136012 8900 2984 S 11.8 0.0 223:35.35 server_ner88836 root 20 0 4586640 140700 22368 S 11.8 0.1 8408:41 kubelet....
top命令是一个功能强大的系统监视工具,它汇总了系统负载、内存使用和CPU利用等多个方面的信息,相当于将多个命令的检查内容整合在一起。通过top命令,你可以全面了解系统的负载来源。另外,top命令还支持按列排序,这意味着你可以轻松地找到内存占用最多或CPU利用率最高的进程。然而,需要注意的是,top命令输出的是瞬时值,如果不持续观察,可能会错过关键信息。为了更好地记录和比对数据,你可能需要暂停top命令的刷新
END

添加博主
微信号|yfq940-
点个关注!!!
原文作者:步步运维步步坑;如有侵权,请联系管理员删除。