性能测试-CPU性能分析,上下文切换

目录

Linux查询CPU信息

lscpu命令

Linux系统/proc文件中查询系统信息

CPU信息-cpuinfo

内存信息-meminfo

软中断信息-softirqs

硬中断信息-interrupts

CPU资源监控的数据信息

Linux系统中模拟上下文切换压力stress-ng

 进程上下文切换

进程-使用top、vmstat 、pidstat观察服务器资源状态

 线程上下文切换

线程-使用top、vmstat 、pidstat观察服务器资源状态

参考资料


Linux查询CPU信息

lscpu命令

CPU组成:运算器、控制器、寄存器

Architecture(架构):          x86_64
CPU op-mode(s)(系统):        32-bit, 64-bit
CPU(s)(CPU数量):                1
Thread(s) per core(每个核的线程):    1
Core(s) per socket(每个插槽CPU核数):    1
 

[root@centos7 ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
座:                 1
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              165
型号名称:        Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
步进:              2
CPU MHz:             2303.998
BogoMIPS:            4607.99
超管理器厂商:  KVM
虚拟化类型:     完全
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           16384K
NUMA 节点0 CPU:    0
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht sysc                                                                                          all nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq monitor ssse3 cx16 pcid sse4_1 sse4_2 x                                                                                          2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase avx2 invpcid rdseed clflush                                                                                          opt md_clear flush_l1d arch_capabilities
[root@centos7 ~]#

Linux系统/proc文件中查询系统信息

CPU信息-cpuinfo

每次系统启动成功,都会有系统启动的信息保存在,系统的内存文件中,存放位置/proc/cpuinfo

physical id:物理CPU

cpu cores:CPU的核数

processor:逻辑CPU

|wc -l:统计数量

|uniq:去重

|sort:排序

[root@centos7 proc]# cat cpuinfo

[root@centos7 proc]# cat cpuinfo |grep "physical id"
physical id     : 0

[root@centos7 proc]# cat cpuinfo |grep "physical id" |uniq
physical id     : 0

[root@centos7 proc]# cat cpuinfo |grep "physical id" |uniq |wc -l
1



内存信息-meminfo

MemTotal:总内存大小

MemFree:空闲内存大小(动态变动)

[root@centos7 proc]# cat meminfo
MemTotal:        1882092 kB
MemFree:         1599040 kB
MemAvailable:    1605044 kB
Buffers:            2108 kB
Cached:           134396 kB
SwapCached:            0 kB
Active:            91400 kB
Inactive:          93148 kB
Active(anon):      48312 kB
Inactive(anon):     8476 kB
Active(file):      43088 kB
Inactive(file):    84672 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                20 kB
Writeback:             0 kB
AnonPages:         48040 kB
Mapped:            23116 kB
Shmem:              8744 kB
Slab:              41780 kB
SReclaimable:      18816 kB
SUnreclaim:        22964 kB
KernelStack:        1760 kB
PageTables:         4152 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3038192 kB
Committed_AS:     264932 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       29196 kB
VmallocChunk:   34359705600 kB
Percpu:              176 kB
HardwareCorrupted:     0 kB
AnonHugePages:     10240 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       53184 kB
DirectMap2M:     2043904 kB

软中断信息-softirqs

[root@centos7 proc]# cat softirqs
                    CPU0
          HI:          1
       TIMER:      60014
      NET_TX:        600
      NET_RX:      24844
       BLOCK:       7007
BLOCK_IOPOLL:          0
     TASKLET:         71
       SCHED:          0
     HRTIMER:          0
         RCU:     129184

硬中断信息-interrupts

[root@centos7 proc]# cat interrupts
           CPU0
  0:        138   IO-APIC-edge      timer
  1:         10   IO-APIC-edge      i8042
  8:          0   IO-APIC-edge      rtc0
  9:          0   IO-APIC-fasteoi   acpi
 12:        336   IO-APIC-edge      i8042
 14:          0   IO-APIC-edge      ata_piix
 15:       3038   IO-APIC-edge      ata_piix
 18:       2996   IO-APIC-fasteoi   vmwgfx
 19:      25308   IO-APIC-fasteoi   enp0s3
 21:       5710   IO-APIC-fasteoi   0000:00:0d.0, snd_intel8x0
 22:          0   IO-APIC-fasteoi   ohci_hcd:usb1
NMI:          0   Non-maskable interrupts
LOC:     112538   Local timer interrupts
SPU:          0   Spurious interrupts
PMI:          0   Performance monitoring interrupts
IWI:       5504   IRQ work interrupts
RTR:          0   APIC ICR read retries
RES:          0   Rescheduling interrupts
CAL:          0   Function call interrupts
TLB:          0   TLB shootdowns
TRM:          0   Thermal event interrupts
THR:          0   Threshold APIC interrupts
DFR:          0   Deferred Error APIC interrupts
MCE:          0   Machine check exceptions
MCP:         11   Machine check polls
ERR:          0
MIS:          0
PIN:          0   Posted-interrupt notification event
NPI:          0   Nested posted-interrupt event
PIW:          0   Posted-interrupt wakeup event

CPU资源监控的数据信息

us

用户态计算,占用CPU的时间比。(例如:运算简单的加减乘除的时间消耗) 用户进程空间,未有改变过优先级的进程,占用CPU的百分比
sy 系统态计算,占用CPU的时间比。(例如:操作打开系统文件动作的时间消耗) 内核空间,占用CPU的百分比
ni 进程优先级切换,占用CPU的时间比 用户进程空间,有改变过优先级的进程,占用CPU的百分比
wa CPU等待资源,占用CPU的时间比。(等待,休息) 空闲+等待IO的时间百分比
hi hardware interrupt 硬件中断,占用CPU的时间比 硬件中断,占用CPU的时间比
si

software interrupt 软件中断,占用CPU的时间比

st:管理CPU任务,占用CPU的时间比

软件中断,占用CPU的时间比
st 管理CPU任务,占用CPU的时间比。 虚拟化时被其他VM窃取时间的百分比
id idle CPU空闲时间,占用CPU的时间比。

Linux系统中模拟上下文切换压力stress-ng

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

yum install -y stress-ng

 进程上下文切换

[root@centos7 proc]# ((proc = `nproc`*10)); stress-ng --cpu $proc --pthread 1 --timeout 150

 ((proc = `nproc`*10)); stress-ng --cpu $proc --pthread 1 --timeout 150

((proc = `nproc`*10)),proc相当于定义了一个变量,然后赋值,且双括号以10进制计算

nproc :获取当前系统CPU数量

[root@centos7 proc]# nproc
1

pthread 1 :每个进程有少数个线程

timeout:运行多长时间结束,如果不加入timeout就会一直执行

 

进程-使用top、vmstat 、pidstat观察服务器资源状态

top:系统负载非常高,us+sy达到100%,us系统态比sy用户态高

性能测试-CPU性能分析,上下文切换_第1张图片

vmstat 1:proc 的r队列有CPU竞争,memory free有轻微变化,in,cs有明显变化,cs特别高

性能测试-CPU性能分析,上下文切换_第2张图片

pidstat -w 1

cswch/s有1个自愿上下文切换数据比较大,而且每一个nvcswch/s非自愿上下文比较大,综合nvcswch/s稍微大一些

性能测试-CPU性能分析,上下文切换_第3张图片

 针对以上情况,可以说明:

  1. 通过top命令,观察整体情况,系统整体负载比较高:有持续攀升的可能。其中us态+sy态达到100%满负载,且sy态比us态整体要高
  2. 通过vmstat命令,具体分析,CPU资源不足:proc的r队列中,有明显的CPU竞争;memory的空闲内存则变化不大;system的in中断和cs上下文切换,有明显差异和变化,其中cs上下文切换整体偏高
  3. 通过pidstat命令,针对分析,非自愿上下文切换总数整体偏高一点:cswch有一个自愿上下文切换数据比较大,而且每一个nvcswch非自愿上下文比较大,综合nvcswch稍微大一些

综合上述数据得出:系统负载偏高,是由于非自愿上下文切换数据偏高,反映CPU资源不足;

所以解决办法如下:

  1. 增加CPU数量
  2. 迁移/停止与业务无关的服务,减少CPU竞争,降低系统负载
  3. 排查是否有慢SQL

 线程上下文切换

模拟同一个进程,有20个线程,来回切换上下文

stress-ng --cpu `nproc` --pthread 20 --timeout 150

 nproc :1cpu

pthread 20线程

线程-使用top、vmstat 、pidstat观察服务器资源状态

 top:系统负载非常高,load average比较大,负载高,且上升比较快,us,sy有数据,sy态尤其偏高,进程列表中CPU使用率也比较高,累计达100%

性能测试-CPU性能分析,上下文切换_第4张图片

 vmstat 1

vmstat 1:proc 的r队列有CPU竞争,memory内存有变化其中空闲内存有消耗,in,cs有明显变化,cs的数据比较大,cs比in的值要高

性能测试-CPU性能分析,上下文切换_第5张图片

  

pidstat -w 1

cswch自愿上下文数据,大于nvcswch非自愿上下文切换的数据,非自愿上下文切换的数据相对较小

性能测试-CPU性能分析,上下文切换_第6张图片

 针对以上情况,可以说明:

  1. 通过top命令,观察整体情况,load average比较大,负载高,且上升比较快;us,sy有数据,sy态尤其偏高,进程列表中CPU使用率也比较高,累计达100%
  2. 通过vmstat命令,具体分析,CPU资源不足:proc 的r队列有CPU竞争,memory内存有变化其中空闲内存锐减超过50%的消耗,in,cs有明显变化,cs的数据比较大,cs比in的值要高
  3. 通过pidstat命令,针对分析,cswch/s自愿上下文数据大于非自愿上下文切换的数据,非自愿上下文切换的数据相对较小

综合上述数据得出:系统负载偏高,是由于自愿上下文切换数据偏高,反映CPU资源不足;

所以解决办法如下:

  1. 增加CPU数量
  2. 增加集群中服务数量(单个进程减少线程数)

参考资料

面试官:生产环境发生问题,你一般怎么排查?(Linux工具篇)_Java识堂的博客-CSDN博客

CPU上下文切换、进程上下文、中断上下文_土豆西瓜大芝麻的博客-CSDN博客_进程上下文切换运行在内核态

怒啃 24 小时,终于搞懂上下文切换! | HeapDump性能社区

Linux性能优化:CPU篇 - 知乎

性能瓶颈--CPU(上下文切换) - 简书

你可能感兴趣的:(测试工程师,#,性能测试,linux,jmeter,性能测试,服务器)