Linux性能优化和监控系列(二)——分析CPU性能

分析CPU性能bash

top命令提供了监控CPU性能的基本功能, 若是须要更加深刻的挖掘CPU的性能问题, top所提供的信息不足以作到. 因为大多数人认为CPU性能是体现服务器性能的主要因素, 因此在遇到性能问题时, 一般会首先查看CPU的性能来分析服务器的性能问题. 但事实上, 不少状况不是这样的,性能问题多是由跟CPU相关的其余因素引发的, 好比CPU等待I/O资源.对于下面两个task:服务器

Task 1: 架构

dd if=/dev/urandom of=/dev/null

Task 2:app

#!/bin/bash
COUNTER=0
while true
do
    dd if=/dev/urandom of=/root/file.$COUNTER bs=1M count=1
    COUNTER=$(( COUNTER + 1 ))
    [ COUNTER = 1000 ] && exit
done

执行Task 1和Task 2后, sy都会增高, 可是执行Task 2时, wa也会增高, 这说明Task 1和Task 2都会使sy增高, 可是Task 2有时须要等待I/O资源, 因此wa也会增高.
dom


理解CPU性能ide

为了监控CPU到底在作什么, 须要深刻理解Linux内核是怎样工做的, 其中一个重要的组件是运行时队列(run queue), 每一个CPU核有一个运行时队列, 在CPU为进程提供服务时, 进程须要首先进入运行时队列等待CPU分配CPU时间. 运行队列里包括可运行的进程(runnable process)和被阻挡的进程(blocked process). Linux的scheduler根据进程的优先级决定哪一个runnable process运行, blocked process不会竞争CPU时间. top命令的load arverage是全部runnable process和blocked process的负载的整体概述. 若是须要查看哪些进程处于runnable和blocked状态, 能够经过vmstat来查看, 如:性能

