08-09 性能测试--CPU分析

402 阅读5分钟

Linux 监控工具

top:展示所有进程信息

vmstat:展示系统活动,硬件和系统信息

  • vmstat pid 10

ps:

  • ps aux | sort -k3nr | head -n 10:展示 CPU / 内存排名

free:展示内存占用

  • free -g

iostat:展示 IO 信息

  • iostat -x -k -d

pidstat:展示进程的 CPU 使用情况

  • pidstat -u -p ALL
[root@ZT-TEST ~]# pidstat -p 8938 -w 1 10
Linux 3.10.0-957.el7.x86_64 (ZT-TEST)   20211003日  _x86_64_        (4 CPU)

101344秒   UID       PID   cswch/s nvcswch/s  Command
10134542      8938      1.00      1.00  gsd-color
10134642      8938      1.00      0.00  gsd-color
10134742      8938      1.00      0.00  gsd-color

cswch/s:主动切换;值过高,说明内存 IO 资源不足

nvcswch/s:被动切换;值过高,说明时间片不足

mpstat:展示 CPU 所有内核的使用情况

  • mpstat -P ALL 1

netstat:进程连接数统计

  • netstat -anp | grep pid | wc -l

jstat:每秒刷新一次 GC 情况

  • jstat -gcutil pid 1000

dstat:中断与上下文切换统计

  • dstat -y

strace:拦截系统调用

  • strace -tt -f -p pid

CPU 基本构成

命令:lscpu

[root@ZT-TEST ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4  # 逻辑 CPU 个数
On-line CPU(s) list:   0-3
Thread(s) per core:    1  # 线程,每个 核 中有1个线程
Core(s) per socket:    1  # 核,指每个 卡槽 下有1个核
座:                 4  # socket-卡槽,指每个 CPU 下有4个卡槽
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              45
型号名称:        Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
步进:              7
CPU MHz:             2600.000
BogoMIPS:            5200.00
超管理器厂商:  VMware
虚拟化类型:     完全
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           20480K
NUMA 节点0 CPU:    0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ssbd ibrs ibpb stibp tsc_adjust arat spec_ctrl intel_stibp flush_l1d arch_capabilities

负载与利用率

CPU负载

命令:top

[root@ZT-TEST ~]# top
top - 18:05:32 up 214 days,  3:19,  1 user,  load average: 0.01, 0.02, 0.05
Tasks: 263 total,   1 running, 262 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.2 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8174056 total,   331764 free,  3016584 used,  4825708 buff/cache
KiB Swap:  4194300 total,  4191968 free,     2332 used.  4297980 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 8938 gdm       20   0  777872  76052   9500 S   2.0  0.9   2493:51 gsd-color
12511 root      20   0 5735740 148696  16064 S   0.7  1.8 358:06.15 java
 4785 root      20   0  164232   2536   1644 R   0.3  0.0   0:00.06 top
 5820 root      20   0  320216   6880   5388 S   0.3  0.1 282:22.54 vmtoolsd

平均负载:

load average: 0.01, 0.02, 0.05

平均负载是指单位时间内,系统处于可运行状态不可中断状态的平均进程数,也就是平均活跃进程数

  • 可运行状态的进程:正在使用 CPU 或者正在等待 CPU 的进程,也就是处于 R 状态(Running 或 Runnable)的进程
  • 不可中断状态的进程:正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程

CPU 利用率

当平均负载等于 CPU(s): 4 (逻辑 CPU 个数) ,说明每个 CPU 都得到了充分利用

通过 top 查看整体每个进程的 CPU 利用率

通过 mpstat -P ALL 1 查看逻辑 CPU 利用率

[root@ZT-TEST ~]# mpstat -P ALL 1
Linux 3.10.0-957.el7.x86_64 (ZT-TEST)   20211002日  _x86_64_        (4 CPU)

181657秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
181658秒  all    0.75    0.00    0.25    0.00    0.00    0.00    0.00    0.00    0.00   99.00
1816580    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
1816581    1.01    0.00    1.01    0.00    0.00    0.00    0.00    0.00    0.00   97.98
1816582    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
1816583    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

# 0--3 分别代表4个 CPU

mpstat -P ALL 1 的结果分析:

  • %usr:用户空间;导致空间不足原因:代码、项目运行
  • %sys:系统空间;导致空间不足原因:内存不足、CPU不足、IO故障、网络故障……
  • %irq:上下文切换
  • %soft:软中断
  • %steal:硬中断

CPU 利用率与平均负载的关系:

  • CPU 利用率=100%,平均负载=CPU 个数:理想状态,CPU 得到充分利用,队列中没有排队等待的线程
  • CPU 利用率=100%,平均负载>CPU 个数:CPU 满载,超负荷运行,队列中有排队等待的线程
  • CPU 利用率<100%,平均负载<CPU 个数:CPU 没有被完全利用

命令:vmstat 1 10

[root@ZT-TEST ~]# vmstat 1 10
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   3368 2922680   4204 4345184    0    0     0     1    0    0  0  0 100  0  0
 0  0   3368 2922688   4204 4345216    0    0     0     8  143  229  1  0 100  0  0
 0  0   3368 2922688   4204 4345216    0    0     0     0  173  281  1  0 99  0  0
 
 # 当 r + b 远远大于 CPU 线程数,说明系统处于过载状态

进程优先级

命令:top

[root@ZT-TEST ~]# top
top - 10:13:15 up 214 days, 19:26,  1 user,  load average: 0.06, 0.05, 0.05
Tasks: 262 total,   1 running, 261 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.2 sy,  0.0 ni, 99.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8174056 total,   338476 free,  3015636 used,  4819944 buff/cache
KiB Swap:  4194300 total,  4191968 free,     2332 used.  4282596 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 8938 gdm       20   0  778004  76244   9500 S   1.7  0.9   2510:43 gsd-color
26591 kingkong  20   0 5722784   1.2g  24080 S   0.7 15.6 765:28.80 java
 5820 root      20   0  320216   6880   5388 S   0.3  0.1 283:16.87 vmtoolsd
 5860 avahi     20   0   62364   2464   1864 S   0.3  0.0 458:16.62 avahi-daemon
12511 root      20   0 5735740 148696  16064 S   0.3  1.8 363:33.44 java
31958 root      20   0  164232   2536   1644 R   0.3  0.0   0:00.04 top

PR:进程的实时优先级;范围是从 0 到 99。PR 的值越高,进程优先级就越高

NI:范围从-20 到+19,正值表示低优先级,负值表示高优先级。0 表示不调整该进程的优先级

  • 两者关系:NI 越低,进程时间片越多,PR 值越低,进程的优先级就越高
  • 进程优先级调整方式:top 命令下按 R 键,先输入进程号,再输入优先级数值(-10~+19)

模拟负载

stress

参考链接:

blog.csdn.net/weixin_4241…

安装:

yum install -y epel-release.noarch && yum -y update
yum install -y stress stress-ng

常用命令(使用注意事项:不要生成过多进程,会损伤 CPU):

  • stress-ng -c 2 -t 30 -c:指定进程数 -t 指定时间
  • stress-ng -c 2 --cpu-method pi:产生 2 个进程做圆周率算法压力
  • stress-ng -c 16 --cpu-method all:生成 16 个进程使用多种不同的算法竞争 CPU
  • taskset -c 16 stress-ng --timeout 30 --cpu 1:生成 16 个进程对索引为 0 的逻辑 CPU 施加压力, 持续 30 秒
  • stress-ng -c 16 --timeout 300:模拟 16 个进程争夺 CPU 持续 300 秒
  • stress-ng -i 1 --timeout 600:模拟 IO 进程