• 性能分析指标学习总结


    处理器指标

    • CPU利用率(CPU utilization)

      • top
    • 用户时间(User time)

    • 系统时间(System time)

    • 等待(Waiting)

    • 空闲时间(Idle time)

    • Nice时间(Nice time)

      • 低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间
    • 平均负载(Load average)

    平均负载不是百分比,是下面的和的滚动平均值: 在队列中等待被处理的进程数 等待非中断任务完成的进程数 是TASK_RUNNING和TASK_UNINTERRUPTIBLE的和的平均值。

    平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数

    • 可运行进程(Runable processes)

    • 阻塞的(Blocked)

    • 上下文切换(Context switch)

      • 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
      • 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
      • 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
    • 中断(Interrupts):Linux 中的中断处理程序分为上半部和下半部

      1. 上半部对应硬件中断,用来快速处理中断。

        由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。

      2. 下半部对应软中断(softirq),用来异步处理上半部未完成的工作,通常以内核线程的方式运行(内核线程是 ksoftirqd/CPU编号 )。

        Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。

        • 某个软中断高的案例
          1. top发现软中断si很高
          2. vmstat 确认中断很高
          3. watch cat proc/softirqs 查看那个软中断变化最快,发现是网络接受最多
          4. sar 查看哪个网口接受数据包最多
          5. tcpdump 抓包80端口,发现全是S(sync)包
          6. 确定是SYN FLOOD
      • 进程缺页中断
        • 主缺页异常(majflt):需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常,如果 MAJFLT 过大,很可能是内存不足。

        • 次缺页异常(minflt):可以直接从物理内存中分配时,被称为次缺页异,常如果 MINFLT 过大,很可能是频繁分配 / 释放大块内存 (128k) , malloc 使用 mmap 来分配。对于这种情况,可通过 mallopt(M_MMAP_THRESHOLD, <SIZE>) 增大临界值,或程序实现内存池。

          # 查看某进程主次缺页中断情况
          ps -o majflt,minflt -C mysqld
          MAJFLT MINFLT
          144856 15296294
          
          # 查看系统内存页面变化情况
          # fault/s 每秒缺页中断次数(major + minor) majflt/s 每秒主缺页中断次数
          sar -B 1
          
    • 提高CPU缓存命中率

    • 命令

      perf record -ag -- sleep 5;perf report
      
      # 看各进程CPU使用情况
      pidstat -u 1
      
      
    • CPU性能优化思路-方法论

      1. 性能优化的效果判断 
        三步走理论

        1. 确定性能的量化指标-一般从应用程序纬度和系统资源纬度分析
        2. 测试优化前的性能指标
        3. 测试性能优化后的性能指标
      2. 当性能问题有多个时,优先级问题 
        先优化最重要的且最大程度提升性能的问题开始优化

      3. 优化方法有多个时,该如何选 
        综合多方面因素

      4. CPU优化

        • 应用程序优化:排除不必要工作,只留核心逻辑

          1. 减少循环次数 减少递归 减少动态内存分配
          2. 编译器优化
          3. 算法优化
          4. 异步处理
          5. 多线程代替多进程
          6. 缓存系统优化:利用CPU缓存本地性,加速缓存访问;
        • 控制进程的cpu使用情况,减少程序的处理速度

          1. CPU绑定
          2. CPU独占
          3. 优先级调整
          4. 为进程设置资源限制
          5. NUMA优化
          6. 中断负载均衡
      5. 很重要的一点:切记勿过早优化

    内存指标

    • 空闲内存(Free memory)

    • 缓冲和缓存(Buffer and cache)

      • Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中
        1. Buffers 是对原始磁盘块的临时存储,也就是用来缓存将读取和写入磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。
        2. Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取和写入文件的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。
        3. SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。
      • 命令
      # 清buffer和Cache
      echo 3 > /proc/sys/vm/drop_caches
      
      • kswapd0 回收内存机制

        剩余内存小于页低阈值( watermark ),会触发内存的回收。这个页低阈值,可以通过内核选项 /proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最小阈值计算生成的,计算方法如下 :

        pages_low = pages_min*5/4
        pages_high = pages_min*3/2
        

        与zone相关的内存信息在 /proc/zoneinfo 可以看到,pages 处的 min、low、high,就是上面提到的三个内存阈值,而 free 是剩余内存页数,它跟后面的 nr_free_pages 相同。nr_zone_active_anon 和 nr_zone_inactive_anon,分别是活跃和非活跃的匿名页数。nr_zone_active_file 和 nr_zone_inactive_file,分别是活跃和非活跃的文件页数。

        当剩余内存大于页 高阈值,此时的 kswapd0 不会 回收内存。

        回收的内存指的回收文件页和匿名页。对文件页的回收,当然就是直接释放挂回到伙伴系统,或者把脏页写回磁盘后再回收。而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存。

        Linux 提供了一个 /proc/sys/vm/swappiness 选项,用来调整使用 Swap 的积极程度。swappiness 的范围是 0-100,数值越大,越积极使用 Swap,也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页。swappiness 并不是内存的百分比,而是调整 Swap 积极程度的权重,即使你把它设置成 0,当 剩余内存 + 文件页小于页高阈值 时,还是会发生 Swap。

      • 匿名页

        没有文件背景的页面,为匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的swap交换分区或使用交换文件进行交换。即上面wap作为名词的意思。Swap分区可以将不活跃的页交换到硬盘中,缓解内存紧张。

    • Swap使用(Swap usage)

      通过查看空闲内存是否低于内存高水位值判断当前是否有 swap 发生

      watch -d grep -A 15 'Normal' /proc/zoneinfo
      

      可以通过查看 vmstat 1 或者 sar -r -S 1 查看系统磁盘缓存buffer和文件缓存cache使用情况,然后通过 top 找出使用最大内存的进程 或者 cachetop 找出使用缓存最多的进程,可定位问题

      定位问题后,可以根据 /proc/<pid>/status 中的 VmSwap 找出内存被强制 swap 换出的进程以及对应被换出的内存大小

      # 按 VmSwap 使用量对进程排序,输出进程名称、进程 ID 以及 SWAP 用量
      $ for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head
      # 输出:
      $ Xorg 948 17692 kB
      $ mysqld 4321 9972 kB
      $ docker-containe 1029 4280 kB
      $ dockerd 998 2008 kB
      $ NetworkManager 823 1404 kB
      $ lightdm 925 808 kB
      $ lightdm 1125 752 kB
      
    • Slabs

    • 活动和非活动内存

    • 命令

      # 看各进程内存使用情况
      pidstat -r 1
      

    网络指标

    • 接收和发送的包(Packets received and sent)
    • 接收和发送的字节(Bytes received and sent)
    • 每秒碰撞(collisions per second)
    • 丢包
    • 过载(Overruns)
    • 错误(Errors)

    块设备指标

    • IO等待(Iowait)
    • 平均队列长度(Average queue length) 未完成的I/O请求数量。
    • 平均等待(Average wait)
    • 每秒传输(Transfers per second)
    • 每秒读写块(Blocks read/write per second)
    • 每秒读写的千字节(Kilobytes per second read/write)
    • 命令
      # 看各进程磁盘IO读写情况
      pidstat -d 1
      

    相关命令

    • execsnoop,它可以实时监控进程调用的外部命令

    各介质读取速度

    介质/方式速度
    L1 cache reference 读取CPU的一级缓存 0.5 ns
    Branch mispredict(转移、分支预测) 5 ns
    L2 cache reference 读取CPU的二级缓存 7 ns
    Mutex lock/unlock 互斥锁解锁 100 ns
    Main memory reference 读取内存数据 100 ns
    Compress 1K bytes with Zippy 1k字节压缩 10 us
    Send 2K bytes over 1 Gbps network 在1Gbps的网络上发送2k字节 20 us
    Read 1 MB sequentially from memory 从内存顺序读取1MB 250 us
    Round trip within same datacenter 从一个数据中心往返一次,ping一下 500 us
    Disk seek 磁盘搜索 10 ms
    Read 1 MB sequentially from network 从网络上顺序读取1兆的数据 10 ms
    Read 1 MB sequentially from disk 从磁盘里面读出1MB 30 ms
    Send packet CA->Netherlands->CA 一个包的一次远程访问 150 ms

    其它了解和备忘

    • CPU 常见架构
      • SMP (Symmetric Multiprocessing) , 对称多处理器. 顾名思义, 在SMP中所有的处理器都是对等的, 它们通过总线连接共享同一块物理内存,这也就导致了系统中所有资源(CPU、内存、I/O等)都是共享的,当我们打开服务器的背板盖,如果发现有多个cpu的槽位,但是却连接到同一个内存插槽的位置,那一般就是smp架构的服务器,日常中常见的pc啊,笔记本啊,手机还有一些老的服务器都是这个架构,其架构简单,但是拓展性能非常差,从linux 上也能看到:

        ls /sys/devices/system/node/# 如果只看到一个node0 那就是smp架构
        # 可以看到只有仅仅一个node,经过大神们的测试发现,2至4个CPU比较适合smp架构。
        
      • NUMA ( Non-Uniform Memory Access),非均匀访问存储模型,这种模型的是为了解决smp扩容性很差而提出的技术方案,如果说smp 相当于多个cpu 连接一个内存池导致请求经常发生冲突的话,numa 就是将cpu的资源分开,以node 为单位进行切割,每个node 里有着独有的core ,memory 等资源,这也就导致了cpu在性能使用上的提升,但是同样存在问题就是2个node 之间的资源交互非常慢,当cpu增多的情况下,性能提升的幅度并不是很高。所以可以看到很多明明有很多core的服务器却只有2个node区。

      • MPP (Massive Parallel Processing) ,这个其实可以理解为刀片服务器,每个刀扇里的都是一台独立的smp架构服务器,且每个刀扇之间均有高性能的网络设备进行交互,保证了smp服务器之间的数据传输性能。相比numa 来说更适合大规模的计算,唯一不足的是,当其中的smp 节点增多的情况下,与之对应的计算管理系统也需要相对应的提高。

  • 相关阅读:
    4.2Python数据类型(2)之布尔类型
    4.1Python数据类型(1)之数值类型
    AvalonJS+MVVM实战部分源码
    数据库的总结
    面向对象的Java实现
    静态HTML总结
    JS总结
    JSP开发Web应用系统
    使用C#开发数据库应用程序
    深入.NET平台和C#编程
  • 原文地址:https://www.cnblogs.com/varXinYuan/p/10865312.html
Copyright © 2020-2023  润新知