• 自动秒收录
  • 软件:1973
  • 资讯:57983|
  • 收录网站:233899|

IT精英团

如何用十个命令在一分钟内检查Linux服务器性能

如何用十个命令在一分钟内检查Linux服务器性能

浏览次数:
评论次数:
编辑: 乐咏
信息来源: ITPUB
更新日期: 2022-08-04 21:20:11
摘要

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。

  • 正文开始
  • 相关阅读
  • 推荐作品

如果你的Linux服务器负载突然剧增,报警信息会把你的手机打爆,如何在最短的时间内找出Linux性能问题?看看网飞性能工程团队的这篇博文,看看他们通过十个命令在一分钟内诊断出机器性能问题。

概述

通过执行以下命令,您可以在1分钟内大致了解系统资源的使用情况。

正常运行时间

dmesg |尾部

vmstat 1

mpstat -P ALL 1

pidstat 1

iostat -xz 1

自由-m

合成孔径雷达北发展1

sar -n TCP,ETCP 1

顶端

这些命令有些需要安装sysstat包,有些由procps包提供。这些命令的输出有助于快速定位性能瓶颈,并检查所有资源(CPU、内存、磁盘IO等)的利用率、饱和度和错误度量。),也就是所谓的使用方法。

让我们逐一介绍这些命令。有关这些命令的更多参数和描述,请参考命令手册。

uptime

正常运行时间

23:51:26up21:31,1user,1用户,平均负载:30.02,26.43,19.02

该命令可以快速检查机器的负载。在Linux系统中,这些数据代表等待CPU资源的进程数和被不间断阻塞的IO进程数(进程状态D)。这些数据可以让我们从宏观上了解系统资源的使用情况。

该命令的输出分别指示1分钟、5分钟和15分钟的平均负载。通过这三个数据,我们可以知道服务器负载是趋于紧张还是区域性缓解。如果1分钟的平均负载非常高,但是15分钟的平均负载非常低,这意味着服务器处于高负载状态,需要进一步调查CPU资源消耗在哪里。相反,如果15分钟平均负载高,1分钟平均负载低,可能是CPU资源紧缺时刻已经过去。

从上面例子中的输出可以看出,最后一分钟的平均负载非常高,远高于最后15分钟的平均负载,所以我们需要继续检查当前系统中有哪些进程消耗了大量资源。可以通过下面将介绍的vmstat和mpstat等命令进行进一步的研究。

dmesg丨tail

$dmesg|tail

[1880957.563150]perlinvokedoom-killer : GFP _ mask=0x 280 da,order=,oom_score_adj=

[.]

[1880957.563400]内存不足: kill process 18694(perl)score 246 or sacrifice child

[1880957.563408]killed process 18694(perl)total-VM :1972392 kb,anon-rss:1953348kB,file-rss:kB

[2320864.954447]TCP : possiblesynfloodingonport 7001 . dropping request . checksnmpcounters。

该命令将输出系统日志的最后10行。在示例的输出中,您可以看到内核oom终止和TCP数据包丢失。这些日志有助于解决性能问题。别忘了这一步。

vmstat 1

$vmstat1

procs -内存-交换- io -系统- cpu -

rbswpdfreebuffcachesiso

nbsp;   bi    bo   in   cs us sy id wa st
34       200889792  73708 591828                  5    6   10 96  1  3    
32       200889920  73708 591860                592 13284 4282 98  1  1    
32       200890112  73708 591860                   9501 2154 99  1      
32       200889568  73712 591856                 48 11900 2459 99        
32       200890208  73712 591860                   15898 4840 98  1  1    

vmstat(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

$ mpstat -P ALL 1
Linux 3.13.-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle
07:38:50 PM  all  98.47   .00   .75    .00   .00   .00    .00    .00    .00   .78
07:38:50 PM      96.04   .00   2.97    .00   .00   .00    .00    .00    .00   .99
07:38:50 PM    1  97.00   .00   1.00    .00   .00   .00    .00    .00    .00   2.00
07:38:50 PM    2  98.00   .00   1.00    .00   .00   .00    .00    .00    .00   1.00
07:38:50 PM    3  96.97   .00   .00    .00   .00   .00    .00    .00    .00   3.03
[...]

该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。

pidstat 1

$ pidstat 1
Linux 3.13.-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)
07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:03 PM              9    .00    .94    .00    .94     1  rcuos/
07:41:03 PM           4214    5.66    5.66    .00   11.32    15  mesos-slave
07:41:03 PM           4354    .94    .94    .00    1.89     8  java
07:41:03 PM           6521 1596.23    1.89    .00 1598.11    27  java
07:41:03 PM           6564 1571.70    7.55    .00 1579.25    28  java
07:41:03 PM 60004     60154    .94    4.72    .00    5.66     9  pidstat
07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
07:41:04 PM           4214    6.00    2.00    .00    8.00    15  mesos-slave
07:41:04 PM           6521 1590.00    1.00    .00 1591.00    27  java07:41:04 PM           6564 1573.00   10.00    .00 1583.00    28  java
07:41:04 PM   108      6718    1.00    .00    .00    1.00       snmp-pass
07:41:04 PM 60004     60154    1.00    4.00    .00    5.00     9  pidstat

pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见两个JAVA进程占用了将近1600%的CPU时间,既消耗了大约16个CPU核心的运算资源。

iostat-xz 1

