性能分析指标学习总结

处理器指标

  • 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 节点增多的情况下,与之对应的计算管理系统也需要相对应的提高。

猜你喜欢

转载自www.cnblogs.com/varXinYuan/p/10865312.html