一. 理解相关的性能指标
1.理解CPU使用率
CPU 使用率描述了非空闲时间占总 CPU 时间的百分比,根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断。
>用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙。
>系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙。
>等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长。
>中断 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,通常说明系统发生了大量的中断。
>除了上面这些,还有在虚拟化环境中会用到的窃取 CPU 使用率(steal)和客户 CPU 使用率(guest),分别表示被其他虚拟机占用的 CPU 时间百分比,和运行客户虚拟机的 CPU 时间百分比。
2.理解平均负载
平均负载是指系统在单位事件内平均活跃进程数,包括活跃进程和不可中断进程,它反应了系统的整体负载情况。理想情况下,平均负载等于逻辑 CPU 个数,这表示每个 CPU 都恰好被充分利用。
3.理解上下文切换
上下文切换是指CPU因进程、线程或中断处理而进行的寄存器、计数器的保存和恢复操作。
其一,为了保证所有进程可以的公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 的进程运行。
其二,进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。
其三,当进程通过睡眠函数 sleep 这样的方法将自己主动挂起时,自然也会重新调度。
其四,当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行。
其五,发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核中的中断服务程序。
二. 合理利用工具
1.stress:系统压力测试工具,常用作用作异常进程模拟平均负载升高的场景
模拟cpu密集型: stress --cpu 1 --timeout 600
模拟IO密集型: stress -i 1 --timeout 600
模拟进程密集型:stress -c 8 --timeout 600
2.mpstat:常用的多核CPU性能分析工具,用来实时查看每个CPU的性能指标
root>mpstat -P ALL 5
Linux 3.10.0-514.6.2.el7.x86_64 (Redis1) 05/20/2020 _x86_64_ (4 CPU)
02:12:51 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
02:12:56 PM all 0.15 0.00 0.15 0.00 0.00 0.00 0.00 0.00 0.00 99.70
02:12:56 PM 0 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60
02:12:56 PM 1 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60
02:12:56 PM 2 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60
02:12:56 PM 3 0.20 0.00 0.20 0.00 0.00 0.20 0.00 0.00 0.00 99.40
3.iostat:查看系统CPU和磁盘IO读写情况
root>iostat -d 2 2
Linux 3.10.0-514.6.2.el7.x86_64 (Redis1) 05/20/2020 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vdb 2.10 0.01 972.60 271809 24005518460
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vdb 0.00 0.00 0.00 0 0
4.pidstat: 查看指定或全部进程的CPU、内存、I/O 以及上下文切换情况
root> pidstat -d
Linux 3.10.0-514.6.2.el7.x86_64 (Redis1) 05/20/2020 _x86_64_ (4 CPU)
02:35:45 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
02:35:45 PM 0 1 0.01 0.10 0.01 systemd
02:35:45 PM 0 44 0.00 0.00 0.00 khugepaged
02:35:45 PM 0 284 0.00 1.32 0.00 jbd2/vda1-8
5.vmstat:查看系统内存试用和CPU的上下文切换及中断处理
root>vmstat 2 5
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 1818008 298148 4534344 0 0 0 247 0 0 1 0 98 0 0
0 0 0 1817372 298148 4534344 0 0 0 0 1059 1533 1 1 99 0 0
0 0 0 1816876 298148 4534348 0 0 0 24 949 1447 0 0 99 0 0
0 0 0 1816876 298148 4534348 0 0 0 34 874 1404 0 0 99 0 0
0 0 0 1816752 298148 4534348 0 0 0 12 871 1385 0 0 100 0 0
6.perf top: 以事件采集为基础分析系统各种事件和内核性能,还可以分析指定应用程序的性能问题
root> perf top
Samples: 1K of event ‘cpu-clock‘, 4000 Hz, Event count (approx.): 425250000 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
5.47% perf [.] __symbols__insert
4.17% perf [.] rb_next
3.94% libc-2.17.so [.] __GI_____strtoull_l_internal
3.47% [kernel] [k] kallsyms_expand_symbol.constprop.1
第一列 Overhead 该符号的性能事件在所有采样中的比例,用百分比来表示
第二列 Shared 该函数或指令所在的动态共享对象(Dynamic Shared Object)如内核、进程名、动态链接库名、内核模块名
第三列 Object 动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间
第四列 Symbol 符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示
root>perf top -g -p pid
-g:开启调用关系 -p:指定进程的pid