作者:夏明(亚海)创建日期:2019-08-14栏目地址:【稳定比什么都重要】CPU(CentralProcessingUnit)是计算机系统的运算和控制核心,是计算机系统的核心。信息处理和程序运行的最终来源。执行单元相当于系统的“大脑”。当CPU太忙时,就像“人脑”并发处理太多事情,会降低做事效率,严重时甚至会导致死机“宕机”。因此,了解CPU的工作原理,合理控制负载是保证系统稳定持续运行的重要手段。目录CPU的物理内核和逻辑内核什么是CPU使用率?什么是平均负载?CPU使用率与平均负载的关系性能优化推荐工具&产品参考文章添加我们CPU的物理核心和逻辑核心一台机器可能包含多个CPU芯片,多个CPU通过系统总线进行通信。一个CPU芯片可能包含多个物理核心,每个物理核心都是一个真正的计算核心(包括计算单元、内存等)。超线程(Hyper-Threading)技术可以让一个物理核心在单位时间内同时处理两个线程,成为两个逻辑核心。但它不会有传统单核两倍的处理能力,也不能提供完全并行处理。例如,假设一个CPU芯片是一个类;它有2个物理核心,即2个同学,老师让他们分别担任班长和体育委员;过了一段时间,校长要求每个班要有一个学习委员,理论上生活委员和生活委员需要两个学生,但是这个班只有两个学生。最后,老师只能让班长和体委兼职。这样,对于不知道的人来说,这个班有4个职位:班长、体育委员、学习委员、生活委员。应该有4个人,每个位置都是一个逻辑核心;同学们,也就是只有2个体核,虽然可以做4个工作,但也不能算是4个人。如何查询CPU信息?在Linux系统下,可以从/proc/cpuinfo文件中读取CPU信息,如下图:查看CPU数量:cat/proc/cpuinfo|grep'物理ID'|排序|独特|wc-l查看CPU物理核数:cat/proc/cpuinfo|grep'cpu内核'|排序|uniq查看CPU逻辑核心数:cat/proc/cpuinfo|grep'兄弟姐妹'|排序|uniq什么是CPU使用率?CPU使用率是CPU运行在非空闲状态的时间百分比,它反映了CPU的繁忙程度。例如单核CPU的非空闲运行时间为1s以内0.8s,则其CPU占用率为80%;双核CPU的非空闲运行时间在1s以内分别为0.4s和0.6s,则CPU整体占用率为(0.4s+0.6s)/(1s*2)=50%,其中2代表个数CPU内核数,这同样适用于多核CPU。在Linux系统中,使用top命令查看CPU占用率,可以得到如下信息:Cpu(s):0.2%us,0.1%sy,0.0%ni,77.5%id,2.1%wa,0.0%hi,0.0%si,20.0%stus(user):表示CPU运行在用户态的时间百分比。通常,用户模式下的高CPU表明某些应用程序很忙。典型的用户态程序包括:数据库、web服务器等。sy(sys):表示CPU运行在内核态的时间百分比(不包括中断)。通常,内核模式下的CPU越低越好,否则说明系统存在一些瓶颈。ni(nice):表示具有nice校正进程优先级的用户态进程执行的CPU时间。nice是进程优先级的修改值,如果进程通过它修改优先级,CPU开销会单独统计。id(idle):表示CPU处于空闲状态的时间百分比。这时CPU会执行一个特定的虚拟进程,名为SystemIdleProcess。wa(iowait):表示CPU等待I/O操作完成的时间。通常,指标越低越好。否则,表明I/O存在瓶颈。您可以使用iostat和其他命令进行进一步分析。hi(hardirq):表示CPU处理硬中断所花费的时间。硬中断由外围硬件(如键盘控制器、硬件传感器等)发出,需要中断控制器的参与,具有执行速度快的特点。si(softirq):表示CPU处理softirq所花费的时间。软中断是软件程序(如网络收发、时序调度等)发出的中断信号,具有延迟执行的特点。st(steal):表示CPU被其他虚拟机占用的时间,只出现在多虚拟机场景。如果指标过高,可以检查主机或其他虚拟机是否异常。由于CPU有多种非空闲状态,因此计算CPU占用率的公式可以概括为:CPU占用率=(1-空闲状态运行时间/总运行时间)*100%。根据经验,建议生产系统的总CPU使用率不要超过70%。什么是平均负载?LoadAverage是指单位时间内系统处于运行状态(Running/Runnable)和不可中断状态的平均进程数,即平均活跃进程数。可运行进程包括正在使用CPU或等待CPU的进程;不可中断进程是指进程处于内核态的关键进程,进程不能被中断。例如,当一个进程向磁盘写入数据时,如果被中断,磁盘数据可能与进程数据不一致。不可中断状态本质上是系统对进程和硬件设备的一种保护机制。在Linux系统下,使用top命令查看平均负载,可以得到如下信息:loadaverage:1.09、1.12、1.52这三个数字分别代表1分钟、5分钟、15分钟内系统的平均负载分钟分别。该值越小,系统的工作量越少,负载越低;否则,负载越高。什么是更合理的平均负载?理想情况下,每个CPU都应该满负荷工作,并且没有等待进程。此时平均负载=CPU逻辑核心数。但是,在实际的生产系统中,不建议系统满负荷运行。一般的经验法则是:平均负载=0.7*CPU逻辑核心数。当平均负载持续大于0.7*CPU逻辑核心数时,需要开始排查原因,防止系统恶化;当平均负载持续超过1.0*CPUlogicalcores时,必须想办法降低平均负载;当平均负载持续超过5.0*CPU逻辑核心数时,表明系统出现严重问题,长时间未响应,或接近崩溃。除了关注平均负载值本身,我们还应该关注平均负载的变化趋势,这包含两层含义。一是load1、load5、load15之间的变化趋势;二是历史变化趋势。当load1、load5、load15这三个值非常接近时,说明系统负载在短期内比较稳定。此时应与昨天或上周同期的历史负荷进行对比,看是否有明显增加。当load1远小于load5或load15时,说明系统最近一分钟的负载在下降,而最近5分钟或15分钟的平均负载偏高。当load1远大于load5或load15时,表明系统负载急剧上升。如果不是暂时抖动,而是持续上升,尤其是load5已经超过0.7*CPUlogiccores时,应排查原因,降低系统。加载。CPU使用率与平均负载的关系CPU使用率是单位时间内CPU繁忙程度的统计。平均负载不仅包括正在使用CPU的进程,还包括等待CPU或I/O的进程。因此,两者不能划等号,常见的有两种场景如下所述:CPU密集型应用,大量进程在等待或使用CPU,此时CPU使用率与平均负载呈正相关。对于I/O密集型应用,大量进程在等待I/O,此时loadaverage会增加,但CPU占用率不一定高。为了更深入地理解CPU使用率和平均负载之间的关系,我们举个例子:假设有一个电话亭,有4个人在等着打电话。电话亭一次只能容纳1人拨打电话。它真的被使用了。那么CPU使用率就是拿起听筒所花时间的百分比,它仅取决于展位内人员的行为,与平均负载没有太大直接关系。平均负载是指电话亭和排队的总人数,如下图所示:性能优化实战无论是CPU使用率还是平均负载,都只是反映系统健康状况的指标,不是问题的根本原因。因为。因此,它们的价值主要体现在两个方面:一是全面反映当前系统的健康状况,结合监控告警产品实现快速响应;二是初步定位问题方向,缩小排查范围,缩短故障恢复时间。例如当CPUiowait很高时,首先要检查磁盘I/O;当CPUsteal高时,应首先检查主机状态。CPU涉及的问题场景很多,限于篇幅,下面以最常见的用户态CPU占用率高为例,介绍Java应用的排查思路。其他场景留待以后分享。推荐阅读《如何迅速分析出系统CPU的瓶颈在哪里?》。用户态CPU使用率高怎么解决?用户态CPU使用率反映了应用程序的繁忙程度,通常与我们自己编写的代码密切相关。因此,当你在做应用发布、配置变更或性能优化时,如果你想定位到消耗CPU最多的Java代码,可以按照以下思路:使用top命令找到消耗最多的进程号中央处理器;使用top-Hpprocessnumber命令找到消耗CPU最多的线程号(列名还是PID);通过printf"%x\n"线程号命令输出线程号对应的十六进制数;使用jstack进程号|grephexadecimalthreadnumber-A10命令查找消耗最多CPU的线程方法堆栈。上述方法是目前业界最常用的诊断流程。如果是非Java应用,可以将jstack换成perf。推荐阅读《Perf -- Linux下的系统性能调优工具》。然而,上述方法有两个明显的缺陷。一是操作过程复杂,往往一个jstack不足以定位根源,需要执行多次;另一个是它只能用于诊断在线问题。如果问题已经出现,就无法复现了,往往只能放手。所以生产系统推荐使用APM产品,比如阿里云的ARMS,可以自动记录每类线程的CPU耗时和方法栈,开箱即用,并自动保存问题现场,如图如下图:推荐工具&产品阿里云ARMS线程诊断参考文章《Linux性能优化实战》《CPU问题定位的知识基础与运维基础》《理解Linux系统负荷》加入我们【稳定比什么都重要】打造国内稳定领域的知识库,让无法解决的问题少一些,世界上更多的确定性。GitHub地址钉钉群号:23179349如果您在阅读本文中有所收获,请分享给您的朋友,期待更多的同学加入!
