vlambda博客
学习文章列表

linux系统性能分析工具使用

一、开篇

该文通过实战性能分析来学习工具的使用和总结的大致分析步骤以供参考。

系统ubuntu 18.04

首先需安装如下:

    sudo apt-get install sysbench

    sudo apt-get install sysstat

    

二、性能分析

获取root;sudo -i 快速切换到root,不加-i会以非登录模式切换,不会拿到root的环境的变量开始前先查看当前系统的情况:
root@parallels-Parallels-Virtual-Platform:~# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 740352 385040 12516 112232 141 1207 6645 3878 1202 2485 16 8 73 3 0

cs:每秒上下文切换的次数 (当前2485次)
in:每秒中断的次数 (当前1202次)
r:就绪队列的长度,即正在运行和等待CPU的进程数 (当前2个)
b:处于不可中断睡眠状态的进程数 (当前0个)

接下来开启三个终端:
1号终端(用来模拟多个线程):
运行如下:
sysbench –threads=5 –max-time=300 threads run (以5个线程运行5min,模拟多线程切换)

2号终端(用于显示虚拟内存状态、进程、内存、I/O等系统整体运行状态): 运行:vmstat 1 (每隔1s输出一次数据) procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 6 0 787456 210536 19800 284736 46 227 1203 681 381 2985 5 3 92 1 0 5 0 787456 210140 19800 284800 0 0 0 0 2826 3074732 22 77 1 0 0 5 0 787456 210120 19800 284800 0 0 0 0 1682 3034090 26 74 0 0 0 5 0 785920 207784 19800 284800 1700 0 1700 0 3041 2965201 27 73 0 0 0 5 0 785920 208668 19800 284800 0 0 0 0 2293 3067836 23 76 1 0 0 5 0 785920 208480 19800 284800 4 0 4 0 1416 3196529 22 79 0 0 0 5 0 785920 208400 19800 284800 0 0 0 0 1493 3103016 25 75 0 0 0 5 0 785920 208492 19808 284792 4 0 4 24 2953 3141558 22 78 1 0 0 5 0 785920 209724 19808 284800 0 0 0 0 2560 3178636 23 77 0 0 0
cs:由2485骤然升到300万 r:超过2(我的是双核),说明有大量的CPU竞争 us和sy:这两项的CPU使用率加和基本接近甚至相等100%,其中sy高达80%,说明CPU主要被内核占用 in:上升到2000多,暗示可能有大量中断处理
3号终端(分析进程和线程的切换情况): 运行:pidstat -tw -u 1 (-t:输出线程切换指标 -w:输出进程切换指标 -u:输出CPU使用指标) 19时53分49秒 UID TGID TID %usr %system %guest %wait %CPU CPU Command 19时53分50秒 0 11329 - 39.42 100.00 0.00 0.00 100.00 1 sysbench
19时53分53秒 UID TGID TID cswch/s nvcswch/s Command 19时53分54秒 0 - 11330 2790.00 592087.00 |__sysbench 19时53分54秒 0 - 11331 883.00 602458.00 |__sysbench 19时53分54秒 0 - 11332 3152.00 669423.00 |__sysbench 19时53分54秒 0 - 11333 1024.00 672398.00 |__sysbench 19时53分54秒 0 - 11334 1471.00 623371.00 |__sysbench 19时53分54秒 1000 11350 - 1.00 596.00 pidstat        19时53分54秒  1000         -     11350      1.00    596.00  |__pidstat        
通过pidstat可以看出,CPU使用率达到100%的原因是sysbench的启动,但是sysbench的主线程上下文切换次数之和并不多,也就7000左右,而引起cs达到300万的是它的子线程上下文切换次数,那上下文切换次数增多的根源是什么呢? 中断次数?
查看中断次数,相比之前上升了1000多,查看/proc/interrupts文件(该文件中断使用情况,而/proc是linux的一个虚拟文件系统,用于内核空间和用户空间之间的通信)
运行:watch -d cat /proc/interrupts CPU0 CPU1 RES:    1044941    1037576   Rescheduling interrupts
可以观察到RES的变化是最快的,RES代表重调度中断,该中断表示唤醒空闲状态的CPU来调度新的任务运行,这是SMP(多处理器系统)中用来分散任务到不同CPU的机制,也叫做处理期间中断(IPI)。 这样中断的升高还是因为过多的任务调度,跟之前的上下文切换次数分析一致。

总结,我们 掌握了linux系统性能分析的几个工具,同时了解了 stress和sysbench的区别: stress是基于多进程,会fork多个进程导致进程上文切换,导致us开销很大,sysbench是基于多线程,创建多个线程,单一进程基于内核线程切换,导致sy内核开销很大;最后我们知道了 性能分析的基本步骤:
  • 过uptime查看系统负载;

  • 使用mpstat,pidstat判断是CPU计算量大还是进程争抢CPU;

  • 使用vmstat分析上下文切换次数,查看中断情况,进一步分析是CPU竞争激烈还是IO操作频繁;


觉得不错,点击 “分享”,“赞”,“在看” 传播给更多热爱嵌入式的小伙伴吧!