服务器性能指标(二)——CPU利用率分析及问题排查

转载自  服务器性能指标(二)——CPU利用率分析及问题排查

平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load、cpu、mem、qps、rt等。每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴随着某些指标的异常。大部分情况下,在问题发生之前,某些指标就会提前有异常显示。

在上一篇文章中,我们介绍了一个重要的指标就是负载(Load),其中我们提到Linux的负载高,主要是由于CPU使用、内存使用、IO消耗三部分构成。任意一项使用过多,都将导致服务器负载的急剧攀升。本文就来分析其中的第二项,CPU的利用率。主要涉及CPU利用率的定义、查看CPU利用率方式、CPU利用率飙高排查思路等。

 

什么是CPU利用率

CPU利用率,又称CPU使用率。顾名思义,CPU利用率是来描述CPU的使用情况的,表明了一段时间内CPU被占用的情况。使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少。使用率的高低与你的CPU强弱有直接关系。

在接下来深入介绍CPU的利用率之前,我们先来解释一个简单的概念,可能是很多人一直存在误解的地方。

很多人都知道,现在我们用到操作系统,无论是Windows、Linux还是MacOS等其实都是多用户多任务分时操作系统。使用这些操作系统的用户是可以“同时”干多件事的,这已经是日常习惯了,并没觉得有什么特别。 但是实际上,对于单CPU的计算机来说,在CPU中,同一时间是只能干一件事儿的。为了看起来像是“同时干多件事”,分时操作系统是把CPU的时间划分成长短基本相同的时间区间,即"时间片",通过操作系统的管理,把这些时间片依次轮流地分配给各个用户使用。 如果某个作业在时间片结束之前,整个任务还没有完成,那么该作业就被暂停下来,放弃CPU,等待下一轮循环再继续做.此时CPU又分配给另一个作业去使用。 由于计算机的处理速度很快,只要时间片的间隔取得适当,那么一个用户作业从用完分配给它的一个时间片到获得下一个CPU时间片,中间有所"停顿",但用户察觉不出来,好像整个系统全由它"独占"似的。

而我们说到的CPU的占用率,一般指的就是对时间片的占用情况。

 

查看CPU利用率

在上一篇文章中,我们介绍过,使用uptimetopw等命令可以在Linux查看系统的负载情况。其中,top命令也可以用来查看CPU的利用率,除此之外,还可以使用vmstat来查看cpu的利用率。

vmstat命令

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。

1➜  ~ vmstat
2procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
3 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
4 0  1      0 2446260      0 3202312    0    0   201 16304    1    6  0  0 84  5 1

从上面的结果中我们可以看到很多信息,我们本文重点关注下cpu部分的指标。

1us sy id wa st
20  0  84  5 1

以上几个指标是当前CPU的占用情况。

%us:用户进程执行时间百分比

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

%sy:内核系统进程执行时间百分比

sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

%id:空闲时间百分比

%wa:IO等待时间百分比

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

%st:虚拟 CPU 等待实际 CPU 的时间的百分比

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。

1➜  ~ vmstat 2 2
2procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
3 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
4 0  0      0 2479444      0 3165172    0    0   196 15905    2    8  0  0 84  5 11
5 0  0      0 2479404      0 3165176    0    0     0  2804 81664 2715  0  0 90  1  9

以上命令表示采集两次数据,每隔2秒采集一次。

top命令

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

1~ top
2top - 10:58:07 up 18:13,  1 user,  load average: 0.32, 0.24, 0.19
3Tasks:  64 total,   1 running,  63 sleeping,   0 stopped,   0 zombie
4Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 92.8%id,  0.1%wa,  0.0%hi,  0.0%si,  6.8%st
5Mem:   8388608k total,  5928076k used,  2460532k free,        0k buffers
6Swap: 16777216k total,        0k used, 16777216k free,  3181996k cached
7   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
8  2393 admin     20   0 5056m 2.2g  56m S  4.3 27.6  79:06.21 java
9  1054 root      20   0  338m 9760 5112 S  0.3  0.1   2:37.30 logagent

