关于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监测信息统计的一些笔记的主要内容,如果未能解决你的问题,请参考以下文章