关于Linux性能调优中系统CPU监测信息统计的一些笔记

Posted 山河已无恙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Linux性能调优中系统CPU监测信息统计的一些笔记相关的知识,希望对你有一定的参考价值。

写在前面


  • 博文内容部分参考于《Linux性能优化》中文版一书,学习后记录,感兴趣小伙伴可以支持下译者
  • 博文涉及内容:
    • CPU相关的基础指标的解释:运行队列,平均负载,上下文切换,中断,CPU使用率
    • CPU监控信息统计的常用工具中关于CPU信息的统计方式:
      • vmstat
      • mpstat
      • sar
      • top(3.0)

人总是害怕去追求自己最重要的梦想,因为他们觉得自己不配拥有,或者觉得自己没有能力去完成。 ——保罗.柯艾略《牧羊少年奇幻之旅》


CPU相关的基础指标

运行队列统计

在Linux中,一个进程有可运行的,阻塞的(正在等待一个事件的完成)两种情况。阻塞进程可能在等待的是从I/O设备来的数据,或者是系统调用的结果。

如果进程是可运行的,那就意味着它要和其他也是可运行的进程竞争CPU时间。一个可运行的进程不一定会使用CPU,但是当Linux调度器决定下一个要运行的进程时,它会从可运行进程队列中挑选

如果进程是可运行的,同时又在等待使用处理器,这些进程就构成了运行队列。运行队列越长,处于等待状态的进程就越多 性能工具通常会给出可运行的进程个数和等待I/O的阻塞进程个数。

平均负载

系统的负载是指正在运行和可运行的进程总数。比如,如果正在运行的进程为两个,而可运行的进程为三个,那么系统负载就是5,平均负载是给定时间内的负载量。

上下文切换

制造出给定单处理器同时运行多个任务的假象, Linux内核就要不断地在不同的进程间切换。这种不同进程间的切换称为上下文切换

上下文切换时, CPU要保存旧进程的所有上下文信息,并取出新进程的所有上下文信息。上下文中包含了Linux跟踪新进程的大量信息,其中包括: 进程正在执行的指令,分配给进程的内存,进程打开的文件等

上下文切换涉及大量信息的移动,上下文切换的开销可以是相当大的

上下文切换可以是内核调度的结果。为了保证公平地给每个进程分配处理器时间,内核周期性地中断正在运行的进程, 在适当的情况下,内核调度器会决定开始另一个进程,而不是让当前进程继续执行。每次这种周期性中断或定时发生时,系统都可能进行上下文切换。每秒定时中断的次数与架构和内核版本有关

一个检查中断频率的简单方法是用/proc/interrupts文件,它可以确定已知时长内发生的中断次数

┌──[root@vms81.liruilongs.github.io]-[~]
└─$cat /proc/interrupts  | grep time; sleep 5 ;cat /proc/interrupts | grep time
   0:        337          0   IO-APIC-edge      timer
 LOC:    9896498    9871317   Local timer interrupts
   0:        337          0   IO-APIC-edge      timer
 LOC:    9901529    9876213   Local timer interrupts
┌──[root@vms81.liruilongs.github.io]-[~]
└─$

上面定时器的启动频率为(9896498-9901529)/5 =1000,即每秒要终端1000次,同时也可以理解为内核为sleep进程分配了1000次CPU,

如果你的上下文切换明显多于定时器中断,那么这些切换极有可能是由I/O请求或其他长时间运行的系统调用(如休眠)造成的。当应用请求的操作不能立即完成时,内核启动该操作,保存请求进程,并尝试切换到另一个已就绪进程。这能让处理器尽量保持忙状态。

中断

处理器还周期性地从硬件设备接收中断。当设备有事件需要内核处理时,它通常就会触发这些中断。

比如,如果磁盘控制器刚刚完成从驱动器取数据块的操作,并准备好提供给内核,那么磁盘控制器就会触发一个中断。对内核收到的每个中断,如果已经有相应的已注册的中断处理程序,就运行该程序,否则将忽略这个中断。