使用top命令,除了可以查看Load Avg以外,还可以显示CPU利用率信息。

以上top命令打印的信息中(Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 92.8%id, 0.1%wa, 0.0%hi, 0.0%si, 6.8%st),第三行反映了当前cpu的整体情况。

从上面的打印信息中我们还可以看到,ID为2393的java进程当前内存使用率最高,占到4.3%左右。

由于Java是多线程的,所有,有些时候我们希望可以查看一个Java进程中所有线程的cpu使用率如何,也可以使用top命令来查看。

1➜  ~ top -Hp 1893
2PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
319163 admin     20   0 5056m 2.2g  56m S  1.7 27.6  17:39.97 java
410649 admin     20   0 5056m 2.2g  56m S  0.7 27.6   4:07.64 java
55884 admin     20   0 5056m 2.2g  56m S  0.3 27.6   2:18.19 java
610650 admin     20   0 5056m 2.2g  56m S  0.3 27.6   1:24.77 java

通过top -Hp 1893命令,我们可以发现,当前1893这个进程中,ID为19163的线程占用CPU最高,达到1.7%左右。

PS:top命令的输出结果是动态的,随着系统的情况实时变化的。

 

CPU使用率的计算逻辑

描述系统cpu使用情况主要有一下几点:

user 从系统启动到现在,CPU处于用户态的运行时间。不包含nice值为负的进程。

nice 从系统启动到现在,CPUnice为负值的进程占用的cpu时间。

system 从系统启动到现在,CPU处于内核态的运行时间。

idle 从系统启动到现在,CPU除了 iowait外的等待时间。

iowait 从系统启动到现在,CPUio 等待时间。

irq 从系统启动到现在,CPU硬中断花费的时间。

softirq 从系统启动到现在,CPU软中断花费的时间。

steal 从系统启动到现在,CPU运行其他虚拟环境中的操作系统花费的时间。

guest 从系统启动到现在,CPU运行在通过Linux内核控制的客户操作系统上的虚拟cpu的时间。

guest_nice 从系统启动到现在,CPU运行在通过Linux内核控制的客户操作系统上的虚拟cpu的时间, nice 为负值进程。

知道了以上参数的意思,计算某段时间内的cpu使用率就不难,由于cpu资源是在高速的变化,于是计算cpu使用率只能是在一段时间内的,设置两个时间点为t1和t2, CPU在t1和t2时间内总的使用时间:

1( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1)

CPU的空闲时间:

1(idle2 -idle1)

CPU在t1和t2时间内的使用率

1CPU非空闲时间/CPU总时间*100%=(1-CPU的空闲时间/CPU总时间)*100%

则:

1CPU(t1,t2)使用率:1-(idle2-idle1)/(( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1))

