cpu

服务监控系列文章

服务监控系列视频

作为开发对cpu相关的疑问

1,在多核cpu上,为什么会有并发安全问题?
2,线上cpu使用率过高,该怎么办呢?
3,你知道如何提高使用率,达到让程序加速的目的吗?

概念模型

image.png

mmu是将虚拟地址转换为物理地址的一个硬件设备。
tlb 是对页表的一个快速缓存。

概念

cpu工作的本质

cpu工作的本质是为了计算,计算的本质是加减乘除,其中位运算逻辑是通过算术逻辑单元去完成。
控制逻辑单元是负责程序指令的存取,分析,以及执行。
寄存器和cpu一级二级三级缓存本质都是为了存储,存储的东西有可能是数据,有可能是指令。

cache line

cpu读取内存每次会预读一块数据,而这一块数据就是cache line,是cpu cache的最小的单位,在64位操作系统里,一个cache line 就能存64个字节。

从cpu结构看待并发加锁问题

由于cpu一,二级缓存的存在,在多cpu下,如何保证一条数据能安全的被多个cpu更新呢。加lock。

golang lock的本质

1,cpu会给总线加上总线锁,此时能让其他cpu不能对内存进行读写。加锁cpu的读写操作会直接写入到主存里。
2,会让其他cpu对该内存地址的缓存行失效。
所以解锁之后,其他cpu会重新从主存拿最新的数据,这样就保证了数据的并发安全。

程序变慢的本质,如何加速程序运行

cpu没有做事情或者cpu忙于做事情。

cpu 没有做事情

突增的流量不一定会导致cpu忙碌,但是可能会导致cpu利用率增加。如果突增的流量在做io密集型的任务,则可能导致系统过多的处于阻塞状态,等到线程变为就绪状态直到运行时,可能会造成接口响应时间过长。

解决办法

让cpu处于忙碌状态,提高cpu利用率,如果是在频繁的做接口调用,可做接口的内存缓存,消除掉网络调用带来的阻塞。

cpu 忙于做事情

cpu过于忙于做事情,判断是否是代码bug导致,不是代码bug而是由于流量导致,则需要分配更多的cpu。

线上cpu使用率过高,我该怎么办

从整体上把握系统cpu情况

cpu使用率

top 
%Cpu(s): 27.4 us,  3.7 sy,  0.0 ni, 68.7 id,  0.1 wa,  0.0 hi,  0.2 si,  0.0 st
us 用户态程序占用cpu  
sy 内核占用cpu 
id 空闲cpu
wa 等待cpu执行耗时
hi 硬中断耗时
si 软中断耗时

cpu 饱和度

top load average: 2.14, 2.54, 2.59

从进程角度看cpu

top 后输入大写P 可按cpu使用率大小排序,找到最消耗cpu的进程。

找到进程里最消耗cpu的代码段

golang pprof 工具可以看cpu消耗情况。

image.png