ITPub博客

首页 > 数据库 > 数据库开发技术 > 如何让你三分钟了解到系统性能情况

如何让你三分钟了解到系统性能情况

原创 数据库开发技术 作者:步步运维步步坑 时间:2024-04-18 12:30:00 0 删除 编辑

如果你的服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出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 ~]# uptime 09: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 

[root@k8s-master-node1 ~]# dmesg | tail [16473592.548039] IPv6: ADDRCONF(NETDEV_UP): veth0405b3b: link is not ready[16473592.548042] br-6c878d64ce7f: port 7(veth0405b3b) entered blocking state[16473592.548044] br-6c878d64ce7f: port 7(veth0405b3b) entered forwarding state[16473592.548615] br-6c878d64ce7f: port 7(veth0405b3b) entered disabled state[16473592.683888] IPVS: Creating netns size=2048 id=1206[16473592.873102] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready[16473592.873608] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready[16473592.873715] IPv6: ADDRCONF(NETDEV_CHANGE): veth0405b3b: link becomes ready[16473592.873917] br-6c878d64ce7f: port 7(veth0405b3b) entered blocking state[16473592.873920] br-6c878d64ce7f: port 7(veth0405b3b) entered forwarding state[root@k8s-master-node1 ~]# 

这个命令可以显示系统日志的最后10行,示例中的输出包括了一次内核的OOM(Out of Memory)kill以及一次TCP丢包。这些日志对于排查系统性能问题至关重要,因此务必不要忽略这一步。

vmstat 1 

[root@k8s-master-node1 ~]# 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 2  0      0 9151316 501988 52385724    0    0     1    56    0    0  2  2 96  0  0 0  0      0 9149860 501992 52385796    0    0     0   440 82334 142021  3  3 94  0  0 0  0      0 9149780 501992 52385744    0    0     0   284 77161 137741  1  1 98  0  0 1  0      0 9146768 501996 52385744    0    0     0   516 91386 153985  4  2 94  0  0 6  0      0 9145004 501996 52385780    0    0     0   300 88535 149407  2  2 96  0  0 1  0      0 9147712 501996 52385784    0    0     0   352 89493 149028  3  2 95  0  0 2  0      0 9147172 501996 52385792    0    0     0   256 80757 140743  2  1 97  0  0 2  0      0 9144564 502000 52385796    0    0     0   536 89887 150353  2  2 95  0  0 1  0      0 9146208 502000 52385808    0    0     0   464 92529 155185  3  2 94  0  0 0  0      0 9148888 502000 52385820    0    0     0   260 82309 143054  4  2 94  0  0 0  0      0 9147188 502000 52385856    0    0     0   456 73555 134222  2  2 96  0  0 2  0      0 9149372 502008 52385848    0    0     0   392 77921 138347  3  2 94  0  0 1  0      0 9148968 502008 52385852    0    0     0   316 78868 139650  2  2 97  0  0 1  1      0 9146776 502008 52385868    0    0     0   416 82080 143668  3  2 94  0  0 0  0      0 9146112 502008 52385888    0    0     0   376 88744 154722  3  2 95  0  0^C[root@k8s-master-node1 ~]# 

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 1 Linux 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  进程ID%usr  进程在用户态所使用的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   %idle           2.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

[root@k8s-master-node1 ~]# free -m              total        used        free      shared  buff/cache   availableMem:          96501       35915        8682        2330       51903       57610Swap:             0           0           0[root@k8s-master-node1 ~]# 

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 1 Linux 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.00
10: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.00
10:12:56 AM active/s passive/s iseg/s oseg/s10:12:57 AM 18.00 3.00 183.00 196.00
10: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

[root@k8s-master-node1 ~]# top top - 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%Cpu(s):  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 Mem 
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 113051 root 20 0 10.7g 43408 13840 S 17.6 0.0 231:14.94 containerd 1 root 20 0 193656 6432 2480 S 11.8 0.0 4652:41 systemd 35260 root 20 0 162800 2916 1552 R 11.8 0.0 0:00.03 top 57565 1010 20 0 228728 151032 1120 S 11.8 0.2 96:47.27 redis-server 73325 1010 20 0 136012 8900 2984 S 11.8 0.0 223:35.35 server_ner 88836 root 20 0 4586640 140700 22368 S 11.8 0.1 8408:41 kubelet ....

top命令是一个功能强大的系统监视工具,它汇总了系统负载、内存使用和CPU利用等多个方面的信息,相当于将多个命令的检查内容整合在一起。通过top命令,你可以全面了解系统的负载来源。另外,top命令还支持按列排序,这意味着你可以轻松地找到内存占用最多或CPU利用率最高的进程。然而,需要注意的是,top命令输出的是瞬时值,如果不持续观察,可能会错过关键信息。为了更好地记录和比对数据,你可能需要暂停top命令的刷新

END


添加博主

微信号|yfq940-


点个关注!!!


原文作者:步步运维步步坑;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-10-08

  • 博文量
    100
  • 访问量
    51706