专栏首页用户6517667的专栏软件性能测试(连载8)

软件性能测试(连载8)

10)上下文切换

CPU依次处理上述任务的调度方法是切换。切换分为“进程切换”“线程切换”和“中断切换”。中断切换即在本节“软中断与硬中断”中提及的,当系统中有非常重要的请求来临,CPU停止手头工作,触发硬中断。“进程切换”和“线程切换”,在切换前都要调取上次保存的信息,在切换后都要保存当前的信息。“进程切换”和“线程切换”合在一起叫做上下文切换(context switches)。图3-21为当前仅有2个任务等待CPU处理下的进程下文切换。

图3-21 进程上下文切换

由此可见上下文切换的优点在于,每个进(线)程具有同等的CPU处理权利,缺点是进(线)程的保存和载入消耗资源。由于线程信息比进程信息要少,所以线程上下文切换优于进程上下文切换。等待的进(线)程,位于CPU的最外层Ring3,而当前正在处理的进(线)程位于CPU内核,即Ring0,如图3-22所示。

图3-22 等待CPU处理的进程和正在CPU处理的进程所处CPU位置

可以通过命令vmstat interval count来查看CPU的中断数和进线程上下文切换数。在这里interval为多长描述输出一次,count为总共输出的次数。比如:“vmstat5 3”表示每5s输出一次,总共输出3次。

#vmstat 1 1

procs -----------memory---------- ---swap-- -----io-----system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 1000 0

这里的输出含义见表3-6所示。

表3-6 vmstat命令输出详解

总标识

标识

意义

process

r

展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU个数,就会出现CPU瓶颈

b

每秒VMM等待队列的核心线程平均数

system

in

在某一段时间间隔中观察到的每秒设备中断数

cs

在某一段时间间隔中观察到的每秒上下文切换数

CPU

us

用户方式下花费的百分比

sy

系统方式下执行一个进程花费的百分比

id

没有使用本地磁盘I/O时CPU空闲或等待时间百分比

wa

等待I/O CPU时间百分比

在System中cs就表述在某一段时间间隔内每秒上下文切换的个数。上下文切换又分为自愿上下文切换(voluntary context switches)和非自愿上下文切换(non voluntary context switches)两种。自愿上下文切换是指到了切换时间点,进(线)程由于所需的资源不足,比如没有获得进(线)程处理所需的数据而资源CPU让出去,去处理其他进(线)程而非自愿上下文切换是指指到了切换时间点,没有数据资源不足的情形发生,此进(线)程不得不把CPU资源让出来去处理其他正在等待的进(线)程。所以当自愿上下文切换比较多,说明I/O或者内存存在瓶颈;而非自愿上下文切换比较多,说明目前有很多进(线)程需要CPU处理。可以通过命令pidstat(需要安装sysstat插件)查看自愿上下文切换和非自愿上下文切换。

#每隔 5 秒输出 1 组数据

#pidstat -w 5

Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)

08:18:26 UID PID cswch/snvcswch/s Command

08:18:31 0 1 0.20 0.00 systemd

08:18:31 0 8 5.40 0.00 rcu_sched

...

这里的cswch/s和nvcswch/s就表示每秒自愿上下文切换和非自愿上下文切换个数。

11)perf top和perf record命令

perf top命令可以显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数。如图3-23所示。

图3-23 perf top

perf top 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后续进行分析。

perf record 则提供了保存数据的功能,保存后的数据,需要用 perf report 解析展示。

注意:并不是所有的函数或指令都可以用perf top或perf record获得的。

12)短时进程

对于一些仅存在几毫秒的进程,当数量很大的时候也会给CPU带来很大的负载,而这些进程基本上用top或ps命令很难被获取到,这个时候就需要使用execsnoop命令了。这个命令工具可以通过https://github.com/brendangregg/perf-tools/blob/master/execsnoo获得。

13)显示10个消耗CPU最多的进程

可以通过ps aux|sort -rnk +3|head -10查看10个消耗CPU最多的进程。

#ps aux|sort -rnk +3|head -10

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 99 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_20]

root 98 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_19]

root 97 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_18]

root 96 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_17]

root 95 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_16]

root 94 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_15]

root 93 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_14]

root 92 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_13]

root 91 0.0 0.0 0 0? S 08:18 0:00 [scsi_eh_12]

14)在多CPU的系统里,查看所有CPU的信息

可以使用mpstat查看多CPU的系统里中的信息。

#mpstat

Linux 4.15.0-46-generic(ubuntu) 10/30/2019 _x86_64_(4 CPU)

02:59:04 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle

02:59:04 AM all 15.29 4.91 17.24 2.76 0.00 1.08 0.00 0.00 0.00 58.71

15)小结

本节所涉及的概念有CPU负载、CPU使用率、不可中断的睡眠态进程、僵尸进程、CPU状态转换、软中断与硬中断、CPU节拍率和上下文切换。涉及到的命令有uptime、/proc/cpuinfo、top、dstat、pstree、/proc/softirqs、ps aux | grep softirq、watch、sar -n DEV 1、grep 'CONFIG_HZ=' /boot/config-$(uname -r)、vmstat、pidstat、perf top、perf record、execsnoop、ps aux|sort -rnk +3|head -10 和 mpstat。

本文分享自微信公众号 - 软件测试培训(iTestTrain),作者:顾翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 无力吐槽的自动化现状及自我感受

      从2017年6月开始接触自动化至今,已经有2年多了,从17年接触UI自动化(unittest+selenium)到18年接触接口自动化(unittest+r...

    小老鼠
  • Linux CPU监控

    负载为1表示当前单核CPU全部占用,如果一台机器有3个CPU,每个CPU都是双核的,这是负载最大值为1×2×3=6。如果5分钟以及15分钟的负载指标的大于CPU...

    小老鼠
  • 如何测试人工智能模型:QA入门指南

    https://dzone.com/articles/how-to-test-ai-models-an-introduction-guide-for-qa-1

    小老鼠
  • WGS实战笔记(二)

    -----------------------------------------分割线------------------------------------...

    liu_ll
  • 学界 | 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源

    AI 科技评论按:近年来,卷积神经网络在人脸检测中取得了很大的成功,然而这些方法在处理人脸中多变的尺度,姿态,遮挡,表情,光照等问题时依然比较困难。为此,腾讯优...

    AI科技评论
  • 大数据常见面试知识点(二)

    Client:切分文件;访问或通过命令行管理HDFS;与NameNode交互,获取文件位置信息;与DataNode交互,读取和写入数据。

    加米谷大数据
  • ROS(indigo)RRT路径规划

    源码地址:https://github.com/nalin1096/path_planning

    zhangrelay
  • 【赛题分析】分拣排序(中)

    信息处理篇 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    EdenChen
  • CentOS7.6服务器部署VNC

    打开vnc-viewer,输入需要访问的ip和端口号即可进行访问,本文中使用的ip为:10.10.41.43::5901

    拓荒者
  • Java编程思想第五版精粹(五)-初始化和清理(中)

    初始化很重要,而清理工作也同样重要。毕竟,谁会去清理一个 int?但使用完一个对象就不管了,这并非总是安全的操作。

    JavaEdge

扫码关注云+社区

领取腾讯云代金券