软件性能测试(连载6)

简介: 软件性能测试(连载6)

2.2 Linux的性能监控


本节以Ubuntu Linux为例进行介绍。


1. CPU

1uptime命令
#uptime
08:26am up   7 min,  2 users, load average: 0.17, 0.16, 0.12


08:26am

当前时间是08:26am


up 7 min

已经启动了7分钟。


2 users

当前有2个用户登录。


load average0.17, 0.16, 0.12

最近1分钟、5分钟和15分钟的平均负载为0.170.160.12

负载为1表示当前单核CPU全部占用,如果一台机器有3CPU,每个CPU都是双核的,这是负载最大值为1×2×3=6。如果5分钟以及15分钟的负载指标的大于CPU个数×CPU核数×0.7,并且长时间比较高,说明CPU不够用。


总核数 = 物理CPU个数×每颗物理CPU的核数。


总逻辑CPU = 物理CPU个数×每颗物理CPU的核数×超线程数。

通过以下命令可以查看CPU个数、每个物理CPUcore的核数、逻辑CPU的个数和CPU信息(型号)。


查看物理CPU个数。

#cat /proc/cpuinfo| grep "physical id"|sort| uniq| wc -l
2


2查看每个物理CPUcore的核数。

#cat /proc/cpuinfo| grep "cpu cores"|uniq
cpu cores: 2


查看逻辑CPU的个数。

#cat /proc/cpuinfo| grep "processor"| wc-l
4


4查看CPU信息(型号)。

#cat /proc/cpuinfo | grep name | cut -f2 -d: |uniq -c
      4  Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz


案例3-11CPU负载分析

Load average: 0.5,0.5,0.5

表示最近15分钟内CPU负载没有变化。

Load average: 0.5,2,5

表示最近15分钟内CPU负载逐渐变小。

Load average: 5,2,0.5

表示最近15分钟内CPU负载逐渐变大。


2top命令
#top
top - 18:00:48 up 4 min,  1 user, load average: 0.88, 0.57, 0.26
Tasks: 343 total,  1 running, 229 sleeping,   0stopped,   0 zombie
%Cpu(s): 2.6 us,  4.2 sy,  0.0 ni, 93.1 id,  0.0 wa, 0.0 hi,  0.2 si,  0.0 st
KiB Mem : 4312632 total,  1931028 free,  1392792 used,   988812 buff/cache
KiB Swap:  969960 total,   969960 free,        0 used. 2657976 avail Mem
PID USER     PR  NI    VIRT   RES    SHR S  %CPU %MEM    TIME+ COMMAND
2179 jerry    20   0 3647552 177412  79692 S 14.2  4.1   0:10.86 gnome-shell
2049 jerry    20   0  474988 101148 47332 S   6.0  2.3  0:04.23
2531 jerry    20   0  800760 37440  27580 S   2.3 0.9   0:01.31 gnome-terminal-
2013 _apt     20   0   88940  8816   7840 S   1.7 0.2   0:02.26 http


可以按下键盘上的【1】键切换到显示各颗CPU的状态。

top - 18:32:05 up 29 min,  1 user, load average: 0.91, 0.35, 0.13
Tasks: 304 total,  1 running, 225 sleeping,   0stopped,   0 zombie
%Cpu0 :  2.0 us,  3.7 sy, 0.0 ni, 94.3 id,  0.0 wa,  0.0 hi, 0.0 si,  0.0 st
%Cpu1 :  0.7 us,  0.7 sy, 0.0 ni, 98.7 id,  0.0 wa,  0.0 hi, 0.0 si,  0.0 st
%Cpu2 :  0.3 us,  0.3 sy, 0.0 ni, 99.3 id,  0.0 wa,  0.0 hi, 0.0 si,  0.0 st
%Cpu3 :  0.3 us,  2.0 sy, 0.0 ni, 97.6 id,  0.0 wa,  0.0 hi, 0.0 si,  0.0 st


这里的CPU颗数为4。可以看出第一行的内容就是uptime命令的内容。


top - 18:00:48 up 4 min,  1 user, load average: 0.88, 0.57, 0.26

表示当前时间为18:00:48,持续运行了4分钟,当前有1个用户登录,最近1分钟、5分钟和15分钟的平均负载为0.88,0.570.26