(参考资料:https://blog.csdn.net/IT_DREAM_ER/article/details/52037368)

 

CPU利用率和负载

我们上一篇文章介绍了系统的负载,本文介绍了CPU利用率,很多小伙伴就会分不清楚了,这两者之前到底有什么区别和联系呢?

CPU利用率是对一个时间段内CPU使用状况的统计,通过这个指标可以看出在某一个时间段内CPU被占用的情况。

CPU负载是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。

有一个很好的比喻,就是把CPU的使用比喻成排队打电话:

我们将CPU就类比为电话亭,每一个进程都是一个需要打电话的人。现在有一个电话亭(单核计算机),有10个人需要打电话(10个进程)。现在使用电话的规则是管理员会按照顺序给每一个人轮流分配1分钟的使用电话时间,如果使用者在1分钟内使用完毕,那么可以将电话使用权返还给管理员,如果到了1分钟电话使用者还没有使用完毕,那么需要重新排队,等待再次分配使用。在电话亭使用过程中,肯定会有人打完电话走掉,有人没有打完电话而选择重新排队,同样也会有新来的人继续排队,这个人数的变化就相当于任务数的增减。

CPU的Load统计一定时间段内,所有使用电话的人加上等待电话分配的人数的平均值。为了统计平均负载情况,我们5分钟统计一次人数,并在第1、5、15分钟的时候对统计情况取平均值,从而形成第1、5、15分钟的平均负载。

CPU利用率统计的进程在进入电话亭后,真正使用电话的时间和在电话亭停留的时间的比值。例如一个用户得到了一分钟的使用权,在10秒钟内打了电话,然后去查询号码本花了20秒钟,再用剩下的30秒打了另一个电话。那么他的利用率就是(10+30)/60

 

Java Web应用CPU使用率飙高排查思路

当发现系统的CPU使用率飙高时,首先要定位到是哪个进程占用的CPU较高。一般情况下,对于Java代码来说,导致CPU飙高可能由以下几个原因引起:

1、内存泄露、导致大量Full GC(如典型的Java 1.7之前的String.subString导致的内存泄露问题) 2、代码存在死循环(如典型的多线程场景使用HashMap导致死循环的问题)

这部分问题排查思路其实和我上一篇问文章的思路差不多,基本都是先定位到占用CPU较多的进程和线程,然后通过命令在查看这条线程执行情况。通过分析代码来定位其中的问题。

这里就不重复介绍了,最重要的是熟练的使用jstackjstat以及jmap等命令来定位及解决Java进程的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20级:班级日常分享,一天一瞬间

点击上方蓝色关注我们!今天批改的作业不仅仅是卡个印有“优”字样式的章,当然也不仅仅是用红笔写个“SSSS9.28”字样的批语了。除了给每个学生的作业本上都卡了“优”的章之外,还送给每位同学一句或长或短的话,有表扬有批评&#…

SpringMVC的视图解析器

文章目录SpringMVC的自定义视图解析器[1] SpringMVC的视图解析器[2] SpringMVC的自定义视图解析器SpringMVC自定义视图解析器的使用[1] 目前项目资源的声明位置和访问中存在的问题[2] 使用自定义视图解析器优化资源跳转路径[3] 使用restful声明公共单元方法请求转发WEB-INF下的…

【2018.3.10】模拟赛之四-ssl2133 腾讯大战360【SPAF,图论,最短路径】

目录地址 前言 打错了一个地方之接60,还有输出“Peace”能拿60。还有题目坑爹害得我用了哈希,可以无视 QAQ 正题 有一个n*n的图,有m条边,不知道几个城市,给出两个位置,求两个位置移动到相遇(…

互联网级监控系统必备-时序数据库之Influxdb技术

时间序列数据库,简称时序数据库,Time Series Database,一个全新的领域,最大的特点就是每个条数据都带有Time列。 时序数据库到底能用到什么业务场景,答案是:监控系统。 Baidu一下,互联网监控系…

存放80000000学生成绩的集合,怎么统计平均分性能高

大家好,我是雄雄,好久不介绍一下我,就被大家淡忘了……我们都知道,遍历集合的方式最常用的有两种,一种是使用下标的方式遍历,第二种便是使用foreach遍历,代码分别如下:使用下标的方法…

数组元素的默认值

数组元素的默认值 数组元素是整型:0 数组元素是浮点型:0.0 数组元素是char型:0或’\u0000’,而非’0’ 数组元素是boolean型:false 数组元素是引用数据类型:null eg 非数组元素必须初始化后才能进行使用…

ssl初一组周六模拟赛【2018.3.10】

前言 先说一下成绩(因某人要求去掉了某人): 姓名成绩xjq280wyc200(本人)lrz200zyc100hjq40lw30hzb0 正题 题目1:Clocest (ssl2574) 贪心30分,改后100分dfs 链接: http://blog.c…

如何重构箭头型代码

转载自 如何重构"箭头型"代码 本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论,在微博上大家有各式各样的问题和想法。按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我…

SpringMVC的上传与下载

文章目录SpringMVC的上传SpringMVC的下载SpringMVC的上传 [1] 上传的功能需求 随着我们互联网的发展,我们的用户从直接访问网站获取信息。变为希望将自己本地的 资源发送给服务器,让服务器提供给其他人使用或者查看。还有部分的用户希望可以将 本地的资…

中秋节支付宝口令红包解析

大家好,我是雄雄。继上篇文章(10.1日)发完之后就没有再日更公众号了,给自己也放几天假。这个假期实在是太太太长了,放的我都心气憔悴!出去玩吧,没地儿去,在家吧,除了看书…

asp.net core高级应用:TagHelper+Form

上一篇博客《asp.net core新特性(1):TagHelper》我讲解了TagHelper的基本用法和自定义标签的生成,那么我就趁热打铁,和大家分享一下TagHelper的高级用法~~,大家也可以在我的博客下随意留言。对于初步接触asp.net core的骚年可以看看我对TagHe…

爸妈没多大本事……

本文原创:王晓丹世界上什么都不公平,唯独时间最公平,你是懒惰还是勤奋,时间都会给出结果。每个人都是孤独的,你的人生不会辜负你的。那些流下的泪和那些辛苦的汗水 全都让你成为一个独一无二的自己。把懒惰放一边 &…

我终于搞清楚了和String有关的那点事儿

转载自 我终于搞清楚了和String有关的那点事儿 String,是Java中除了基本数据类型以外,最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对&#xff1a…

SpringMVC的拦截器

文章目录SpringMVC的拦截器学习SpringMVC的拦截器学习 [1] SpringMVC拦截器的介绍 问题: 在之前学习Servlet的时候,我们学习了过滤器的知识。过滤器的作用是保护 请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围&#xff…

考研英语二大纲22年考研

全国硕士研究生招生考试英语(二)考试大纲(非英语专业)(2022年版)   I.考试性质   英语(一)考试是为高等学校和科研院所招收硕士研究生而设置的具有选拔性质的全国统一入学考试科目,其目的是科学、公平、有效地测试考生对英语语言的运用能力,评价的标…

ssl1763-观光旅游【最小环,Floyd,dijkstra】

正题 就是给出一个无向图&#xff0c;求最小环。 输入输出&#xff08;需要自取&#xff09; Input 每组数据的第一行包含两个正整数&#xff1a;十字路口的个数N(N<100)&#xff0c;另一个是道路的 数目M(M<10000)。接下来的每一行描述一条路&#xff1a;每一行有三个…

物联网模式下的多活数据中心架构认识与实践

做互联网应用很重要的一点是要保证服务可用性&#xff0c;特别是某些业务更是需要7*24小时不间断的对外提供服务&#xff0c;任何停机、宕机都会引起大面积的用户不满。持续可用性是把业务服务化时一个需要考虑的重要指标&#xff0c;很多时候我们都会牺牲一些功能来换取可用性…

subList?? subString???

今天看到了java中List中有个subList方法&#xff0c;感觉很熟悉有没有&#xff1f;没错&#xff0c;在Stirng类中&#xff0c;也有个类似的方法&#xff1a;subString。1String类的subStringString中的subString方法&#xff0c;官方解释是&#xff1a;返回字符串的子字符串&am…

互联网级监控系统必备-时序数据库之Influxdb集群及踩过的坑

上篇博文中&#xff0c;我们介绍了做互联网级监控系统的必备-Influxdb的关键特性、数据读写、应用场景&#xff1a;互联网级监控系统必备-时序数据库之Influxdb 本文中&#xff0c;我们介绍Influxdb数据库集群的搭建&#xff0c;同时分享一下我们使用集群遇到的坑&#xff01;…