美文网首页
Linux服务器性能排查

Linux服务器性能排查

作者: Rick617 | 来源:发表于2017-12-19 17:22 被阅读0次

    常见工作中,计算机系统的资源主要包括CPU内存磁盘I/O以及网络,过度使用这些资源将使系统陷入困境。当上述服务器系统资源中的任何一个遭遇瓶颈,都会带来服务器性能的下降,典型的症状就是系统运行迟缓。

    CPU

    查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数:

    • 可运行:运行态,占用CPU,或就绪态,等待CPU调度。
    • 不可打扰:阻塞,正在等待I/O
    CPU诊断常用方法
    1. 使用uptime查看系统负载

    这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。

    命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

    1. top命令

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

    1. sar命令查看CPU、内存和磁盘记录

    默认情况下,sar命令显示当天的统计信息,不带参数显示CPU统计信息,参数-r显示收集的内存记录,-b显示磁盘I/O;

    sar命令同样来自sysstat工具包,可以记录系统的CPU负载、I/O状况和内存使用记录,便于历史数据的回放。

    排查思路:

    CPU 占用率高很多情况下意味着一些东西,这也给服务器 CPU 使用率过高情况下指明了相应地排查思路:

    • 当 user 占用率过高的时候,通常是某些个别的进程占用了大量的 CPU,这时候很容易通过 top 找到该程序;此时如果怀疑程序异常,可以通过 perf 等思路找出热点调用函数来进一步排查;
    • 当 system 占用率过高的时候,如果 IO 操作(包括终端 IO)比较多,可能会造成这部分的 CPU 占用率高,比如在 file server、database server 等类型的服务器上,否则(比如>20%)很可能有些部分的内核、驱动模块有问题;
    • 当 nice 占用率过高的时候,通常是有意行为,当进程的发起者知道某些进程占用较高的 CPU,会设置其 nice 值确保不会淹没其他进程对 CPU 的使用请求;
    • 当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成;
    • 当 irq/softirq 占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查 /proc/interrupts 文件来深究问题所在;

    内存

    我们可以从以下几个角度介绍Linux系统内存相关的排查。

    1. 内存的使用率如何查看,使用率真的很高吗

    2. 内存用在哪里了

    3. 内存优化可以有哪些手段

    内存诊断常用方法
    1. 内存硬件查看
    $ dmidecode -t memory
    
    1. 内存的大体使用情况
    free -m/-h
    free命令用来查看系统内存的整体使用情况。
    
    1. 哪些进程消耗内存比较多
    top
    top命令用来查看具体进程消耗的内存空间百分比。
    
    vmstat 1
    该命令会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息。
    

    I/O

    当磁盘无法写入的时候,一般有以下可能:

    • 文件系统只读
    • 磁盘已满
    • I节点使用完
    I/O诊断常用方法
    1. 遇到只读的文件系统

    文件系统自动设置成只读可能是系统自我保护的一种机制,因此需要实现弄清究竟是什么原因造成了文件系统的只读。如果想要改变文件系统的只读属性,重新挂载目标分区即可。

    1. 磁盘满

    磁盘使用率、剩余空间等可以使用 df 命令查看。

    1. I节点不足

    当df显示磁盘空间充足,但文件系统却报错自己已满,无法写入时,需要检查是否耗尽了I节点。

    在系统中创建一个新文件将会获得一个唯一的I节点,一旦把I节点用光,就无法再创建新的文件了,这在系统创建大量文件时才有可能发生,使用 df -i 命令可以查看I节点的使用情况。

    1. iostat命令

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

    r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
    
    await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。
    如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
    
    avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
    
    %util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。
    如果到达100%,说明硬件设备已经饱和。
    如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。
    值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。
    

    网络

    网络排查一般是有一定的思路和顺序的,其实排查的思路就是根据具体的问题逐段排除故障可能发生的地方,最终确定问题。

    所以首先要问一问,网络问题是什么,是不通,还是慢?

    1. 如果是网络不通,要定位具体的问题,一般是不断尝试排除不可能故障的地方,最终定位问题根源。一般需要查看:
    * 是否接入到链路
    
    * 是否启用了相应的网卡
    
    * 本地网络是否连接
    
    * DNS故障
    
    * 能否路由到目标主机
    
    * 远程端口是否开放
    
    1. 如果是网络速度慢,一般有以下几个方式定位问题源:
    * DNS是否是问题的源头
    
    * 查看路由过程中哪些节点是瓶颈
    
    * 查看带宽的使用情况
    
    网络诊断常用方法
    1. 网卡是否工作,包括硬件和驱动:lspci,dmesg

    2. IP参数是否正确设置:ifconfig

    3. 局域网内通信是否正常:ping

    4. 路由信息是否正常:route -n

    5. DNS状态:dig, nslookup

    6. 路由节点状况与延时:traceroute

    7. 服务监听端口:netstat -lnp

    8. 防火墙:iptables, SELinux

    常用命令讲解

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

    • uptime
    • dmesg | tail
    • vmstat 1
    • mpstat -P ALL 1
    • pidstat 1
    • iostat -xz 1
    • free -m
    • sar -n DEV 1
    • sar -n TCP,ETCP 1
    • top

    其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量。

    下面我们来逐一介绍下这些命令,有关这些命令更多的参数和说明,请参照命令的手册。

    uptime

    这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。

    命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

    dmesg | tail

    该命令会输出系统日志的最后10行。

    vmstat 1

    该命令会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数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。
    

    mpstat -P ALL 1

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

    pidstat 1

    pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。

    iostat -xz 1

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

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

    sar -n DEV 1

    sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。

    sar -n TCP,ETCP 1

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

    active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;
    
    passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;
    
    retrans/s:每秒TCP重传数量;
    

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

    top

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

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

    相关文章

      网友评论

          本文标题:Linux服务器性能排查

          本文链接:https://www.haomeiwen.com/subject/mhpmwxtx.html