zoukankan      html  css  js  c++  java
  • 从数据出发

    从性能数据出发,找到系统的性能瓶颈,进而进行性能优化,是进行性能分析的目的。但遗憾的是,解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡。

    系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过度使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如CPU过度使用会造成大量进程等待CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加(用于进程切换、缺页处理的CPU开销)

    性能瓶颈一般分两大类:硬件瓶颈和软件瓶颈。

    硬件瓶颈

    一些小经验:
    小文件读写的性能瓶颈是磁盘的寻址(随机读写性能更差),评估的标准是tps(每秒传输数)
    大文件读写的性能瓶颈是带宽,评估的标准是持续的读写速度
    Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好

    软件瓶颈

    结合数据监控的命令,重点介绍这部分。

    Vmstat

    vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问切换、CPU使用等。

    Procs
    r:
    运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)
    b:
    处于不可中断状态的进程数,常见的情况是由IO引起的

    Memory
    swpd:切换到交换内存上的内存(默认以KB为单位)
    如果 swpd 的值不为0,或者还比较大,比如超过100M了,但是 si, so 的值长期为 0,这种情况我们可以不用担心,不会影响系统性能。
    free: 空闲的物理内存
    buff: 作为buffer cache的内存,对块设备的读写进行缓冲
    cache: 作为page cache的内存, 文件系统的cache
    如果 cache 的值大的时候,说明cache住的文件数多,如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi 会非常小

    Swap
    si: 交换内存使用,由磁盘调入内存 
    so: 交换内存使用,由内存调入磁盘
    内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响。磁盘IO和CPU资源都会被消耗。
    我们的测试中,很多情况下,swap都是不打开的。

    Io
    bi: 从块设备读入的数据总量(读磁盘) (KB/s)
    bo: 写入到块设备的数据总理(写磁盘) (KB/s)
    随机磁盘读写的时候,这2个 值越大(如超出1M),能看到CPU在IO等待的值也会越大

    System
    in: 每秒产生的中断次数
    cs: 每秒产生的上下文切换次数
    上面这2个值越大,会看到由内核消耗的CPU时间会越多

    Cpu
    us: 用户进程消耗的CPU时间百分比
    us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50% 的使用,那么我们就该考虑优化程序算法或者进行加速了(比如 PHP/Perl)
    sy: 内核进程消耗的CPU时间百分比
    sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。
    wa: IO等待消耗的CPU时间百分比
    wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。
    id: CPU处在空闲状态时间百分比

    关注点:
    Procs r: 运行的进程比较多,系统很繁忙
    Io bo: 磁盘写的数据量稍大,如果是大文件的写,10M以内基本不用担心,如果是小文件写2M以内基本正常
    Cpu us: 持续大于50,服务高峰期可以接受
    Cpu wa: 稍微有些高
    Cpu id:持续小于50,服务高峰期可以接受

    Top

    这个命令可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。它是检查系统进程运行状况最方便的工具了,它默认显示部分活动的进程,并且按照进程使用CPU的多少排序。它可以显示全部CPU的使用状况,也可以显示每个进程都运行在那个CPU上面。

    先看了两个结果图:

    图1:
    图片1.jpg

    图2:
    图片2.jpg

    用 top 看到的内存的说明(Mem的第2行)
    actv 
    active 活跃的内存页,正在映射给进程使用
    in_d
    inactive_dirty 非活跃的内存页,并且内存数据被修改,需要写回磁盘
    in_c
    inactive_clean 非活跃的内存页,干净的数据,可以被重新分配使用

    in_d 和 in_c 以及 cache, buffer 的内存有何不同?
    我的理解: actv, in_d, in_c 是 VM 中对内存的管理组织形式,buffer是块设备读写缓冲,cache是文件系统缓存

    用 top 看到的进程所处的几种状态(STAT列)。
    D 不可中断休眠,通常是 IO 操作所处的状态
    R 正在执行的或者处在等待执行的进程队列中
    S 休眠中
    T 暂停刮起的(比如Ctrl+Z),也可能是被 strace 命令调用中的状态
    Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而被init进程接管进行销毁。
    W 没有使用物理内存,所占用的物理内存被切换到交换内存
    < 高优先级的进程
    N 低优先级
    有时候一个进程会有多个状态的标志,比如SWN,SW

    上面两个图中的关注重点:
    图1)
    Load average: 系统负载有降低的趋势,但仍然较高
    Running: 有3个进程正在运行,正常,因为系统有4颗CPU
    Cpu user: 接近200%了,有些大,服务高峰时可以接受
    Cpu idle: 小于200%了,需要注意
    图2)
    Cpu iowait:接近200%了,很大

    Free

    显示系统内存的使用状况(物理内存和交换内存)。通过这个命令我们可以看到系统进程实际使用的物理内存,buffer和cache使用的物理内存。

    free命令输出的第三行(-/+ buffers/cache)
    这行最容易让人迷惑。
    它显示的第一个值(used这一列)是这样得来的:
    Mem行used列 - Mem行buffers列 - Mem行cached列

    它显示的第二个值(free这一列)是这样得来的:
    Mem行free列 + Mem行buffers列 + Mem行cached列

    通常 buffer 和 cache 可以使用的内存空间越大,系统 IO 和 文件系统访问的性能越好。

    Sar

    sar是很好的实时性能监控和分析工具。

    sar -u命令可以来衡量CPU的总体负载情况。
    可以获得运行用户进程%user,内核进程%system 和空闲状态是CPU时间的百分比。%user越大一般表明服务器处于运行状态;%system越大表明服务器处于系统调用或者I/O操作。如果CPU有大量时间处于空闲状态(%idle),那就说明CPU足够。

    我们还可以获得每个时间段上内核切换当前进程的次数,如果这个数很高,表示服务器硬件有问题。命令:sar -w

    平均负载:
    系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数,一般来说只要每个CPU的当 前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这 台机器的性能有严重问题。

    [root@linux stone]uptime
    18:07:22 up 10 days, 8:05, 1 user, load average: 0.49, 0.31, 1.18
    表示在过去的1、5、15分钟内运行队列中的平均进程数量。

    [root@linux stone]sar -q
    07:50:00 runq-sz plist-sz ldavg-1 ldavg-5
    08:00:00 0 214 0.01 0.08
    08:10:00 0 222 0.37 0.21
    08:20:00 1 229 0.41 0.42
    08:30:00 0 239 0.45 1.10

    runq-sz:等待运行的进程数
    plist-sz:总的进程数(在process list).
    ldavg-1 : 系统最后一分钟的平均负载
    ldavg-5: 系统最后5分钟的平均负载

    Sar同时可以监控内存的使用情况,命令为:sar -r sar -B等等。推荐vmstat或者free监控内存。

    说说IO

    上面说了很多命令的分析方法,但都是cpu和内存方面的,下面说说io方面。

    下面是一些衡量I/O闲忙程度的经用指标:

    磁盘利用率(disk utilization) 
    磁盘队列长度(disk queue length) 
    磁头/逻辑卷的读/写速率(read/write rates per spindle/logical volume) 
    原始I/O(raw I/O):主要用于数据库应用 
    交换队列的长度(swap queue length) 
    缓存命中率(buffer cache hit ratio) 
    网络文件系统和无盘工作站速率(NFS and diskless rates(server))

    I/O资源成为系统性能的瓶颈的征兆:
    当I/O成为瓶颈时,会出现下面这些典型的症状:

    过高的磁盘利用率(high disk utilization) 
    太长的磁盘等待队列(large disk queue length)
    等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O) 
    太高的物理I/O速率:large physical I/O rate(not sufficient in itself) 
    过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself)) 
    太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)

    Iostat

    通过查看tps列的值我们可以知道哪些磁盘比较忙,哪些磁盘比较闲。

    Sar

    通过命令sar -d,我们可以分析系统中的每个磁盘和磁带的活动情况。

    device:设备名; 
    %busy: Portion of time device was busy servicing a request; statistics. 
    avque: Average number of requests outstanding for the device; 
    r+w/s: Number of data transfers per second (read and writes) from and to the device; 
    blks/s: Number of bytes transferred (in 512-byte units) from and to the device; 
    avwait: Average time (in milliseconds) that transfer requests waited idly on queue for the device; 
    avserv: Average time (in milliseconds) to service each transfer request (includes seek, rotational latency, and data transfer times) for the device.

    对结果的分析:

    如果某个磁盘的%busy列的值大于50%,则说明该磁盘可能存在瓶颈; 
    如果某个磁盘的avwait珍的值大于avserv列的值,也说明该磁盘可能存在瓶颈;

    通过命令sar -b,我们可以分析系统中的缓冲区的活动情况。

    bread/s Number of physical reads per second from the disk (or other block devices) to the buffer cache; 
    bwrit/s: Number of physical writes per second from the buffer cache to the disk (or other block device); 
    lread/s: Number of reads per second from buffer cache; 
    lwrit/s: Number of writes per second to buffer cache; 
    %rcache: Buffer cache hit ratio for read requests e.g., 1 - bread/lread; 
    %wcache: Buffer cache hit ratio for write requests e.g., 1 - bwrit/lwrit; 
    pread/s: Number of reads per second from character device using the physio() (raw I/O) mechanism; 
    pwrit/s: Number of writes per second to character device using the physio() (i.e., raw I/O ) mechanism; mechanism.

    对结果的分析:

    如果%rcache列的值小于90%,并且%wcache列的值不在70-70%之间,我们必须观察系统中什么应用在做什么样的读/写操作,我们是否需要增加缓冲欧的大小。

    通过命令sar -w,我们可以分析系统中的交换区的活动情况。

    swpin/s: Number of process swapins per second; 
    swpot/s: Number of process swapouts per second; 
    bswin/s: Number of 512-byte units transferred for swapins per second; 
    bswot/s: Number of 512-byte units transferred for swapouts per second; 
    pswch/s: Number of process context switches per second.

    对结果的分析:

    如果swpin/s的值大于零,那么swpot的值必须引起注意; 
    同时必须注意pswch/s的值,如果很大,说明进程切换频繁

  • 相关阅读:
    ubuntu frp 自编译。本文不能按顺序来 请自己理解
    油猴子 自改脚本 删除页面 div 上下翻页 视频页内全屏 右键可用
    批处理bat 删除指定文件夹下的文件及文件夹
    LUA 静态库 动态库 LD_LIBRARY_PATH 动态库的查找路径 GCC “-l”参数
    delphi 判断奇数偶数
    sf.net
    cmake指定mingw编译器的方法
    关闭delphi ide皮肤
    arch pacman被删除 重装
    delphi 匿名方法访问var参数
  • 原文地址:https://www.cnblogs.com/argb/p/3448653.html
Copyright © 2011-2022 走看看