通过/proc/stat计算CPU使用率介绍
linux通过/proc虚拟文件系统,想用户提供了系统内部状态信息,/proc/stat提供的就是系统CPU和任务统计信息
# cat /proc/stat | grep ^cpu
cpu 1206478 257 1197978 341057442 40732 0 785 0 0 0
cpu0 1206478 257 1197978 341057442 40732 0 785 0 0 0
- 第一行cpu没有编号,表示所有cpu的累加信息
- 第二行cpu0代表系统中单一cpu信息
每列数值按顺序介绍:
- user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
- nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
- system(通常缩写为 sys),代表内核态 CPU 时间。
- idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
- iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。iowait不太表磁盘i/o有瓶颈,只代表cpu上i/o操作占用的时间比,假如当前没其它进程运行,很小的i/o也会导致iowait升高
- irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
- softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
- steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
- guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
- guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间
可以通过/proc/stat 计算出CPU使用率,比如计算间隔1秒CPU使用率,需要在间隔1秒获取/proc/stat进行下面公式计算
- CPU使用率 = (1 - (new_空闲时间 - old_空闲时间) / (new_总CPU时间 - old_总CPU时间)) * 100
- 总CPU时间:user + nice + system + idle + iowait + softirq + steal + guest + guest_nice
- 空闲时间:idle
通过工具获取CPU使用率
top:显示系统整体CPU和内存使用情况,以及可以动态显示各个进程情况
ps:只显示每个进程资源使用情况
top输出:
top - 11:42:35 up 40 days, 12:35, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1883420 total, 531820 free, 120892 used, 1230708 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1577520 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31680 root 10 -10 130384 12896 5308 S 1.0 0.7 363:53.95 AliYunDun
1 root 20 0 190908 3480 2120 S 0.0 0.2 0:17.85 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
可以直观看到%Cpu(s)行显示了CPU的使用率信息,按1键可以展示所有CPU,在中间的空行下显示的为进程信息,这里 %CPU 的展示的就是该进程在内核态和用户态的CPU使用率总和
但是top并没有针对进程区分展示内核态和用户态分别CPU使用情况,这时候我们可以使用pidstat
命令查看
pidstat 1 5
Linux 3.10.0-693.2.2.el7.x86_64 (iz2zeab8t820b32tt9i96gz) 2019年12月15日 _x86_64_ (1 CPU)
11时48分52秒 UID PID %usr %system %guest %wait %CPU CPU Command
11时48分53秒 0 20554 0.00 1.00 0.00 1.00 1.00 0 kworker/0:0
11时48分53秒 0 31680 1.00 1.00 0.00 0.00 2.00 0 AliYunDun
- %usr :用户态使用率
- %system:内核态使用率
- %guest:运行虚拟机CPU使用率
- %wait :等待CPU使用率
- %CPU :总CPU使用率
常用参数:
-t:显示进程的所有线程信息
-w: 显示任务上下文切换报告
-u:显示CPU使用率
-d:显示进程占用磁盘i/o
CPU使用率升高程序分析工具
我们可以通过ps,top,pidstat定位到那个进程占用CPU使用比较多后,需要在定位这个进程里那个函数导致CPU使用率升高
- GDB:(The GNU Project Debugger), 这个功能强大的程序调试利器。的确,GDB 在调试程序错误方面很强大。但是,我又要来“挑刺”了。请你记住,GDB 并不适合在性能分析的早期应用
- perf :是 Linux 2.6.31 以后内置的性能分析工具。它以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题
Samples: 1K of event 'cpu-clock', 4000 Hz, Event count (approx.): 218249930 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
5.53% [kernel] [k] kallsyms_expand_symbol.constprop.1
4.92% [kernel] [k] finish_task_switch
4.22% perf [.] rb_next
- 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
- 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
- 第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
- 最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf第二种常见用法是 perf record 和perf report,在性能分析时候,perf top展示了性能信息,但是没有保存起来,无法离线分析,而perf record 用于保存数据,perf report用于展示保存的数据
网友评论