目录

前言

一、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,perf CPU剖析和跟踪
perf CPU性能计数器分析,CPU缓存,cpu调度

1、uptime

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

root@ubuntu:~# uptime06: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 st0  0      0 5816612 459976 678352    0    0    40    26  209  587  1  1 98  0  00  0      0 5816484 459976 678344    0    0     0     0  225  540  1  1 98  0  00  0      0 5816484 459976 678344    0    0     0     0  218  531  0  0 100  0  02  0      0 5816360 459976 678344    0    0     0     0  215  501  1  0 99  0  00  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.0006: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
^CAverage:     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 MemPID 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 MemPID 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  pidstat06: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
^CAverage:      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 1pidstat -r 1pidstat -d 1

7、cat /proc/sotfirqs

功能:查看软中断

cat /proc/softirqsCPU0       CPU1HI:          0          0TIMER:     811613    1972736NET_TX:         49          7NET_RX:    1136736    1506885BLOCK:          0          0IRQ_POLL:          0          0TASKLET:     304787       3691SCHED:     689718    1897539HRTIMER:          0          0RCU:    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 prodsetecho 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  #分配进程

(一文了解)linux性能分析之CPU篇相关推荐

  1. 【转】一文掌握 Linux 性能分析之网络篇(续)

    [转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...

  2. 一文掌握 Linux 性能分析之网络篇(续)

    在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息历史 traceroute:测试网络路由 dtrac ...

  3. linux进程cpu时间片,Linux性能监控之CPU篇

    这篇文章中,主要介绍CPU的一些基础知识. 首先介绍一下Linux kernel中的调度器(scheduler),调度器负责调度系统中的两种资源,一是线程,二是中断.调度器给不同资源不同的优先级.从高 ...

  4. idl linux运行效率,Linux性能优化实战 CPU篇 阅读笔记

    第十一讲 如何快速分析出CPU的性能瓶颈(2020.6.3) 这一讲干活真是太多了,将之将使用的各种工具串联起来.其实系统出问题之后第一感觉就是感觉就是系统相应变慢了.我们可以使用<> 里 ...

  5. 推荐Linux性能分析的一篇论文和两本书

    最重要的一篇paper: A Top-Down method for performance analysis and counters architecture 这篇文章提出了topdown分析模型 ...

  6. linux监控cpu进程,Linux性能监控之CPU篇详解

    监控CPU的性能就是以上3点,运行队列.CPU使用率和上下文切换.以下是一些对于Linux性能监控CPU很普遍的性能要求: Linux性能监控CPU篇 1. 对于每一个CPU来说运行队列不要超过3,例 ...

  7. Linux性能优化:CPU篇

    本文主要帮助理解 CPU 相关的性能指标,常见的 CPU 性能问题以及解决方案梳理. 系统平均负载 简介 系统平均负载:是处于可运行或不可中断状态的平均进程数. 可运行进程:使用 CPU 或等待使用 ...

  8. idl linux运行效率,Linux性能监控之CPU篇

    正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列.CPU使用率和上下文切换.以下是一些对于CPU很普遍的性能要求: 1. 对于每一个CPU来说运行队列不要 ...

  9. linux系统和性能监控之cpu篇,Linux性能监控之CPU篇(2)

    正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列.CPU使用率和上下文切换.以下是一些对于CPU很普遍的性能要求: 1.对于每一个CPU来说运行队列不要超 ...

最新文章

  1. python实现简单的http服务器_Python实现简单HTTP服务器(二)
  2. 曝出漏洞、企业禁用、紧急声明:Zoom 一周里经历了什么?
  3. 阿里P9架构师讲解从单机至亿级流量大型网站系统架构的演进过程
  4. HDU Starship Troopers (树形DP)
  5. 【python数据挖掘课程】十二.Pandas、Matplotlib结合SQL语句对比图分析
  6. ps -ef | grep 查看进程命令
  7. flex基于svn协同开发
  8. 白盒基本路径发测试实验报告_软件生命周期、白盒测试、黑盒测试
  9. 计算机密码学奖,上海交通大学计算机科学与工程系(CSE)
  10. android button layoutparams,使用LayoutParams设置布局
  11. Spring Boot 文件上传功能实现与简单示例
  12. python flask ajax处理按钮_Python Flask前后端Ajax交互的方法示例
  13. 基于LSTM、KNN等模型的平安银行股价预测对比研究(python)
  14. Linux + ChromiumOS + ....操作系统资源(持续更新...)
  15. 【highcharts】highcharts(highmaps)实现疫情地图(一看就会篇)
  16. AI教程:2.5D字体制作方法
  17. iOS开发者Matt Gemmell谈iOS 7
  18. 视频和图片合成软件,简单快速合成视频和图片
  19. 《Electron入门与实战》创作路上的那些事儿
  20. 366AP微信中可以下载企业包

热门文章

  1. mysql中的found_MySQL 中的 FOUND_ROWS() 函数
  2. aaaaa22222
  3. 英文原文:Where .NET Core 2.1 is Headed
  4. 基于ROS多波束前视声呐仿真模块的一些应用
  5. 这五大美国城市实习机会多,留学生快收藏!
  6. python中的类是什么意思_如何理解python中的类和方法(转)
  7. 2021最新版谷歌卫星地图已出炉,纯免费下载
  8. 抖音小项目,适合新手做的创业项目
  9. 会声会影,premiere,Edius这三个软件的区别是什么?
  10. 王国维 《人间词话》人生三大境界