认识CPU

以前听说过一个面试题:如何使CPU使用率达到100%的JAVA代码应该如何编写?笔者心想开几个死循环的线程也就差不多了,启动6个死循环线程,在mac系统中使用top查看,发现cpu达到了600%+,机器CPU是4核的,跑到400%还能接受,600%就真的不懂了。

cpu-rate

由此,笔者发现围绕CPU,自身有一些知识盲点,曾经那些计算机基础课程全部还给老师了^_^,所以就有了这篇文章。

1. 什么是CPU

中央处理器(英文Central Processing Unit,CPU)是一台计算机的运算核心和控制核心,其功能主要是解释计算机指令以及处理计算机软件中的数据。

CPU的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列。CPU从逻辑上可以划分成3个模块,分别是控制单元、运算单元和存储单元。其内部架构如下:

cpu-principle

差不多所有的CPU的运作原理可分为四个阶段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。

2. 描述CPU的关键参数

这一节着重介绍几个描述CPU的关键概念:主频、缓存、核心数、线程数、负载和使用率。

2.1 主频

CPU的主频,即CPU内核工作的时钟频率(CPU ClockSpeed)。通常所说的某某CPU是多少兆赫的,而这个多少兆赫就是“CPU的主频”。

以Intel Core i3-8350k为例,它的默频是4GHz,意味着它内部时钟频率为4GHz,一秒钟可以产生40亿个脉冲信号,换句话说每一个脉冲信号仅仅用时0.25ns(时钟周期)。时钟周期作为CPU操作的最小时间单位,内部的所有操作都是以这个时钟周期作为基准。一般来说CPU都是以时钟脉冲的上升沿作为执行指令的基准,频率越高,CPU执行的指令数越多,工作速度越快。

很多人认为CPU的主频就是其运行速度,其实不然。CPU的主频表示在CPU内数字脉冲信号震荡的速度,与CPU实际的运算能力并没有直接关系。主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(缓存、指令集,CPU的位数等等)。

2.3 缓存

在计算机系统中,CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。

2.4 核心数

CPU的核心数是指物理上,也就是硬件上存在着几个核心。比如,双核就是包括2个相对独立的CPU核心单元组,四核就包含4个相对独立的CPU核心单元组。

2.5 线程数(对应逻辑CPU)

CPU 的线程数概念仅仅只针对 Intel 的 CPU 才有用,因为它是通过 Intel 超线程技术来实现的,最早应用在 Pentium4 上。如果没有超线程技术,一个 CPU 核心对应一个线程(因此对于一个CPU,线程数总是大于或等于核心数的)。所以,对于 AMD 的 CPU 来说,只有核心数的概念,没有线程数的概念。

CPU 之所以要增加线程数,是源于多任务处理的需要:线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间 CPU 能同时并行处理的任务数。因此,线程数是一种逻辑的概念,简单地说,就是模拟出的 CPU 核心数。一个核心最少对应一个线程,但英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥 CPU 性能,即一个核心可以有两个到多个线程。

正是因为逻辑CPU的存在,才会导致本文一开始产生的问题,4核cpu的使用率可以达到400%以上。

linux 中查看cpu核数和线程数:

# 查看 cpu 型号
sudo dmidecode -s processor-version
# 查看 cpu 个数
grep 'physical id' /proc/cpuinfo | sort -u | wc -l
# 查看核心数
grep 'core id' /proc/cpuinfo | sort -u | wc -l
# 查看线程数
grep 'processor' /proc/cpuinfo | sort -u | wc -l

mac中查看cpu核数和线程数:

# 查看核心数
sysctl hw.physicalcpu
# 查看线程数
sysctl hw.logicalcpu

2.6 负载核 vs 使用率

这两个从一定程度上都可以反映一台机器的繁忙程度.

cpu使用率反映的是当前cpu的繁忙程度,忽高忽低的原因在于占用cpu处理时间的进程可能处于io等待状态但却还未释放进入wait。

平均负载(load average)是指某段时间内占用cpu时间的进程和等待cpu时间的进程数,这里等待cpu时间的进程是指等待被唤醒的进程,不包括处于wait状态进程。