[root@rdhl ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3747904  15492  27980    0    0   767     3   28   17  0  1 98  1  0


上下文切换和中断spa

在多任务操做系统中, Linux内核不断在不一样进程之间进行上下文切换, 这种上下文切换须要CPU保存旧进程的上下文信息以及检索上下文信息给新进程, 所以上下文切换对CPU的性能代价是很高的. 减小上下文切换带来的性能问题最好的方法是减小上下文切换的次数, 在多核CPU架构中能够实现, 可是须要确保进程被锁定在指定CPU核上来阻止上下文切换. Linux进程调度器并非进程发生上下文切换的惟一缘由, 另外一个致使上下文切换发生的缘由是硬件中断(hardware interrupts). 进程调度器使用时钟中断(timer interrupt)保证每一个进程能获取公平的CPU时间. 正常状况下上下文切换的次数应该小于时钟中断的次数, 若是发现上下文切换次数比时钟中断次数多, 这种负载多是由系统须要处理不少I/O或者长时间高强度系统调用引发. 所以了解时钟中断和上下文切换的关系对找到引发系统性能问题的缘由提供线索. 使用vmstat -s能够查看系统上下文切换和时钟中断次数, 这对查看高数量的上下文切换和IOWAIT的组合很是有帮助, 经过这能够断定系统试着作大量的写操做, 可是不能. 以下是vmstat -s的输出例子:操作系统

[root@rdhl ~]# vmstat -s
      3924700  total memory
       218964  used memory
        32152  active memory
        43332  inactive memory
      3705736  free memory
        22400  buffer memory
        31492  swap cache
      4063224  total swap
            0  used swap
      4063224  free swap
         7643 non-nice user cpu ticks
            0 nice user cpu ticks
      1390112 system cpu ticks
     15353492 idle cpu ticks
       110105 IO-wait cpu ticks
            0 IRQ cpu ticks
          185 softirq cpu ticks
            0 stolen cpu ticks
     84007231 pages paged in
       333713 pages paged out
            0 pages swapped in
            0 pages swapped out
     16203245 interrupts
      2121904 CPU context switches
   1395818922 boot time
         5780 forks

另外一个查看CPU性能的指标是中断数, 中断数能够从/proc/interrupts查看,/pro/interrupts包含每种类型的中断被处理的次数. 若是中断数很高, 那表示Linux内核花不少时间处理中断而致使只有少部分时间处理其余进程.
orm

[root@rdhl ~]# cat /proc/interrupts
           CPU0       CPU1
  0:        142          0   IO-APIC-edge      timer
  1:          7          1   IO-APIC-edge      i8042
  3:          1          0   IO-APIC-edge
  4:          1          0   IO-APIC-edge
  7:          0          0   IO-APIC-edge      parport0
  8:          0          0   IO-APIC-edge      rtc0
  9:          0          0   IO-APIC-fasteoi   acpi
 12:        108          2   IO-APIC-edge      i8042
 14:          0          0   IO-APIC-edge      ata_piix
 15:        107          1   IO-APIC-edge      ata_piix
 24:          0          0   PCI-MSI-edge      pciehp
 25:          0          0   PCI-MSI-edge      pciehp
 26:          0          0   PCI-MSI-edge      pciehp
 27:          0          0   PCI-MSI-edge      pciehp
 28:          0          0   PCI-MSI-edge      pciehp
 29:          0          0   PCI-MSI-edge      pciehp
 30:          0          0   PCI-MSI-edge      pciehp
 31:          0          0   PCI-MSI-edge      pciehp
 32:          0          0   PCI-MSI-edge      pciehp
 33:          0          0   PCI-MSI-edge      pciehp
 34:          0          0   PCI-MSI-edge      pciehp
 35:          0          0   PCI-MSI-edge      pciehp
 36:          0          0   PCI-MSI-edge      pciehp
 37:          0          0   PCI-MSI-edge      pciehp
 38:          0          0   PCI-MSI-edge      pciehp
 39:          0          0   PCI-MSI-edge      pciehp
 40:          0          0   PCI-MSI-edge      pciehp
 41:          0          0   PCI-MSI-edge      pciehp
 42:          0          0   PCI-MSI-edge      pciehp
 43:          0          0   PCI-MSI-edge      pciehp
 44:          0          0   PCI-MSI-edge      pciehp
 45:          0          0   PCI-MSI-edge      pciehp
 46:          0          0   PCI-MSI-edge      pciehp
 47:          0          0   PCI-MSI-edge      pciehp
 48:          0          0   PCI-MSI-edge      pciehp
 49:          0          0   PCI-MSI-edge      pciehp
 50:          0          0   PCI-MSI-edge      pciehp
 51:          0          0   PCI-MSI-edge      pciehp
 52:          0          0   PCI-MSI-edge      pciehp
 53:          0          0   PCI-MSI-edge      pciehp
 54:          0          0   PCI-MSI-edge      pciehp
 55:          0          0   PCI-MSI-edge      pciehp
 56:       1468     667997   PCI-MSI-edge      vmw_pvscsi
 57:     367182          0   PCI-MSI-edge      eth0-rxtx-0
 58:         13     115039   PCI-MSI-edge      eth0-rxtx-1
 59:          0          0   PCI-MSI-edge      eth0-event-2
NMI:          0          0   Non-maskable interrupts
LOC:   13249018    2561591   Local timer interrupts
SPU:          0          0   Spurious interrupts
PMI:          0          0   Performance monitoring interrupts
IWI:          0          0   IRQ work interrupts
RES:      35986      18866   Rescheduling interrupts
CAL:     298172        228   Function call interrupts
TLB:       1052       2847   TLB shootdowns
TRM:          0          0   Thermal event interrupts
THR:          0          0   Threshold APIC interrupts
MCE:          0          0   Machine check exceptions
MCP:        285        285   Machine check polls
ERR:          0
MIS:          0


使用vmstat

虽然top能监控CPU的大部分信息, 可是不能提供更加详细的CPU信息, 而vmstat能够堪当此任. vmstat有两种使用方式, 一种是sample mode, 在这种方式中, vmstat每一个一段时间获取当前系统信息,  如每隔3秒执行一次, vmstat 3. 另外一种是加-s选项, 在这种方式中, vmstat获取从系统启动后的系通通计信息, 除了CPU信息, 也包含memory, I/O, swap等.

cs
上下文切换次数.
us CPU花在用户空间的时间百分比.
sy
CPU花在系统空间的时间百分比.
id
CPU空闲百分比.
wa
CPU等待I/O的时间百分比.
相关文章
相关标签/搜索