文章目录
CPU 性能分析
- 进程状态(R、S、D、T、Z、X)
- 常用top、pidstat、mpstat、vmstat、perf、ps、pstree、strace、uptime
查看系统调用
- -T 打印系统调用花费的时间
- -tt 打印系统调用的时间点
- -s 输出的最大长度,默认32,对于调用参数较长的场景,建议加大
- -f 是否追踪fork出来子进程的系统调用,由于服务端服务普通使用线程池,建议加上
- -p 指定追踪的进程pid
- -o 指定追踪日志输出到哪个文件,不指定则直接输出到终端
- strace -T -tt -f -s 10000 -p pid -o strace.log
查看cpu 个数
- lscpu 或 cat /proc/cpuinfo
- root@tr02n29:~# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 72
On-line CPU(s) list: 0-71
Thread(s) per core: 2 <-- 开启了intel HT (超线程)功能,每个物理核虚拟出2个核
Core(s) per socket: 18 <-- 每个 cpu 18个核
Socket(s): 2 <-- cpu 数量
NUMA node(s): 2 <-- numa跟socket一致,可以让应用程序意识到内存分本地和远程2种。有些服务器会禁用这个信息,只能看到1个numa。
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) Gold 6240 CPU @ 2.60GHz <-- 主频标称2.6G, 并不是实际运行频率
Stepping: 7
CPU MHz: 1000.021
CPU max MHz: 3900.0000 <-- cpu主频可以达到的最大值。这个是turbo(睿频)功能,可以让core降频和升频,以达到总体功耗一定的情况下,尽量让需要cpu的应用获得更高的频率。
CPU min MHz: 1000.0000
BogoMIPS: 5201.79
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 1024K
L3 cache: 25344K
NUMA node0 CPU(s): 0-17,36-53 <-- 属于第一个cpu的核。其中 0和36是一对超线程,共用一个核
NUMA node1 CPU(s): 18-35,54-71
查看某个进程
ps -ef -p 或者top -p
查看进程下的线程
ps -T -p或pstree -p或top -Hp
查看进程的上下文切换
上下文切换
- 进程上下文切换、线程上下文切换、中断上下文切换
- 一次系统调用完成两次上下切换
- 过多的上下文切换会把CPU时间消耗在寄存器、内核栈、以及虚拟内存等数据的保存和恢复上,从而缩短进程真正的运行时间。
- 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
- pidstat -p pid -w 1
- cswch/s 自愿切换次数/s nvcswch/s 非自愿切换次数/s
- pidstat -wt 1 线程上下文切换
查看系统调用
- perf top -g -p 或perf record -g -p 或perf reprort
软中断
- top 提供总的中断次数
- mpstat 或者cat /proc/softirqs 提供在每个cpu 上的中断次数
硬中断
- vmstat 提供总的中断次数(in),wa 表示cpu 等待io 时间
- /proc/interrupts 提供在每个cpu 累积中断次数
查看某个进程父子关系
- pstree -aps
堆栈调用日志分析
- kill -10 pid
查看进程资源利用率
- pidstat -lu -p pid
平均负载
- 平均负载理想的情况load是等于CPU 个数 ,是CPU得到充分利用也不至于浪费,服务稳定情况下适当选择核心数。
- CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:
- CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
- I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
- 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。
- uptime 1 5 15分钟(如果这三个值从右至左减小,则表现cpu 使用压力减小,反之则增大。)
- 短时应用导致平均负载升高
- 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发现。
- 第二,应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。
CPU绑核调优
- 最常用的cpu调优方式,可以让cpu 充分利用L1 和L2 缓存,以及本地内存。
- 显示目前绑定状态
taskset -pca 64352 - 把进程绑定到cpu 0-3:
taskset -pca 0-3 64352