以上分析可以看出,一台机器很有可能处于低cpu使用率高负载的情况,因此看机器的繁忙程度应该结合两者,从实际的使用情况观察,自己的一台双核志强2.8GHZ,2G内存的机器在平均负载到50左右,cpu使用率才接近100%(应用有不少io操作),这种情况下应用还算流畅,实际访问延迟不是很高。因此在cpu还空闲的情况下,如何提高io响应是减少负载的关键,很多人认为负载到几十了机器就非常繁忙了,我倒觉得如果这个时候cpu使用率比较低,则负载高可能不能很好说明问题,一旦cpu处理的进程处理完后,那些等待的进程也能立刻得到响应,这种情况下应该优化io读写速度。真到cpu使用率一直90%以上,即使平均负载只有个位数(比如某一个进程一直在运算),那机器其实也已经繁忙了。

系统负荷的经验法则

1.0是系统负荷的理想值吗?
不一定,系统管理员往往会留一点余地,当这个值达到0.7,就应当引起注意了。经验法则是这样的:
当系统负荷持续大于0.7,你必须开始调查了,问题出在哪里,防止情况恶化。
当系统负荷持续大于1.0,你必须动手寻找解决办法,把这个值降下来。
当系统负荷达到5.0,就表明你的系统有很严重的问题,长时间没有响应,或者接近死机了。你不应该让系统达到这个值。

3. 使用top命令进行性能分析

top命令能够实时显示系统中各个进程的资源占用情况,默认5秒刷新一次进程列表。以mac系统为例,对top命令的结果说明如下:

实例 说明
Processes: 315 total, 2 running, 313 sleeping,1728 threads 进程数
Load Avg: 2.42, 2.41, 2.19 平均负载,1分钟系统负载、5分钟系统负载,15分钟系统负载
CPU usage: 6.45% user, 9.67% sys, 83.87% idle cpu使用率,用户使用率、系统使用率、空闲
SharedLibs: 146M resident, 51M data, 31M linkedit. 共享库
MemRegions: 53139 total, 4178M resident, 143M private, 766M shared. 内存区域的数量和总大小
PhysMem: 8156M used (1589M wired), 33M unused. 物理内存使用
VM: 1422G vsize, 1110M framework vsize, 0(0) swapins, 0(0) swapouts.
Networks: packets: 541527/741M in, 107642/129M out. 输入和输出网络数据包的数量和总大小
Disks: 122972/3663M read, 28637/519M written. 磁盘读写的数量和总大小
表头 说明
PID 进程 id
COMMAND 命令
%CPU cup 占比
TIME 运行时间
#TH 线程数量
#WQ
#PORT
MEM 内存
PURG
CMPRS 表示属于您的进程的压缩数据的字节数(不是位)。
PGRP
PPID
STATE
BOOSTS
%CPU_ME
%CPU_OTHRS
UID

命令示例:

# 查看文档
man top
# 帮助信息
top -h
# 根据CPU使用量(降序)和驻留内存大小(升序)对进程进行排序,每隔5秒对显示进行采样和更新,并将显示限制为20个进程。
top -o cpu -O +rsize -s 5 -n 20

top排序

在linux机器上使用top命令。常用的快键键是:

  • p键 - 按 cpu 使用率排序
  • m键 - 按内存使用量排序
    这2个快捷键在mac上不一样。对应的是,先输入o,然后输入cpu则按cpu使用量排序,输入rsize则按内存使用量排序。

4. 小结

本文简单介绍了CPU相关的基础概念、关键参数、top命令分析。作为软件开发工程师,了解这些知识后面对一些性能问题或性能瓶颈时,可以处理得更加得心应手。

参考的文章

简单介绍 CPU 的工作原理
8核、6核、4核、双核CPU是什么意思
超能课堂(111):讲了这么多年的CPU频率,到底是什么?
mac获取cpu信息
“Physical CPU”还是“logic CPU”?
CPU 扫盲(核心数/线程数)
理解Linux CPU负载和 CPU使用率
CPU使用率和负载,物理CPU个数,核数,线程数


文章作者: 沉迷思考的鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沉迷思考的鱼 !
评论
 上一篇
TypeScript 笔记(一、简介) TypeScript 笔记(一、简介)
由于近期时常会写一些前端页面和相关的js,每次写复杂js的时候都是一阵烦躁,对于没有语法检查、动态类型、难封装这些特点深恶痛绝。跟前端的同事了解了下他们用的技术栈,得知了一个前端利器:TypeScript。 本文将从如下几个方面,介绍Typ
2019-05-17
下一篇 
Spring Batch 快速入门 Spring Batch 快速入门
这篇文章中,我们将从如下四个方面对Spring Batch进行简要介绍, 旨在使读者清楚什么是Spring Batch,以及如何使用它。 Spring Batch简介 批处理中的基础概念 简单示例 并行处理 1. Spring Bat
2019-03-12
  目录