前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件性能测试(连载6)

软件性能测试(连载6)

作者头像
顾翔
发布2020-02-19 15:28:31
8430
发布2020-02-19 15:28:31
举报

2.2 Linux的性能监控

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

1. CPU
1)uptime命令

#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 average:0.17, 0.16, 0.12。

最近1分钟、5分钟和15分钟的平均负载为0.17、0.16和0.12。

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

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

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

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

•查看物理CPU个数。

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

2

2•查看每个物理CPU中core的核数。

#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-11:CPU负载分析

•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负载逐渐变大。

2)top命令

#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.57和0.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

用Top、PS命令获取不到

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 命令(同时看见CPU与I/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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试培训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.2 Linux的性能监控
    • 1. CPU
      • 1)uptime命令
      • 案例3-11:CPU负载分析
      • 2)top命令
      • 3)平均负载和CPU使用率
      • 4)不可中断的睡眠态进程
      • 5)僵尸进程
相关产品与服务
应用性能监控
应用性能监控(Application Performance Management,APM)是一款应用性能管理平台,基于实时多语言应用探针全量采集技术,为您提供分布式性能分析和故障自检能力。APM 协助您在复杂的业务系统里快速定位性能问题,降低 MTTR(平均故障恢复时间),实时了解并追踪应用性能,提升用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档