CPU理论,平均负载和CPU密集型场景

一. CPU理论知识点

二. 进程和线程

1. 什么是进程?

进程是正在进行的一个过程或者说一个任务,而负责执行任务的是CPU

2. 什么是线程?

线程是进程里面执行的最小单元,例如:一条流水线工作的过程(流水线的工作需要电源,电源就相当于CPU),而一条流水线必须属于一个车间,一个车间的工作过程就是一个进程,车间负责把资源整合到一起,是一个资源单元,而一个车间内至少有一条流水线

注意:

(1) LoadRunner中既有进程,又有线程

一般的HTTP协议:使用线程跑

java vuser协议:使用进程跑,要不然会出现失败或者压力上不去

(2) jmeter中只有线程

3. 进程与线程的区别

(1) 同一个进程内的多个线程共享该进程内的地址资源

(2) 创建线程的开销要远小于创建进程的开销(创建一个进程,就是创建一个车间,涉及到申请空间,而且在该空间内至少建一条流水线,但创建线程,就只是车间内建一条流水线,不需要申请空间,所以创建开销小)

三. CPU

1. 什么是CPU?

CPU就像人的大脑,主要负责相关事情的判断以及实际处理的机制

2. 查看命令

查看CPU的配置信息

cat /proc/cpuinfo   #查看CPU的配置信息

查看物理CPU的个数

cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l   #sort:排序,uniq去重,wc -l 统计数量

查看每个物理CPU中core的个数(核数)

cat /proc/cpuinfo | grep "cpu cores" | uniq

查看逻辑CPU的个数

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

逻辑CPU的个数/总核数 = 物理CPU的个数 x 每个物理CPU的核数

3. CPU架构

从处理器层面进行查看,从操作系统层面查看

四. 平均负载

在做性能测试的时候,发现响应时间越来越慢,或者功能测试的点点点,发现系统没有响应,我们通常做的第一件事,就是执行top或者uptime命令,来看系统的负载情况

1. uptime

这些输出是什么含义?最后这三个数字(重要):load average:0.00,0.01,0.05,依次表示:过去1分钟,5分钟,15分钟的平均负载(load average)

2. 平均负载

平均负载指的是单位时间内,系统处于可运行状态和不可中断的平均进程数,也就是平均活跃进程数,它和CPU的使用率并没有直接关系

可运行状态的进程是指正在使用CPU或者正在等待CPU的进程,也就是我们常用ps命令看到的进程

不可中断的进程是指处于内核状态关键流程中的进程,并且这些流程是不可打断的,比如最常见的等待硬件设备的I/O响应,可以通过top命令看到的状态(sleeping)。比如当一个进程向磁盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或中断打断的。所以不可中断状态实际上是系统对进程和硬件设施的一种保护机制

因此,可以简单理解为:平均负载就是平均活跃的进程数。平均活跃的进程数,直观上的理解就是单位时间内的活跃进程数

3. 平均负载的理想状态

每个CPU上刚好运行着一个进程,这样每个CPU都得到了充分利用,比如当平均负载为2时,意味着在只有2个CPU的系统上面,所有的CPU刚好被完全占用;在4个CPU的系统上面,CPU还有50%的空闲;在只有1个CPU的系统上面,有一半的进程竞争不到CPU

4. 在做性能测试的时候,平均负载为多少时合理?在uptime命令里,这三个时间段的平均负载数,多大时说明系统负载高?

load average:0.00,0.01,0.05

(1) 首先要知道有几个CPU

(2) 有了CPU个数,可以做出判断:当平均负载比CPU个数大时,系统出现了负载

那么这三个值(0.00,0.01,0.05),以哪个为参考?

实际上三个都要看,三个负载有什么参考意义呢?

如果1分钟,5分钟,15分钟的三个值基本相同或者相差不大,说明系统负载很平稳

如果1分钟的值远小于15分钟的值,说明系统最近1分钟的负载在减小,而过去15分钟内有很大的负载

反过来,如果1分钟的值远大于15分钟,说明系统最近1分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以需要持续观察

一旦1分钟的平均负载接近或超过CPU的个数,意味着系统正在发生过载的问题,需要分析哪里导致的

比如:在一个单CPU系统上面看到负载为1.73,0.60,7.98,那么说明在过去1分钟,系统有73%的负载,而在15分钟内,有698%的负载,从整体趋势来看,系统的负载在降低

5. 在实际生产环境中,平均负载多高时,就需要关注?

当平均负载超过CPU的70%的时候,就要进行分析排查负载过高的问题了,一旦负载过高,就可能导致进程响应变慢,影响服务的正常功能

6. 平均负载和CPU使用率:平均负载高了,是不是以为着CPU使用率也高了?

不一定。还是回到平均负载的含义上来:平均负载指的是单位时间内,处于可运行状态和不可中断状态的进程数,所以,它不仅包括了正在使用CPU的进程,还包括等待CPU和等待I/O的进程

五. 平均负载案例分析

三个不同的示例(CPU密集型进程,I/O密集型进程,大量等待CPU的进程),并用(iostat,mpstat,pidstat),找出平均负载升高的根源

1. 准备工作:预先安装stress和sysstat

stress是一个Linux系统压力测试工具

sysstat包含了常用的多核CPU性能工具,用来监控和分析系统的性能,包括了mpstat、pidstat、iostat、sar、sadf等

  mpstat是一个常用的多核CPU性能分析工具,用来实时查看每个CPU的性能指标以及所有CPU的平均指标

  pidstat是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,I/O以及上下文切换等性能指标

(1) 安装stress

yum install -y epel-release   #epel-release,这个软件包会自动配置yum的软件仓库。当然你也可以不安装这个包,自己配置软件仓库也是一样的
yum install -y stress

(2) 通过sz命令将sysstat-12.1.5.tar.gz上传到/opt目录下

cd /opt
tar -zxvf sysstat-12.1.5.tar.gz
cd sysstat-12.1.5
./configure
make
make install

2. 场景一:CPU密集型进程

(1) 在第一个终端运行stress命令,模拟一个CPU使用率100%的场景

stress --cpu 1 --timeout 600   #600,表示运行600s,也就是10分钟。对一个cpu进行压力测试,timeout就是要执行多长时间

(2) 在第二个终端运行uptime查看平均负载的变化情况

#直接输入uptime,只出现一次。要动态变化需要使用watch -d uptime
watch -d uptime   # -d:表示高亮显示变化的区域

(3) 在第三个终端运行mpstat查看CPU使用率变化情况

#-P ALL:表示监听所有的CPU,后面数字5表示间隔5秒更新一组数据
mpstat -P ALL 5

CPU:逻辑CPU ID,或者all表示总信息

%usr:用户态占用的比例

%nice:以nice优先级运行的进程用户态时间

%sys:系统时间(内核占用CPU的比例)

%iowait:I/O等待

%irq:硬件中断CPU的比例

%soft:软件中断CPU的比例

%steal:耗费在服务其他用户的时间

%guest:花在访客虚拟机的时间

%gnice

%idle:空闲的CPU时间

从终端二种可以看到,1分钟的平均负载会慢慢增加到1.00,从终端三中还可以看到,正好有一个CPU的使用率为100%,但它的iowait只有0。这说明:平均负载的升高正是由于CPU使用率为100%导致的

(4) 定位:是哪一个进程导致了CPU使用率为100%?

# -u:每隔5s后输出一组数据
pidstat -u 5 1

可以看到,stress进程的CPU使用率为100%

原文地址:https://www.cnblogs.com/my_captain/p/12661967.html