android app 获取 cpu使用率 剩余率 android查看cpu使用率_android 获取cpu使用率


前言:

最近遇到了这么一个问题:线上有10台机器跑任务,任务的内容大概是从kafka的10个分区里边拉取数据处理。9台机器都运行正常,唯独第10台运行的很慢。导致其消费的partition-10产生了lag。

排查以后发现kafka里的消息是均匀的,物理机配置也都是相同的(服务部署在物理机上),所以当时就怀疑是不是第10台机器比较繁忙,所以处理慢。由于没有权限,所以联系同事排查,当时同事发来了一张神奇的top截图:


android app 获取 cpu使用率 剩余率 android查看cpu使用率_单线程_02


[cpu使用率36%] , [load 19.46] , [进程的cpu100%] 看的我一脸懵逼。既然cpu才用了30%,为什么进程的cpu使用了100% ?19.46 又是什么鬼。。。
最近在读《性能之巅》,在看完了第六章cpu的60多页长篇大论以后,其中有一两页给了我两点提示:

1. /top是对/proc拍快照。

2.百分比是基于时间的。

所以我就顺着这两条线索,自己试着理解了一下cpu的这些监控是什么含义。记录一下,看以后会不会打脸。

ps:作者怕不是在写一本字典,想要查这么点东西,得翻60页,累死了...


android app 获取 cpu使用率 剩余率 android查看cpu使用率_android 获取cpu使用率_03


正文:

首先,既然监控是基于时间的,那么36%的利用率可以理解为,假设1s内,有360ms的时间cpu是在干活。

而linux对时间对统计,是基于时钟中断的。假设HZ是1000,那么1s之内,就会发生1000次中断。而这1000次中断里边,有360个和其他640个不一样。所以才能统计出36%来。所以对cpu利用率对理解在于,到底哪里不一样。

于是就有了第一个疑问:既然cpu不会停下来,那么怎么判断cpu是否空闲呢?然后我查到了这个idle进程 ,每一个cpu对应一个idle进程,如果这个idle进程被调度了,说明没有其他进程可以执行了。这个时候,cpu是空闲的。

所以如果每一次执行时间中断的时候,判断当前进程是不是idle。如果是,那么idle++,如果不是,那么use++ ,这样就能求出cpu的利用率了。

接着是第二个线索: /top是对/proc拍快照,之前在看《Linux内核设计与实现》提到 /proc中的文件,是对内核数据结构的映射。之前提到的idle,use应该就是内核中的某个数据结构中的字段。top从/proc中获取了这些数据,才能计算出cpu 的使用率。

于是就有了第二个疑问:/proc中有n多的文件,top到底使用了那些数据计算出的使用率?具体这些数据,对应着内核中的哪些数据结构呢?

如果这是一篇有干货的文章,这个时候就应该分析top的源码,分析内核源码。然后得出结论。然而我还没有这个自信去做这些事情,所以我只能基于查到的这篇帖子Linux平台Cpu使用率的计算的描述来理解了。

帖子写的特别详细,我这边更简单的用我的模型来描述一下就是:假设HZ是10,那么1秒钟总共发生来10次时钟中断,假设每次中断的时候,系统是如下状态:



30%) , usr=(5/10=50%) , sys=(2/10=20%)

20%) , sys=(2/10=20%) 总计40%

30%) , sys=(0/10=0%) 总计30%

如果是两个核,每个核都可一这么统计,把20个汇总到一起就是系统的总使用情况。

这里也说明,如果一个进程支持多线程,那么就可以同时跑在多个cpu上。最后统计的时候,连续20次采样,有可能超过10次都在执行这个进程。这个时候,进程的cpu使用率就会超过100% 。

同时也可以推断出,除了idle进程以外,所有进程CPU使用率的和,最大值应该是=核数 * 100%

回到最开始的问题,整个系统cpu使用率只有36%,但是单个进程达到了100%。很明显是这个进程是单线程的。所以瓶颈不是cpu,而是并发数。

说完了两个使用率的指标。还剩一个不带百分号的cpu load。书上提到,这个值是用正在运行的任务数量和等待排队的进程数量计算出来的。跟时间没有关系。所以就不在这里继续说明了。(其实是我不懂,以后弄明白了再整理吧)

结论:

其实还有很多没弄懂的东西,比如:/proc/stat 中有一个时间是等待io的时间(iowait),用这个模型就解释不了。另外top真的是按照帖子上写的这么计算的吗?这些都等以后慢慢了解了。

虽然最开始吐槽《性能之巅》这本书太厚。但是这本书讲的并不是如何理解cpu的监控。这本书讲的是,现在已经知道10台机器都是单线程在跑,其中9台cpu都正常,只有一台飙到了100%。怎么定位原因呢?我现在还是没有思路。

所以我还是把这60页好好理解一下。在排查问题吧[允悲],

最后,让我们保持独立思考,不卑不亢。长成自己想要的样子!