$ iostat -xz 1
Linux 3.13.-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          73.96    .00    3.73    .03    .06   22.21
Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda        .00     .23    .21    .18     4.52     2.08    34.37     .00    9.98   13.80    5.42   2.44   .09
xvdb        .01     .00    1.02    8.94   127.97   598.53   145.79     .00    .43    1.78    .28   .25   .25
xvdc        .01     .00    1.02    8.86   127.79   595.94   146.50     .00    .45    1.82    .30   .27   .26
dm-        .00     .00    .69    2.32    10.47    31.69    28.01     .01    3.23    .71    3.98   .13   .04
dm-1        .00     .00    .00    .94     .01     3.78     8.00     .33  345.84    .04  346.81   .01   .00
dm-2        .00     .00    .09    .07     1.35     .36    22.50     .00    2.55    .23    5.62   1.78   .03
[...]

iostat命令主要用于查看机器磁盘IO情况。该命令输出的列,主要含义是:

  • r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。

  • await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。

  • avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。

  • %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

free -m

$ free -m
             total       used       free     shared    buffers     cached
Mem:        245998      24545     221453         83         59        541
-/+ buffers/cache:      23944     222053
Swap:                                

free命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。需要注意的是,第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。

如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。

sar -n DEV 1

$ sar -n DEV 1
Linux 3.13.-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU)
12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:16:49 AM      eth  18763.00   5032.00  20686.42    478.30      .00      .00      .00      .00
12:16:49 AM        lo     14.00     14.00      1.36      1.36      .00      .00      .00      .00
12:16:49 AM   docker      .00      .00      .00      .00      .00      .00      .00      .00
12:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
12:16:50 AM      eth  19763.00   5101.00  21999.10    482.56      .00      .00      .00      .00
12:16:50 AM        lo     20.00     20.00      3.25      3.25      .00      .00      .00      .00
12:16:50 AM   docker      .00      .00      .00      .00      .00      .00      .00      .00

sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。如示例输出中,eth0网卡设备,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,没有达到1Gbit/sec的硬件上限。

sar -n TCP,ETCP 1

$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU)
12:17:19 AM  active/s passive/s    iseg/s    oseg/s
12:17:20 AM      1.00      0.00  10233.00  18846.00
12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:17:20 AM      0.00      0.00      0.00      0.00      0.00
12:17:20 AM  active/s passive/s    iseg/s    oseg/s
12:17:21 AM      1.00      0.00   8359.00   6039.00
12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s
12:17:21 AM      0.00      0.00      0.00      0.00      0.00

sar命令在这里用于查看TCP连接状态,其中包括:

  • active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;

  • passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;

  • retrans/s:每秒TCP重传数量;

TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

top

$ top
top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92
Tasks: 871 total,   1 running, 868 sleeping,    stopped,   2 zombie
%Cpu(s): 96.8 us,  0.4 sy,  0.0 ni,  2.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers
KiB Swap:         total,         used,         free.   554208 cached Mem
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 20248 root      20     0.227t 0.012t  18748 S  3090  5.2  29812:58 java
  4213 root      20    2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave
 66128 titancl+  20      24344   2332   1172 R   1.0  0.0   :00.07 top
  5235 root      20    38.227g 547004  49996 S   0.7  0.2   2:02.74 java
  4299 root      20    20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java     1 root      20      33620   2920   1496 S   0.0  0.0   :03.82 init
     2 root      20                       S   0.0  0.0   :00.02 kthreadd
     3 root      20                       S   0.0  0.0   :05.35 ksoftirqd/
     5 root        -20                    S   0.0  0.0   :00.00 kworker/:H
     6 root      20                       S   0.0  0.0   :06.94 kworker/u256:
     8 root      20                       S   0.0  0.0   2:38.05 rcu_sched

top命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统CPU使用情况(vmstat)等。因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

但是,top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。

总结

排查Linux服务器性能问题还有很多工具,上面介绍的一些命令,可以帮助我们快速的定位问题。例如前面的示例输出,多个证据证明有JAVA进程占用了大量CPU资源,之后的性能调优就可以针对应用程序进行。




标签:命令 负载 性能
理解Kubernetes集群中的服务通信
« 上一篇 2022-08-04
  • 理解Kubernetes集群中的服务通信
    0阅读 0条评论 个赞
    深入了解支持服务间通信的3个原生K8s对象:ClusterIPService、DNS和Kube-Proxy。概述传统的服务到服务通信在进入Kubernetes生态系统之前,快速了解一……
  • 超大型金融机构国内数据库综合迁移的成功实践
    0阅读 0条评论 个赞
    刘伟光阿里巴巴集团副总裁阿里云智能新金融&互联网事业部总经理导语2021年9月,某超大型金融机构圆满实现最后一个规模高达20TB+核心数据库的全面迁移改造工作,也为后续向云原生多活架构演进打下了坚实的……
  • 5个鲜为人知的Linux终端技巧和实验
    0阅读 0条评论 个赞
    程序员通常倾向于使用命令行界面而不是图形界面来进行与编程相关的活动。尽管大多数GUI都提供键盘快捷键,但我们在使用GUI时经常需要多次单击鼠标和移动。另一方面,CLI交互激励开发人员通过始终……
  • AI降维来袭 世界上几乎所有已知的蛋白质结构都是开源的!
    1阅读 0条评论 个赞
    转自:机器之心科学界已知的几乎所有蛋白质结构,都在这里了。蛋白质是生命的基础构件,它们由氨基酸链组成,折叠成不同的复杂形状。蛋白质的功能通常由其3D结构决定。如果我们了解蛋白质的折叠方式,就可以开……
  • 解决常见的前端问题:竞争条件
    0阅读 0条评论 个赞
    以下文章来源于公众号-腾讯IMWeb前端团队,作者fly|导语竞态条件一词翻译自英语"raceconditions"。当我们在开发前端web时,最常见的逻辑就是从后台服务器获取并处理数据然后……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
最近发布资讯
更多