CPU简介

基本概念

CPU缓存 & 缓存行 & 缓存一致性:

CPU缓存:为了弥补CPU和主存速度上的差异,处理器内部会引入多级Cache,称为CPU缓存。

  • 缓存行(Cache Line):CPU Cache中的最小单元,是用于Cache存储和传输的单位。x86处理器典型的缓存行大小为64字节。编译器在优化的时候需要考虑这个参数。

  • 缓存一致性:主存中的数据可能被多个CPU缓存下来。当一个CPU修改了内存,所有CPU Cache需要知道他的Cache已经失效,应该被丢弃,这样后续读到最新的数据,这个过程叫缓存一致性。在Java中volatile就是用来解决该问题的。

运行队列:

一个等待CPU服务的可运行线程队列。对于多CPU系统,每个CPU都会有一个运行队列,并尽量使得线程每次都被放入同一队列之中。这意味着线程更有可能在同一CPU上运行,因为CPU缓存里保持了他们的数据。

用户态与系统态执行时间:

  • 用户时间:CPU花在执行用户态应用程序代码的时间;

  • 内核时间:执行内核态代码的时间,包含系统调用、内核线程、中断、上下文切换等;

一个典型的Web应用程序通过系统调用来执行I/O操作,用户时间和内核时间比例大概在7:3左右。

上下文切换(context switchs):

  • 自愿式上下文切换(voluntary context switch):不满足执行条件(比如发生系统调用),主动让出时间片;

  • 抢占式上下文切换(involuntary context switch):时间片用尽,其他线程/进程抢占CPU资源。如果抢占式上下文切换次数过多说明可能有计算密集型应用,CPU资源出现瓶颈了。

CPU使用率与负载:

  • CPU使用率:一段时间内CPU用于执行工作的时间,它反映了一段时间CPU的繁忙程度;

  • CPU负载:等待CPU的进程数和正常运行CPU的进程数之和。

CPU架构

一个典型的双核处理器结构如下:
image

一个CPU里包含控制逻辑、寄存器、算术逻辑单元、一级Cache(又分为指令Cache和数据Cache)、二级Cache等。多个CPU单元共享浮点单元、MMU、TLB等。在某些处理器中可能还会有多个CPU共享的三级Cache。

其中MMU负责把虚拟地址转换到物理内存地址,TBL缓存最近查找过的VA对应的页表项。

典型的CPU读取数据逻辑如下:
image

CPU发出取数据请求,此时的地址为虚拟地址。到达一级Cache之后,查看Cache是否命中,命中返回;未命中请求到达MMU需要把虚拟地址转换为物理地址(转换的时候查看TBL中是否有对应的页表信息,若存在直接返回;不存在需要到主存获取页表信息并缓存到TLB中)。经过MMU之后就是获取到了物理地址,然后到二/三级Cache去读取、未命中到主存中读取数据。

但是在处理器的具体实现上可能和上面的步骤有所差别,主要是体现在MMU/TLB的位置上。有些处理器实现可能会把MMU/TLB放到一级Cache和CPU中间,有些处理可能把MMU/TLB放在二/三级Cache和主存之间,前者被称为物理Cache,后者被称为逻辑Cache。物理Cache中所有的Cache存储地址都是物理地址,所有请求都需要先经过转换然后再去Cache中读取数据。逻辑Cache中所有的Cache存储地址都是虚拟地址,所有请求现在Cache中查找未命中,然后再经过MMU/TLB去主存中查找。

逻辑Cache有个优势就是可以在完成虚拟地址到物理地址的翻译之前就可以开始比对Cache。但是有一个问题就是Cache一致性还有Cache eviction必须通过物理地址来做,因为多个虚拟地址可能对应同一个物理地址,不能保证不同的虚拟地址所以应的cache就一定不是同一份数据。

CPU性能分析常见工具

uptime:

image

load average后面的3个数字分别表示系统在过去的1分钟、5分钟和15分钟内的平均负载。

top:

具体含义可以查看:top命令

vmstat:

image

r:运行队列中进程数量;

b:等待IO进程的数量;

in:每秒中断数

cs:每秒上下文切换数

us:用户态时间比例

sy:内核态时间比例

id:CPU空闲时间比例

wa:IO等待时间百分比

st:steal time的时间比例

dstat:

image

其中usr同上的us,sys同上的sy,idl同上的id,wai同上的wa,int同上的in,csw同上的cs。

hiq:用于硬中断处理时间

siq:用于软中断处理时间

mpstat:

image

能看到每个CPU的具体时间消耗比例。有时候CPU整体利用率不高,但是个别CPU过高也会影响应用性能。

pidstat:

image

具体字段含义同上。

jstack/pstack/gstack:

pstack/gstack/jstack都是查看线程的调用栈情况,但是pstack/gstack主要针对于c调用栈或者系统函数,jstack主要是针对于Java应该。

在处理CPU过高的请求下,我们一般用top查看哪个CPU使用率过高,然后再使用'top -H -p pid'查看哪个线程使用cpu量最高,然后pstack/gstack/jstack去查看对应线程的调用栈即可定位问题。

perf:

号称Linux下诊断的瑞士军刀,具体的用法大家可查看官方文档或者man

来聊聊CPU上下文切换

哪些情况下可能带来CPU上下文切换,笔者简单列举一下几种情况:

  1. CPU时间片到了。为了保证所有进程可以得到公平的调度,CPU时间被划分为一段段的时间片,这些时间片轮流分配给各个进程。

  2. 进程在系统资源不足的情况下(比如锁),需要主动挂起等到满足后才可以运行。

  3. 进程调用sleep函数主动挂起自己。

  4. 有更高优先级的进程需要运行时,为了保证高优先级的进程的运行,当前经常会被挂起。

  5. 发生硬件中断时,当前进程需要挂起处理中断服务程序。

因为CPU上下文切换都是在内核态中进行的,需要保持内核状态和CPU寄存器等信息,所以上下文切换不是免费的,是需要消耗CPU资源的。

那么如何统计/测量CPU上下文切换资源消耗呢?

目前现有的工具都集中在上下文切换次数上,要是有工具能统计到每次上下文切换耗时也可以。笔者推荐使用LMbench这个做上下文切换耗时的基准测试。我在test环境测试的结果如下:

image

其中2p/16k表示2个并行处理16K大小的数据,上下文切换不仅跟线程/进程数有关还和处理的数据量有关(涉及到寄存器和cache的命中率问题)。但是基准测试基本上表明了每次上下文切换需要耗时1 -10微秒左右。也就说测试机器每秒能承受的上下文切换的最大值在10w-100w次(跟具体的应用有关)。当然读者也可以使用sysbench做基准测试。

一般来说,每秒几千次上万次的上下文切换对机器不会带来太大影响。还有CPU上下文切换都是在内核态下进行的消耗的系统态的时间,也可以通过查看系统态时间是否正常,要是正常上下文切换肯定也正常,不正常要留意是不是上下文切换导致的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容