top命令第二行显示的是各个CPU状态的进程数。


Tasks: 343 total,  1 running, 229 sleeping,   0stopped,   0 zombie

上面显示结果表示当前共有现在共有343个进程,1个处于运行状态,229个处于睡眠状态,停止状态和僵尸状态的进程都为0。对于各个状态,如表3-4所示。


3-4 CPU状态

标号

中文名

英文名

解释

D

不可中断的睡眠态

uninterruptible  sleep

进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。通常出现在I/O阻塞

R

运行态

running or  runnable

表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。

S

可中断的睡眠态

Interruptible  sleep

进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。

T

被跟踪或已停止

stooped

表示进程处于暂停或者跟踪状态(命令行调试)

Z

僵尸态

zombie

进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。

I

空闲状态

Idle

也就是空闲状态,用在不可中断睡眠的内核线程上。D 状态的进程会导致平均负载升高, I 状态的进程却不会。

X

死亡状态

dead

TopPS命令获取不到


top命令第三行表示CPU概览:%Cpu(s)表示CPU使用百分比,按照时间占用计算,单位s。其含义如表3-5所示。


3-5 CPU概览

标记

缩写

含义

user

%us

代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。

system

%sy

代表内核态 CPU 时间。

nice

%ni

代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的  CPU 时间。这里注意,nice 可取值范围是 -20 19,数值越大,优先级反而越低。

idle

%id

代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。

iowait

%wa

代表等待  I/O CPU 时间。

irq

%hi

代表处理硬中断的 CPU 时间。

softirq

%si

代表处理软中断的 CPU 时间。

steal

%st

虚拟 CPU 等待实际 CPU  的时间的百分比

guest


代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。

guest_nice

gnice

代表以低优先级运行虚拟机的时间。


%Cpu(s): 2.6 us,  4.2 sy,  0.0 ni, 93.1 id,  0.0 wa, 0.0 hi,  0.2 si,  0.0 st


上面显示结果表示2.6%占有用户态 CPU 时间、4.2%占有内核态 CPU 时间,93.1%是空闲时间,处理软中断的占0.2%


3)平均负载和CPU使用率

CPU 使用率,是单位时间内CPU繁忙情况的统计,和平均负载并不一定完全对应。

CPU 密集型进程。

使用大量CPU会导致平均负载升高,平均负载和CPU使用率是一致的。

I/O 密集型进程。

等待I/O也会导致平均负载升高,但CPU使用率不一定很高。


平均负载是指单位时间内,系统处于可运行状态的R状态进程数+不可中断状态的D 状态(Disk Sleep)进程数之。而处于可运行状态R状态的进程又包括正在使用 CPU进程和正在等待CPU的进程,不可中断状态的D 状态(Disk Sleep)进程即正处于等待I/O的进程。


4)不可中断的睡眠态进程

不可中断的睡眠态的进程一般均为在运行过程中需要I/O提供数据。处于等待I/O状态的进程,由于这种是不可被打断的并且又处于睡眠态,所以叫做不可中断的睡眠态。如果系统中不可中断的睡眠态的进程比较多,可以确认系统在I/O上遇到了瓶颈。而这些I/O往往是磁盘I/O。由于与磁盘读写有关系,建议使用dstat 命令(同时看见CPUI/O信息)来分析。


#dstat 10 1
You did not select any stats, using -cdngy bydefault.
--total-cpu-usage-- -dsk/total- -net/total----paging-- ---system--
usr sys idl wai stl| read  writ | recv send     |  in  out | int   csw
  1   1  99   0    0 | 9232k 470k|   0     0      |   0     0  | 129   192


从上面可以看见有9232K的数据处于磁盘读操作,性能低的瓶颈可能有进程在读磁盘。


一般而言直接读写磁盘,对 I/O 敏感型应用(比如数据库系统)是很友好的,因为可以在应用中,直接控制磁盘的读写。但在这种情况是非常消耗CPU资源的,最好还是通过系统缓存来优化磁盘 I/O的读写,换句话说,删除O_DIRECT 这个选项就可以了。下面代码就是直接读写磁盘。


open(disk, O_RDONLY|O_DIRECT|O_LARGEFILE, 0755)


5)僵尸进程

现在来介绍一下僵尸进程,僵尸进程是由于父进程建立子进程以后没有及时回收造成的。看一下正常父进程创建子进程,子进程结束后父进程收回的流程。