中断处理程序在系统中具有很高的运行优先级,并且通常执行速度也很快。查看/proc/interrupts文件可以显示出哪些CPU上触发了哪些中断。

┌──[root@vms81.liruilongs.github.io]-[~]
└─$cat /proc/interrupts
            CPU0       CPU1
   0:        337          0   IO-APIC-edge      timer
   1:         10          0   IO-APIC-edge      i8042
   8:          1          0   IO-APIC-edge      rtc0
   9:          0          0   IO-APIC-fasteoi   acpi
  12:         16          0   IO-APIC-edge      i8042
  14:          0          0   IO-APIC-edge      ata_piix
  15:          0          0   IO-APIC-edge      ata_piix
  17:      57939          0   IO-APIC-fasteoi   ioc0
  18:         14       9800   IO-APIC-fasteoi   ens32
  24:          0          0   PCI-MSI-edge      PCIe PME, pciehp
  25:          0          0   PCI-MSI-edge      PCIe PME, pciehp
  26:          0          0   PCI-MSI-edge      PCIe PME, pciehp
  27:          0          0   PCI-MSI-edge      PCIe PME, pciehp
.......................
 THR:          0          0   Threshold APIC interrupts
 DFR:          0          0   Deferred Error APIC interrupts
 MCE:          0          0   Machine check exceptions
 MCP:         37         37   Machine check polls
 ERR:          0
 MIS:          0
 PIN:          0          0   Posted-interrupt notification event
 PIW:          0          0   Posted-interrupt wakeup event
┌──[root@vms81.liruilongs.github.io]-[~]
└─$

CPU使用率

在任何给定的时间, CPU可以执行以下七件事情中的一个
CPU可以是空闲的,这意味着处理器实际上没有做任何工作,并且等待有任务可以执行。
CPU可以运行用户代码,即指定的“用户”时间。
CPU可以执行Linux内核中的应用程序代码,这就是“系统”时间。
CPU可以执行“比较友好”的或者优先级被设置为低于一般进程的用户代码
CPU可以处于iowait状态,即系统正在等待10 (如磁盘或网络)完成。
CPU可以处于irq状态,即它正在用高优先级代码处理硬件中断。
CPU可以处于softirq模式,即系统正在执行同样由中断触发的内核代码,只不过其运行于较低优先级(下半部代码)

一个具有 高“系统”百分比 的系统表明其大部分时间都消耗在了内核上。像oprofile一样的工具可以帮助确定时间都消耗在了哪里。具有 高“用户”时间 的系统则将其大部分时间都用来运行应用程序。

CPU监控信息统计

vmstat (虚拟内存统计)

vmstat是一个很有用的命令,它能获取整个系统性能的粗略信息,包括:

  • 正在运行的进程个数
  • CPU的使用情况
  • CPU接收的中断个数
  • 调度器执行的上下文切换次数

语法

┌──(liruilong㉿Liruilong)-[/mnt/c/Users/lenovo]
└─$ vmstat -help

Usage:
 vmstat [options] [delay [count]]

Options:
 -a, --active           active/inactive memory
 -f, --forks            number of forks since boot
 -m, --slabs            slabinfo
 -n, --one-header       do not redisplay header
 -s, --stats            event counter statistics
 -d, --disk             disk statistics
 -D, --disk-sum         summarize disk statistics
 -p, --partition <dev>  partition specific statistics
 -S, --unit <char>      define display unit
 -w, --wide             wide output
 -t, --timestamp        show timestamp

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see vmstat(8).

┌──(liruilong㉿Liruilong)-[/mnt/c/Users/lenovo]
└─$

CPU性能相关的选项

$vmstat [-n] [-s] [delay [count ]]

vmstat运行于两种模式:采样模式平均模式。如果不指定参数,则vmstat统计运行于平均模式下.

