irpas技术客

(一文了解)linux性能分析之CPU篇_为了维护世界和平__cpu linux

网络投稿 2360

目录

前言

一、CPU 性能指标

1、CPU使用率

2、负载均衡

3、上下文切换

4、CPU缓存命中率

二、常用工具

1、uptime

2、vmstat

3、mpstat

4、top

5、sar

6、pidstat

7、cat /proc/sotfirqs

三、分析CPU性能瓶颈方法

分析举例

四、性能调优

1,编译器选项

2、进程绑定

3,独占CPU组


前言

????????

????????本文介绍linux性能优化CPU相关的知识点,首先介绍了CPU相关的性能指标,接着介绍经常使用的工具如 pidstat、sar、vmstat等并演示其使用方法,最后介绍性能分析时常用的方法与策略。

?图片来源Linux Performance

一、CPU 性能指标 1、CPU使用率

? ? ? ? 用户CPU使用率:CPU使用率高,通常说明有应用程序比较繁忙;

? ? ? ? 系统CPU使用率:CPU使用率高,说明内核比较繁忙;

? ? ? ? 等待I/O的CPU使用率:iowait,表示等待I/O的时间百分比,iowait高通常说明系统与硬件设备I/O交互时间比较长;

? ? ? ? 软中断和硬中断的CPU使用率,内核调用软中断处理程序,硬中断处理程序的百分比。

2、负载均衡

????????平均负载其实就是平均活跃进程数。平均负载大于CPU数量表示CPU不足以服务线程,有些线程在等待;如果平均负载小于CPU数量,这代表还有一些余量。

? ? ? ? 主要包括三个数值,分别值过去1分钟,5分钟,15分钟的平均负载

平均负载与 CPU 使用率关系:平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。

CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;?I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

3、上下文切换

? ? ? ? 频繁上下文切换,将时间消耗在寄存器、内核栈以及虚拟内存等数据保持与恢复上。切换分为以下两类:

? ? ? ? 1)无法获取资源而导致的自愿上下文切换;

? ? ? ? 2)被系统强制调度导致的非自愿上下文切换;

4、CPU缓存命中率

? ? ? ? CPU速度比内存访问速度快得多,协调这两者巨大性能差距,使用CPU缓存。缓存的是热点的内存数据。L1 L2 L3到缓存。L1 L2常用在单核中,L3则用在多核中。L1->L3三级缓存大小依次增大,相应性能依次降低。命中率衡量的是CPU缓存的复用情况,命中率越高,则性能越好。


二、常用工具 命令描述uptime? ? ? ?平均负载vmstat包括系统范围的CPU平均负载,上下文切换次数、中断次数、还包括处于运行和不可中断状态的进程数量mpstat单个CPU统计信息和软中断次数sar统计历史信息ps进程状态和CPU使用率top监控平均负载,运行队列、整体CPU使用率,以及每个进程/线程CPU用量pidstat每个进程/线程CPU用量分解time????????给一个命令计时,带CPU用量分解Dtrace,perfCPU剖析和跟踪perfCPU性能计数器分析,CPU缓存,cpu调度

1、uptime

功能:打印平均负载,系统运行时间

root@ubuntu:~# uptime 06:03:29 up 7:18, 3 users, load average: 0.08, 0.04, 0.00

最后三个数字是1,5,15分钟内的平均负载。通过这三个值可以判断系统负载在此段时间内上升,下降还是平稳。

如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。

把系统的平均负载监控起来,然后根据更多的历史数据,判断负载的变化趋势,一般当平均负载高于 CPU 数量 70% 的时候,应该分析排查负载高的问题。

查看几个 CPU数量

root@ubuntu:~# grep 'model name' /proc/cpuinfo | wc -l 1

2、vmstat

功能:报告虚拟内存统计信息

root@ubuntu:~# 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 0 0 0 5816612 459976 678352 0 0 40 26 209 587 1 1 98 0 0 0 0 0 5816484 459976 678344 0 0 0 0 225 540 1 1 98 0 0 0 0 0 5816484 459976 678344 0 0 0 0 218 531 0 0 100 0 0 2 0 0 5816360 459976 678344 0 0 0 0 215 501 1 0 99 0 0 0 0 0 5816356 459984 678336 0 0 0 28 223 690 0 0 100 0 0

