接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(6)
问:查看CPU的负载情况一般都用什么工具或命令?都能得到哪些信息?
备注:此问题是笔者年前参加蔚来面试时遇到的一个问题。考察的是Linux系统性能优化这一块内容。
答:要回答这个问题,先得讲清楚CPU的性能指标。CPU的性能指标一般有以下几个:
(1)CPU使用率
这是实际环境中最常见的一个性能指标。CPU使用率是用来衡量CPU在一定时间内执行的任务数量和处理能力的一个指标,其描述了非空闲时间占总CPU时间的百分比。根据CPU上运行任务的不同,又被分为用户CPU、系统CPU、等待IO CPU、软中断和硬中断等。
用户CPU使用率则是描述CPU执行由用户发起的任务的时长,表示CPU在用户态运行的时间百分比。包括用户态CPU使用率(user)和低优先级用户态CPU使用率(nice)。用户CPU使用率高,通常说明有用户应用程序比较繁忙。
系统CPU使用率指的是CPU处理与操作系统相关任务的时长,如管理内存、磁盘操作和网络通信等。其表示的是CPU在内核态运行的时间百分比(注意,不包括中断)。系统CPU使用率高,说明内核比较繁忙。
通常也称为iowait,表示等待I/O的时间百分比。iowait高,通常说明系统与硬件设备的I/O交互所耗费的时间比较长。
分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。他们的使用率高,通常说明系统发生了大量的中断。
除了上边的这几个,还有在虚拟化环境中会用到的窃取CPU使用率(steal)和客户机(guest)CPU使用率。窃取CPU使用率表示被其它虚拟机占用的CPU时间百分比,客户机CPU使用率表示运行客户虚拟机的CPU时间百分比。
影响CPU使用率的几个主要因素包括:
(2)平均负载(Load Average)
平均负载也即系统的平均活跃进程数,其反映了系统的整体负载情况。在CPU中可以理解为CPU可以并行处理的任务数量,就是CPU个数X核数。主要包括三个数值,分别是过去1分钟、过去5分钟和过去15分钟的平均负载。
理想情况下,平均负载数等于逻辑CPU个数,这表示每个CPU都恰好被充分利用,“增一分则肥、减一分则瘦”。如果平均负载大于逻辑CPU个数,则就表示负载比较重了。Load Average的值应该小于CPU个数 x 核数 x 0.7(即逻辑CPU数 x 0.7)。如果1分钟平均出现大于CPU个数X核数的情况,还不需要担心;如果5分钟的平均也是这样,那就要警惕了;15分钟的平均也是这样,就要分析哪里出现问题,防范未然。
(3)进程上下文切换时间
这个指标一般不易被关注、容易被忽略。进程上下文切换包括:
被系统强制调度而导致的非自愿(被动)上下问切换。
上下问切换,本身是保证Linux正常运行的一项核心功能,但过多的上下文切换,会将原本运行进程的CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上。这样就会缩短进程真正运行的时间,从而成为性能瓶颈。这就好比一个人刚刚摆上笔墨纸砚要写字,没写一会就被告知要要给孩子吃水果了得收拾桌子,没吃两口小孩不吃了,又得重新摆上笔墨纸砚,刚要写又被通知该区做饭了……结果就是哪件事也做不好。
(4)CPU缓存的命中率
除了以上三个指标,还有一个比较重要的CPU性能指标 —— CPU缓存的命中率。由于CPU的发展速度远快于内存的发展,CPU的处理速度远比内存的访问速度快得多,两者速度不匹配。这样就导致了CPU在访问内存的时候,免不了要等待内存的响应。为了协调和匹配CPU和内存的巨大性能差距,CPU缓存(通常是多级缓存)就出现了。CPU缓存的速度介于CPU和内存之间,缓存的是热点内存数据。这些缓存按照大小不同分为L1、L2、L3三级缓存,其中L1、L2常用在单核中,L3则用在多核中。从L1到L3,缓存的大小依次增大,而性能一次降低(当然和内存比还是快得多)。而缓存的命中率,则衡量的是CPU缓存的复用情况,命中率越高,表示性能越好。
至此,CPU的性能指标就基本上讲解完了,下一回开始讲解获取CPU性能指标的相关性能工具。
参考资料:
《Linux性能优化实战》 —— 倪朋飞