vmstat显示从系统启动以来所有统计数据的均值。但是,如果指定了延迟,那么第一个采样仍然是系统启动以来的均值,但之后vmstat按延迟秒数采样系统并显示统计数据。

参数

-n 参数的区别

┌──[root@vms81.liruilongs.github.io]-[~]
└─$vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 1064772   2072 1764796    0    0    60    26 1501  832  8  4 87  1  0
 0  0      0 1064964   2072 1764800    0    0     0    70 2993 4939 19  8 73  0  0
 0  0      0 1064400   2072 1764800    0    0     0     0 2832 6916 24 10 66  0  0
..............
 0  0      0 1064156   2072 1764952    0    0     0    32 2449 3900  3  2 95  0  0
 0  0      0 1064196   2072 1764860    0    0     0    16 2647 4124  6  2 91  0  0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 1058828   2072 1764860    0    0     0    24 3121 5182  8  4 88  0  0
 1  0      0 1064608   2072 1764820    0    0     0     0 3070 5297 10  6 83  0  0
 0  0      0 1064608   2072 1764820    0    0     0    32 2674 4136  3  2 95  0  0
 0  0      0 1064296   2072 1764820    0    0     0     0 2560 3943  3  1 95  0  0
^C
┌──[root@vms81.liruilongs.github.io]-[~]
└─$vmstat -n  1
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 1063952   2072 1764808    0    0    59    26 1501  838  8  4 87  1  0
 7  0      0 1064472   2072 1764812    0    0     0    38 2869 4611  9  4 87  0  0
 2  0      0 1063476   2072 1764876    0    0     0    28 3467 8176 31 15 54  0  0
 0  0      0 1063476   2072 1764876    0    0     0     0 2482 3629 14  2 84  0  0
 0  0      0 1063476   2072 1764876    0    0     0    28 2459 3691  3  2 96  0  0
 0  0      0 1063368   2072 1764864    0    0     0    36 2691 4061  5  1 94  0  0
 0  0      0 1062864   2072 1764864    0    0     0    44 2714 4420  6  2 92  0  0
 0  0      0 1063104   2072 1764864    0    0     0    32 2963 4514  8  3 88  0  0
............
 1  0      0 1063868   2072 1765000    0    0     0   107 2657 6989 33 14 52  0  0
 0  0      0 1063868   2072 1765000    0    0     0     0 2830 4315  6  3 91  0  0
 0  0      0 1063868   2072 1765000    0    0     0    28 2430 3908  5  3 92  0  0
 0  0      0 1063868   2072 1765000    0    0     0     0 2358 3551  2  2 96  0  0
.........
 1  0      0 1064136   2072 1765112    0    0     0     0 2736 4000  6  3 91  0  0
 4  0      0 1063764   2072 1765112    0    0     0    48 2492 3779  5  2 93  1  0
 0  0      0 1063484   2072 1765112    0    0     0     0 2650 4071  4  2 94  0  0
 0  0      0 1063304   2072 1765116    0    0     0    99 2727 4430  7  3 90  0  0
 0  0      0 1063392   2072 1765116    0    0     0    12 2554 3811  2  1 97  0  0
 0  0      0 1064012   2072 1765120    0    0     0    48 2585 4291 14  5 81  0  0
 0  0      0 1064136   2072 1765120    0    0     0     0 2576 4057  4  2 94  0  0
^C
┌──[root@vms81.liruilongs.github.io]-[~]
└─$

-s 的统计

┌──[root@vms81.liruilongs.github.io]-[~]
└─$vmstat -s
      4030172 K total memory
      1199020 K used memory
      1277200 K active memory
      1428408 K inactive memory
      1064028 K free memory
         2072 K buffer memory
      1765052 K swap cache
            0 K total swap
            0 K used swap
            0 K free swap
       206387 non-nice user cpu ticks
            3 nice user cpu ticks
       100381 system cpu ticks
      2184710 idle cpu ticks
        12604 IO-wait cpu ticks
            0 IRQ cpu ticks
         4699 softirq cpu ticks
            0 stolen cpu ticks
      1473622 pages paged in
       652550 pages paged out
            0 pages swapped in
            0 pages swapped out
     37633050 interrupts
     64361523 CPU context switches
   1642162657 boot time
       210962 forks