1)父进程创建子进程。

2)父进程调用wait()或者waitpid()等待子进程结束。

3)子进程结束向父进程发送SIGCHLD 信号。

4)父进程收到SIGCHLD 信号后注册SIGCHLD信号的处理函数。

5)父进程异步回收子进程的资源。


如果父进程在创建子进程后没有调用wait()或者waitpid()等待子进程结束或者子进程结束后没有给父进程发SIGCHLD 信号就造成僵尸进程,如下代码。

int status = 0;
  for (;;) {
    for (intsign = 0; sign < 5; sign ++) {
      if(f()==0) {
        sub_process();
      }
    }
    sleep(3);
  }
while(wait(&status)>0);


这段代码while语句放在了循环外面,这样wait()方法没有时机被调用,所以容易产生僵尸进程。在调试的时候可以使用pstree-aps <PID> 查看<PID>下的所有子进程(其中参数a表示输出命令行选项、p表示PID以及s表示指定进程的父进程)。


#pstree -aps 3785
systemd,1 auto noprompt
  └─systemd,1894 --user
      └─gnome-terminal-,2416
          └─bash,3772
             └─bash,3782
                 └─python3,3783 manage.py runserver 0.0.0.0:8000 --insecure
                      └─python3,3785 manage.py runserver 0.0.0.0:8000 --insecure
                         └─{python3},3787
目录
相关文章
|
人工智能 安全 网络安全
Burp Suite Professional 2025.5 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.5 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件
566 3
|
8月前
|
Java 测试技术 网络安全
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
355 0
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
|
测试技术 开发者 Python
自动化测试之美:从零构建你的软件质量防线
【10月更文挑战第34天】在数字化时代的浪潮中,软件成为我们生活和工作不可或缺的一部分。然而,随着软件复杂性的增加,如何保证其质量和稳定性成为开发者面临的一大挑战。自动化测试,作为现代软件开发过程中的关键实践,不仅提高了测试效率,还确保了软件产品的质量。本文将深入浅出地介绍自动化测试的概念、重要性以及实施步骤,带领读者从零基础开始,一步步构建起属于自己的软件质量防线。通过具体实例,我们将探索如何有效地设计和执行自动化测试脚本,最终实现软件开发流程的优化和产品质量的提升。无论你是软件开发新手,还是希望提高项目质量的资深开发者,这篇文章都将为你提供宝贵的指导和启示。
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
安全 测试技术 Linux
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
395 2
Flawnter 5.9.1 (macOS, Linux, Windows) - 应用程序安全测试软件
|
人工智能 安全 网络安全
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
597 4
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
|
12月前
|
测试技术
软考软件测评师大题——案例分析之白盒测试
历年下午案例试题一固定考察白盒测试,主要包含三大核心问题:推导逻辑条件、绘制控制流图及计算环路复杂度、确定线性无关路径集合。内容涵盖覆盖层级标准(语句、分支、判定、条件覆盖等)、控制流图构建规范(顺序、分支、循环结构转换原则)、环路复杂度计算公式以及线性无关路径生成方法。通过典型题型示例解析,如代码路径分析与验证指标,帮助考生掌握解题思路和技巧。
|
12月前
|
测试技术
软考软件评测师——可靠性测试测试方法
软件可靠性是指软件在规定条件和时间内完成预定功能的能力,受运行环境、软件规模、内部结构、开发方法及可靠性投入等因素影响。失效概率指软件运行中出现失效的可能性,可靠度为不发生失效的概率,平均无失效时间(MTTF)体现软件可靠程度。案例分析显示,嵌入式软件需满足高可靠性要求,如机载软件的可靠度需达99.99%以上,通过定量指标评估其是否达标。
|
12月前
|
安全 测试技术 持续交付
软考软件评测师——基于风险的测试技术
本文详细阐述了测试计划的核心要素与制定流程,涵盖测试范围界定、实施策略规划、资源配置及风险管理机制。通过风险识别方法论和评估模型,构建了完整的质量保障体系。同时,针对不同测试级别与类型提供具体配置建议,并提出技术选型原则与实施规范,确保测试活动高效有序开展,为项目成功奠定基础。内容结合实际经验,具有较强指导意义。