类别

参数

含义

说明

Procs

r

等待执行的任务数

当这个值超过了cpu个数,就会出现cpu瓶颈。

b

等待IO的进程数量,阻塞的进程

system

in

每秒中断数,包括时钟中断

这两个值越大,会看到由内核消耗的cpu时间sy会越多

这个值要越小越好,太大了,要考虑调低线程或者进程的数目

cs

每秒上下文切换数

CPU

us

用户进程执行消耗cpu时间

us的值比较高时,说明用户进程消耗的cpu时间多

sy

系统进程消耗cpu时间

sys的值过高时,说明系统内核消耗的cpu资源多,例如I/O频繁操作。

Id

空闲时间(包括IO等待时间)

一般来说 us+sy+id=100

wa

等待IO时间

wa过高时,说明io等待比较严重,可能由于磁盘大量随机访问造成,也有可能是磁盘的带宽出现瓶颈。

3、mpstat

功能:报告处理器相关的统计信息

报告每个CPU的统计信息,-p?ALL 用来打印CPU的报告,默认只打印系统级别的总结信息

root@ubuntu:~# mpstat -P ALL 1 Linux 4.4.0-31-generic (ubuntu) 04/09/2022 _i686_ (1 CPU) 06:28:33 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 06:28:34 AM all 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 06:28:34 AM 0 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 06:28:37 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 06:28:38 AM all 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 06:28:38 AM 0 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 ^C Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40 Average: 0 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40 4、top

功能:显示最消耗CPU的任务,并且有百分百

top - 06:39:36 up 7:54, 3 users, load average: 0.01, 0.02, 0.00 Tasks: 273 total, 1 running, 272 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 8292140 total, 2534920 used, 5757220 free, 461192 buffers KiB Swap: 2094076 total, 0 used, 2094076 free. 740660 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1319 root 20 0 290452 97532 56896 S 0.7 1.2 0:49.04 Xorg 1359 www-data 20 0 15072 2992 2220 S 0.3 0.0 0:00.43 nginx 2187 wy 20 0 5048 3160 2088 S 0.3 0.0 0:00.52 dbus-daemon 2620 wy 20 0 128620 29844 21980 S 0.3 0.4 0:05.81 gnome-terminal 3520 wy 20 0 1557464 773340 129048 S 0.3 9.3 6:51.34 firefox 5460 root 20 0 5568 2852 2356 R 0.3 0.0 0:00.02 top 1 root 20 0 4584 3740 2524 S 0.0 0.0 0:01.24 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:01.99 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 0:01.62 rcu_sched 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh

按键盘数字“1”,可监控每个逻辑CPU的状况

top - 06:45:37 up 8:00, 3 users, load average: 0.00, 0.00, 0.00 Tasks: 272 total, 2 running, 270 sleeping, 0 stopped, 0 zombie %Cpu0 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 8292140 total, 2548596 used, 5743544 free, 461544 buffers KiB Swap: 2094076 total, 0 used, 2094076 free. 770464 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1319 root 20 0 290452 97532 56896 S 0.3 1.2 0:49.67 Xorg 1553 root 10 -10 5224 272 36 S 0.3 0.0 0:12.73 monitor 2620 wy 20 0 136816 28208 22008 R 0.3 0.3 0:06.29 gnome-terminal 1 root 20 0 4584 3740 2524 S 0.0 0.0 0:01.24 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 5、sar

功能:收集、报告或保存系统活动信息

5.1、查看CPU使用情况

(base) root@ubuntu:~# sar -u 1 3 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:24:45 PM CPU %user %nice %system %iowait %steal %idle 09:24:46 PM all 0.00 0.00 0.25 0.00 0.00 99.75 09:24:47 PM all 0.00 0.00 0.25 0.00 0.00 99.75 09:24:48 PM all 0.00 0.00 0.00 0.00 0.00 100.00 Average: all 0.00 0.00 0.17 0.00 0.00 99.83

5.2、查看平均负载

(base) root@ubuntu:~# sar -q 1 3 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:26:14 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 09:26:15 PM 0 693 0.05 0.03 0.00 0 09:26:16 PM 0 693 0.05 0.03 0.00 0 09:26:17 PM 0 693 0.05 0.03 0.00 0 Average: 0 693 0.05 0.03 0.00 0