┌──[root@vms81.liruilongs.github.io]-[~]
└─$

CPU相关的列名含义

CPU相关的列名含义

vmstat的开销很低,可以让它在控制台上或窗口中持续运行,甚至是在负载非常重的服务器上是很实用的。

┌──[root@vms81.liruilongs.github.io]-[~]
└─$vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 1057540   2072 1761012    0    0    68    27 1501  595  8  4 87  1  0
┌──[root@vms81.liruilongs.github.io]-[~]
└─$

查看CPU平均值,当前系统中,可运行进程为2®,被阻塞的进程为0(b),系统发生中断次数1501(in),系统发生上下文切换次数为595(cs),系统代码消耗CPU为4%(sy),用户代码消耗CPU为8%(us),系统空闲占比87%(id),剩余1%属于等待IO消耗的CPU空闲状态(wa),

上下文切换的数量小于中断的数量。调度器切换进程的次数少于定时器中断触发的次数 。这很可能是因为系统基本上是空闲的,在定时器中断触发的大多数时候,调度器没有任何工作要做,因此它也不需要从空闲进程切换出去。

CPU 统计的含义

┌──[root@vms81.liruilongs.github.io]-[~]
└─$vmstat -s
    ..........
       206387 non-nice user cpu ticks
            3 nice user cpu ticks
       100381 system cpu ticks
      2184710 idle cpu ticks
        12604 IO-wait cpu ticks
            0 IRQ cpu ticks
         4699 softirq cpu ticks
            0 stolen cpu ticks
    ............
     37633050 interrupts
     64361523 CPU context switches
    ...........
       210962 forks

这里的ticks为一个时间单位,相关数据为自系统启动时间以来的数据。forks表示系统创建以来的进程数,CPU context switches表示上下文文切换次数,interrupts即中断次数,剩下的参数对应上面的列理解即可,stolen cpu 这个不太理解

top(3.0.X 版本)

top 小伙伴应该不陌生,不多讲,直接看语法

语法

┌──[root@vms81.liruilongs.github.io]-[~]
└─$top -help
  procps-ng version 3.3.10
Usage:
  top -hv | -bcHioss -d secs -n max -u|U user -p pid(s) -o field -w [cols]
┌──[root@vms81.liruilongs.github.io]-[~]
└─$

top呈现为一个降序列表,排在最前面的是最占用CPU的进程。

CPU性能相关的选项

$top [-d delay] [-n iter] [-i] [-b]

top实际有两种模式的选项:命令行选项运行时选项

命令行选项

命令行选项决定top如何显示其信息。

命令行选项

下面问间隔3s统计2次的top信息

