在实际项目中,经常被客户问到“你们XX程序占用多少CPU?”,“你们XX程序占用多少DMIPS”等CPU相关的问题,这篇文章先简单介绍下CPU相关的几个知识点,抛砖引玉。

主要介绍以下几点:

1、查看CPU使用率

2、计算DMIPS

3、计算某个进程的DMIPS

4、控制程序的CPU使用率

5、总结

一、查看CPU使用率

linux系统下有很多命令可以直接拿来使用,比如top、vmstat、dstat等,网上资源很多,这里不赘述。以top命令为例,简单介绍下其中一些参数的释义:

获取CPU使用率以及控制CPU使用率_top命令

man top命令得出的释义:获取CPU使用率以及控制CPU使用率_网络带宽_02

二 、计算DMPIS

如何计算DMIPS,要先了解什么是DMIPS,先列出几个名词:

MIPS:Million Instructions Per Second,即每秒执行了多少百万条指令;

DMIPS:Dhrystone Million Instructions Per Second,Dhrystone是一种整数运算测试程序,即表示CPU运行Dhrystone 的程序时,所对应的性能单位;

MFLOPS:Million Floating-point Operations per Second,对应DMIPS用于测试整数运算计算能力,MFLOPS则是用来测试浮点运算计算能力。 了解了什么是DMIPS,下面描述如何计算处理器的DMIPS。

三、计算某个进程的DMIPS

基于上述两个步骤得出进程占用CPU百分比以及处理器总DMIPS后,针对某个进程的DMIPS的计算方法如下:

进程占用DMIPS = 总的DMIPS * 进程占用CPU百分比

四、控制CPU使用率

一般linux系统下会内置一些CPU相关的控制命令,比如nice、cpulimit、cgroups等。下面简单介绍这几个命令的用法(基本上都是网上的资料,稍作整理)。

演示之前先模拟一个比较占CPU的程序,首先想到使用dd命令去dd大文件来模拟CPU使用率,但是实测下来后发现不同优先级的dd进程,所占CPU资源竟然是相同的,可能是dd命令主要是IO占用CPU有关系,作为一个存疑点。

无奈,直接参照网上使用Mathomatic toolkit中的质数生成器来模拟CPU负载,先去安装该模块。

4.1 nice命令:调整任务的优先级,以达到控制CPU使用率的目的。

1、首先通过nice命令启动两个优先级不同的任务。

获取CPU使用率以及控制CPU使用率_top命令_03

2、为了方便演示模拟,把两个任务进行邦核处理。3、通过top命令可以观察,通过nice命令调整后优先级高的任务占用CPU是比较高的。反之,不调整优先级可以发现两个任务是均分CPU的。

获取CPU使用率以及控制CPU使用率_linux_04

4.2 cpulimit:该命令的原理是为进程设置一个 cpu 占用率上限,并实时监控进程是否超出此门限,若超出则让该进程暂停运行一段时间。cpulimit 使用 SIGSTOP 和 SIGCONT 这两个信号来控制进程,它不会修改进程的 nice 值,而是通过监控进程的 cpu 占用率来做出动态调整。下面手动测试看下效果:

1、先用dd命令,模拟高CPU使用率。获取CPU使用率以及控制CPU使用率_优先级_05

2、可以看到程序是占用100%的cpu使用率。获取CPU使用率以及控制CPU使用率_top命令_06

3、然后通过cpulimit命令来控制。cpulimit -l 70 -p 3194,其中-l表示CPU使用率上限,-p指定进程ID。下面可以看到CPU使用率控制在70%以下。仔细观察可以看到其实cpu使用率有时候是超过70%的,但很快又降下来,这就印证了该命令是动态调整的原理。获取CPU使用率以及控制CPU使用率_top命令_07

4.3 cgroups:相较于cpulimit和nice两个命令,cgroups功能更更强大,也更灵活。cgroups 是 Linux 内核提供的一种机制,利用它可以指定一组进程的资源分配。 总的来说该命令可以控制一组进程的 cpu 占用率、系统内存消耗、网络带宽,以及这几种资源的组合。这里只是简单描述下用法,更灵活高级的用法后面有时间再继续研究。

六、总结回顾下本文档介绍的内容:

1、如何查看CPU使用率,包括top、vmstat、dstat命令;

2、如何计算DMIPS,介绍了什么是DMIPS以及不同的芯片类型如何计算DMIPS;

3、如何计算某个进程的DMIPS,知道了进程cpu使用率以及芯片总的DMIPS得出某个任务的DMIPS;

4、如何控制程序的CPU使用率,主要介绍nice、cpulimit和cgroups几个命令。nice命令可以修改进程优先级,cpulimit设置进程的cpu使用率上限,通过动态调整的方案控制cpu使用率,使用起来相对来说比较简单方便,cgroups组功能更强大,更灵活,但用法也更复杂。

最后有两个存疑点:

1、为何使用dd命令模拟高CPU使用率场景时,使用nice命令设置任务优先级为何cpu使用率没有变化?

2、cgroups组命令非常强大,不仅仅可以控制cpu使用率,系统内存消耗、网络带宽等资源同样可以控制,值得进一步研究。