什么是CPU的利用率:空占比和pipeline slots。
系统分配负载的时间占比
处理器的内部是非常复杂的,有多种不同且不可替代的执行器构成,所以,我们是没办法一言蔽之的讨论一个CPU在某个瞬间的负载率,或者说CPU的利用率。尤其是,至少绝大部分用户的系统里,都不能真正了解CPU内部的负载状态。
我们虽然不知道CPU内部具体的负载情况,但是我相信,读者或者观众总归会说:什么CPU利用率高,什么看任务管理器,什么显示软件的。这些CPU的利用率就不是一般认为的利用率了。
除非CPU开发的厂商的工具,不然就只能从系统知道CPU是负载了还是空闲了。这就是我们一般软件会显示的CPU利用率的基础。这时候,我们并不知道在CPU内部发生了什么,他就需要系统周期。系统会决定将CPU这段时间内的负载是交给哪个进程,还是空载。当我们最后统计的时候,实际统计的是,在总的时间里,系统把多少的时间是给CPU负载了。这意味对于软件来说,它实际并不知道CPU是个什么情况,他只知道这个系统分配了多少时间给了CPU负载。
这也就是,很多时候说一个程序的cpu利用率,其实是从系统分配负载角度的这个程序占用的clock tick除以总的clock tick。
CPU Utilization= 程序的负载的CPU time(clock tick)/总时间( clock tick)
同样的,通常软件现实的CPU利用率是基于一个采样频率的。
举个例子,当你打开任务管理器,打开性能页面左下角的资源管理器,你可以看到CPU时间的显示的是在过去的60s内,每个进程占用了刷新率的时间段内多少比例的CPU时间。这就是我们一般看到的CPU利用率。
当然这也意味着,在这里系统只管他有没有给负载。不管是什么负载,只要给了CPU负载,这个时间就算CPU利用率100%,并不关心硬件上真正的使用了多少资源。实际上这和硬件上CPU到底使用了多少资源是两回事
Pipleline slots
当然,这并不意味着,没有一个人它能够诊断CPU内部发生了什么。而当CPU内部发生了什么,CPU内部拥有的资源量。我们就可以使用pipeline slots的概念。
我们对于CPU的资源讨论是基于后端的执行管线的:当一个CPU后端拥有10个不同的执行器管线的时候,我们就认为,这个CPU每个周期拥有10个管线可以使用。再乘上CPU的周期数,这就是CPU在单位时间内的执行器资源。
接下来,就是计算在这些总的执行器资源的,有多少实际被塞进了μop进入执行的。这意味在这里,我可以知道CPU内部有多少实际的后端资源被使用了,我也可以知道,在每个瞬间,CPU有多少的执行器资源被占用了。这使得我们可以更加完善的宏观上的去讨论CPU究竟有多少资源被使用了。在这里的clock tick就是指CPU的硬件周期了。
当然,我们也要知道,CPU后端不同执行器的意义是不同的,他们能执行的操作也是不同。所以即使是使用pipeline slots,我们也不能说这个标准是完全有效的。即使是厂商的工具,我们依旧会需要了解到,具体哪个端口,他的使用率是多少,哪一类指令占比更多。