┌──[root@vms81.liruilongs.github.io]-[~]
└─$top -d 3 -n 2
top - 09:26:22 up 13:08,  1 user,  load average: 0.56, 0.48, 0.55
Tasks: 215 total,   1 running, 214 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.9 us,  5.5 sy,  0.0 ni, 84.3 id,  0.2 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  4030172 total,  1079708 free,  1204872 used,  1745592 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2470484 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  2195 root      20   0 1174904 380988  47392 S  10.0  9.5  95:15.71 kube-apiserver
   963 root      20   0 1777988 142376  59968 S   5.6  3.5  41:04.34 kubelet
  2204 root      20   0  823728  98312  36136 S   5.6  2.4  47:06.26 kube-controller
  4348 root      20   0 1657820  47488  21052 S   5.3  1.2  42:28.29 calico-node
  2266 root      20   0 10.696g  77632  19904 S   3.0  1.9  23:51.16 etcd
  1121 root      20   0 1369820  85076  28388 S   2.7  2.1  15:55.04 dockerd
   973 root      20   0 1099192  43512  16860 S   0.7  1.1   4:32.81 containerd
  3057 root      20   0  737756  29904  12424 S   0.7  0.7   3:34.82 speaker
  3564 root      20   0  713096  15152   4312 S   0.7  0.4   1:50.31 containerd-shim
  4313 root      20   0  713096  15596   4256 S   0.7  0.4   1:25.70 containerd-shim
     9 root      20   0       0      0      0 S   0.3  0.0   2:05.06 rcu_sched
    13 root      20   0       0      0      0 S   0.3  0.0   0:07.26 ksoftirqd/1
  2214 root      20   0  754268  41856  19352 S   0.3  1.0   4:25.88 kube-scheduler
  3774 root      20   0  751232  34032  15932 S   0.3  0.8   1:25.77 coredns
  4261 root      20   0  751488  30832  15880 S   0.3  0.8   1:30.06 coredns
  4369 polkitd   20   0  745532  33232  14124 S   0.3  0.8   0:21.00 kube-controller
     1 root      20   0  191024   4028   2516 S   0.0  0.1   0:47.38 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.05 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   0:07.85 ksoftirqd/0
     4 root      20   0       0      0      0 S   0.0  0.0   0:06.99 kworker/0:0
.......

下面为只显示非空闲进程

┌──[root@vms81.liruilongs.github.io]-[~]
└─$top -i
top - 09:35:45 up 13:18,  1 user,  load average: 0.17, 0.45, 0.53
Tasks: 216 total,   3 running, 213 sleeping,   0 stopped,   0 zombie
%Cpu(s):  7.4 us,  3.2 sy,  0.0 ni, 89.1 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  4030172 total,  1070632 free,  1213464 used,  1746076 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2461980 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  2195 root      20   0 1174904 380988  47392 S  14.3  9.5  96:25.19 kube-apiserver
  2204 root      20   0  823728  98312  36136 S   6.3  2.4  47:40.78 kube-controller
  4348 root      20   0 1657820  47516  21052 S   5.3  1.2  42:59.36 calico-node
   963 root      20   0 1777988 141712  59968 S   4.3  3.5  41:34.55 kubelet
  2266 root      20   0 10.696g  78684  19904 S   3.3  2.0  24:08.17 etcd
 40370 root      20   0  745236  17168   8388 R   2.3  0.4   0:00.07 calico
  1121 root      20   0 1369820  85496  28388 S   1.7  2.1  16:06.78 dockerd
  2214 root      20   0  754268  41856  19352 S   0.7  1.0   4:28.98 kube-scheduler
  3057 root      20   0  737756  30136  12424 S   0.7  0.7   3:37.40 speaker
     9 root      20   0       0      0      0 S   0.3  0.0   2:06.53 rcu_sched
  3023 root      20   0  713096  12892   3636 S   0.3  0.3   0:05.56 containerd-shim


┌──[root@vms81.liruilongs.github.io]-[~]
└─$

-b 显示全部的进程,默认只显示当前的页能容纳的进程

┌──[root@vms81.liruilongs.github.io]-[~]
└─$top -d 3 -n 1 -b
top - 09:31:42 up 13:14,  1 user,  load average: 1.21, 0.70, 0.61
Tasks: 215 total,   1 running, 214 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.6 us,  3.6 sy,  0.0 ni, 92.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4030172 total,  1078040 free,  1206028 used,  1746104 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2469136 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   963 root  

以上是关于关于Linux性能调优中系统CPU监测信息统计的一些笔记的主要内容,如果未能解决你的问题,请参考以下文章

关于Linux性能调优中磁盘IO调优的一些笔记

关于Linux性能调优中磁盘IO调优的一些笔记

关于Linux性能调优中网络I/O的一些笔记

关于Linux性能调优中网络I/O的一些笔记

linux系统性能调优之vmstat

Linux性能调优中内存调优工具的一些笔记整理