runq-sz ? ?运行队列的长度;plist-sz ? 进程列表中的进程和线程数的数量。

5.3、查看内存

root@ubuntu:~# sar -r 1 3 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:27:38 PM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 09:27:39 PM 4307984 6159644 3809328 46.93 405700 1434912 5049120 49.43 2221224 738988 48 09:27:40 PM 4307984 6159644 3809328 46.93 405700 1434912 5049120 49.43 2221224 738988 48 09:27:41 PM 4307952 6159612 3809360 46.93 405700 1434912 5049120 49.43 2221224 738988 48 Average: 4307973 6159633 3809339 46.93 405700 1434912 5049120 49.43 2221224

5.4、查看I/O和传输速率

root@ubuntu:~# sar -b 1 3 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:28:27 PM tps rtps wtps bread/s bwrtn/s 09:28:28 PM 2.00 0.00 2.00 0.00 24.00 09:28:29 PM 0.00 0.00 0.00 0.00 0.00 09:28:30 PM 0.99 0.00 0.99 0.00 158.42 Average: 1.00 0.00 1.00 0.00 61.13

5.5、更多说明和使用

man sar?

EXAMPLES ? ? ? ?sar -u 2 5 ? ? ? ? ? ? ? Report CPU utilization for each 2 seconds. 5 lines are displayed.

? ? ? ?sar -I 14 -o int14.file 2 10 ? ? ? ? ? ? ? Report ?statistics ?on ?IRQ ?14 ?for ?each 2 seconds. 10 lines are displayed. ?Data are ? ? ? ? ? ? ? stored in a file called int14.file.

? ? ? ?sar -r -n DEV -f /var/log/sysstat/sa16 ? ? ? ? ? ? ? Display memory and network statistics saved in daily data file 'sa16'.

? ? ? ?sar -A ? ? ? ? ? ? ? Display all the statistics saved in current daily data file.

6、pidstat

????????功能: 上报Linux任务的统计信息

按进程或线程打印CPU用量,包括用户态和系统态时间的分解

查看man pidstat查看使用说明

cpu使用情况统计(-u),针对特定进程统计(-p)

root@ubuntu:~# pidstat 1 Linux 4.4.0-31-generic (ubuntu) 04/09/2022 _i686_ (1 CPU) 06:48:37 AM UID PID %usr %system %guest %CPU CPU Command 06:48:38 AM 0 1319 1.00 0.00 0.00 1.00 0 Xorg 06:48:38 AM 0 5488 0.00 1.00 0.00 1.00 0 pidstat 06:48:43 AM UID PID %usr %system %guest %CPU CPU Command 06:48:44 AM 0 5488 0.00 1.00 0.00 1.00 0 pidstat ^C Average: UID PID %usr %system %guest %CPU CPU Command Average: 0 1319 0.29 0.29 0.00 0.57 - Xorg Average: 0 1564 0.00 0.14 0.00 0.14 - monitor Average: 1000 2486 0.00 0.29 0.00 0.29 - compiz Average: 1000 2620 0.14 0.00 0.00 0.14 - gnome-terminal Average: 1000 3520 0.14 0.00 0.00 0.14 - firefox Average: 0 5488 0.29 0.43 0.00 0.72 - pidstat

6.1、上下文切换查看

(base) root@ubuntu:~# pidstat -w -p 20671 1 10 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:16:17 PM UID PID cswch/s nvcswch/s Command 09:16:18 PM 0 20671 0.00 0.00 dhclient 09:16:19 PM 0 20671 0.00 0.00 dhclient 09:16:20 PM 0 20671 0.00 0.00 dhclient 09:16:21 PM 0 20671 0.00 0.00 dhclient 09:16:22 PM 0 20671 0.00 0.00 dhclient ^C Average: 0 20671 0.00 0.00 dhclient

6.2、内存使用情况统计(-r)

(base) root@ubuntu:~# pidstat -r -p 20671 1 10 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:17:36 PM UID PID minflt/s majflt/s VSZ RSS %MEM Command 09:17:37 PM 0 20671 0.00 0.00 25992 6280 0.08 dhclient 09:17:38 PM 0 20671 0.00 0.00 25992 6280 0.08 dhclient 09:17:39 PM 0 20671 0.00 0.00 25992 6280 0.08 dhclient 09:17:40 PM 0 20671 0.00 0.00 25992 6280 0.08 dhclient ^C Average: 0 20671 0.00 0.00 25992 6280 0.08 dhclient

6.3、IO情况统计(-d)

(base) root@ubuntu:~# pidstat -d -p 20671 1 10 Linux 5.4.0-107-generic (ubuntu) 04/09/2022 _x86_64_ (4 CPU) 09:18:13 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command 09:18:14 PM 0 20671 0.00 0.00 0.00 0 dhclient 09:18:15 PM 0 20671 0.00 0.00 0.00 0 dhclient 09:18:16 PM 0 20671 0.00 0.00 0.00 0 dhclient 09:18:17 PM 0 20671 0.00 0.00 0.00 0 dhclient ^C Average: 0 20671 0.00 0.00 0.00 0 dhclient

6.4、其它

以1秒为信息采集周期,分别获取cpu、内存和磁盘IO的统计信息。

pidstat -u 1 pidstat -r 1 pidstat -d 1 7、cat /proc/sotfirqs

功能:查看软中断

cat /proc/softirqs CPU0 CPU1 HI: 0 0 TIMER: 811613 1972736 NET_TX: 49 7 NET_RX: 1136736 1506885 BLOCK: 0 0 IRQ_POLL: 0 0 TASKLET: 304787 3691 SCHED: 689718 1897539 HRTIMER: 0 0 RCU: 1330771 1354737

TIMER(定时中断)、NET_RX(网络接收)、NET_TX(网络发送)、SCHED(内核调度)、RCU(RCU 锁)中,网络接收与发送变化最快。


三、分析CPU性能瓶颈方法

通常先运行几个支持指标较多的工具,top,vmstat和pidstat

从 top 的输出可以得到各种 CPU 使用率以及僵尸进程和平均负载等信息。从 vmstat 的输出可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数。从 pidstat 的输出可以得到进程的用户 CPU 使用率、系统 CPU 使用率、以及自愿上下文切换和非自愿上下文切换情况。

分析举例

1)当发现 top 输出的软中断 CPU 使用率升高时,可以查看 /proc/softirqs 文件中各种类型软中断的变化情况,可以用网络分析工具 sar 和 tcpdump 来分析。

2)当发现 top 输出的用户 CPU 使用率有问题时,可以跟 pidstat 的输出做对比,观察是否是某个进程导致的问题。找到进程再用进程分析工具来分析进程的行为,如使用 strace 分析系统调用情况,以及使用 perf 分析函数的执行情况。

3)top 输出的平均负载升高,可以跟 vmstat 输出的运行状态和不可中断状态的进程数做对比,观察是哪种进程导致的负载升高。

如果是不可中断进程数增多了,那么就需要做 I/O 的分析,dstat 或 sar 工具。?如果是运行状态进程数增多了,需要回到 top 和 pidstat,找出这些处于运行状态的到底是什么进程。


四、性能调优

1,编译器选项

????????编译器提高代码优化选项,对CPU有很大影响。

2、进程绑定

一个进程可以绑定在一个或者多个CPU上,这样可以通过提高缓存温度和内存本地性来提高性能

(base) root@ubuntu:~# taskset -pc 1-2 22182 pid 22182's current affinity list: 0-3 pid 22182's new affinity list: 1,2

限制了PID为22182的进程只能跑在CPU1,CPU2之间。

3,独占CPU组

linux提供CPU组,允许编组CPU并为其分配进程。可以提高性能,使得CPU组独占,不允许其他进程使用。

mkdir /dev/cpuset mount -t cpuset cpuset /dev/cpuset cd /dev/cpuset mkdir prodset echo 1 > /sys/fs/cgroup/cpuset/prodset/cpuset.cpu_exclusive #独占 echo 0 > /sys/fs/cgroup/cpuset/prodset/cpuset.mems echo 3 > /sys/fs/cgroup/cpuset/prodset/cpuset.cpus #CPU分配 echo 22612 > /sys/fs/cgroup/cpuset/prodset/tasks #分配进程



1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #CPU #Linux #目录前言一CPU