io密集型和cpu密集型_和小胖一起理解CPU负载和利用率

作者:小胖0029b456-d018-eb11-8da9-e4434bdf6706.png前言0129b456-d018-eb11-8da9-e4434bdf6706.png

凌晨一点,正整着炸鸡的小胖,微信一呼“你的服务器CPU持续超载 … “

麻溜的连上服务器,先把CPU负载摁下来。仔细一想,最近1分钟平均负载很大,但CPU利用率却≤30%,不经陷入了深思,打开学习之门…

1 理解CPU平均负载0629b456-d018-eb11-8da9-e4434bdf6706.gif

啥是CPU平均负载呢?

日常运维我们常用uptimetop命令查看系统当前负载,也可以使用 cat /proc/loadavg
# uptime16:04:00 up 6 days, 19 min,  1 user,  load average: 3.13, 3.25, 3.50  最近1,5,15分钟平均负载

# cat /proc/loadavg
I.33 3.26 3.49 6/434 10737解释说明:3.33 3.26 3.49 最近1,5,15分钟平均进程数
6/434 正在运行进程数6 当前进程总数434(含线程数)10737 最后运行进程PID
严肃点说平均负载是指:某段时间内,内核标记为可运行状态或不可中断状态的平均进程数。

(1) 可运行状态:正在使用CPU或等待CPU,即R状态进程(Running或Runnable)

(2) 不可中断状态:等待某种资源可用(通常是I/O),即D状态进程(不含wait状态)

具体算法在 /usr/src/kernels/${内核版本}/include/linux/sched.h 函数CALC_LOAD(load,exp,n)

打个比方

以单核CPU为例,单核CPU就像一条单行隧道,每个进程是行驶的小汽车。

0829b456-d018-eb11-8da9-e4434bdf6706.png

Load=0   隧道无车

Load=0.5  隧道有车不多,顺畅

Load=1.0    隧道满载,整齐不拥塞

Load=1.7  隧道过载,有车等待塞车

小胖不禁发问 平均负载究竟多少比较合理?

(1) 原理上讲对于多核CPU,负载均值是基于CPU逻辑核数决定的;参考同胞经验值,一般认为单个核心负载0.7是警戒线,例如16核警戒线为16*0.7=11.2

(2) 实际业务对CPU需求各不相同,有些业务系统常年低负载/高负载,比较合理的做法是分析历史负载数据和趋势变化设置警戒线

(3) 综合分析最近1/5/15分钟系统平均负载,如果三个值相近则说明系统平稳;如果最近1分钟负载大、最近15分钟负载小,则可能只是短暂业务波峰

2 理解CPU使用率0629b456-d018-eb11-8da9-e4434bdf6706.gif

看完CPU负载,咱接着捣鼓下CPU使用率又是啥?

先敲下top命令瞅瞅

# top
top - 09:44:51 up 188 days, 23:26, 5 users, load average: 1.03, 1.62, 1.82Tasks: 829 total, 1 running, 597 sleeping, 0 stopped, 1 zombie
Cpu(s): 2.7%us, 0.6%sy, 0.0%ni, 96.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

CPU使用率(算法)是指:单位时间内CPU繁忙情况,可以通过 /proc/stat来计算

# cat /proc/stat
cat /proc/stat |head -10cpu 2151316982 13676 447705255 75666027843 24397883 0 21422133 0 0 0cpu0 133476771 224 19023291 1464635099 1418955 0 5724087 0 0 0…
intr 72766406248 237 0 0 1 ...
ctxt 328779743449btime 1559701088processes 1262614693procs_running 3procs_blocked 0softirq 106621687400 21 557059987 6834440 …
CPU行数据说明(以cpu第一行为例)

user[2151316982] : 用户态的CPU时间(单位:jiffies = 0.01秒) ,不包含 nice值为负进程

nice[13676] : 低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。

system[447705255]: 内核态时间

idle[75666027843]: 除IO等待时间以外其它等待时间

iowait[24397883] : IO等待时间

irq[0]: 处理硬中断时间

softirq[21422133]: 处理软中断时间

steal[0]:当系统运行在虚拟机时,被其他虚拟机抢占的CPU时间

guest[0]:虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间

guest_nice[0]:以低优先级运行虚拟机的时间

CPU时间=user+system+nice+idle+iowait+irq+softirq

[intr]:第一个值为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

[ctxt]:系统启动以来CPU发生的上下文交换的次数。

[btime]:系统启动到现在为止的时间,单位为秒。

[processes (total_forks)]:系统启动以来所创建的任务的个数目。

[procs_running]:当前运行队列的任务的数目。

[procs_blocked]:当前被阻塞的任务的数目。

Linux进程运行又分用户态和内核态。CPU使用率通常是指:CPU执行非系统空闲进程的时间/CPU总的执行时间,公式如下:

0a29b456-d018-eb11-8da9-e4434bdf6706.png

计算CPU使用率脚本参考 https://blog.51cto.com/13466287/2349823

看了这么多枯燥的文字,小胖想知道CPU平均负载和CPU使用率到底有没有联系?

上文提到平均负载统计的是处于可运行状态和不可中断状态的进程数。这包括正在使用CPU的,等待使用CPU的和等待某种资源(比如I/O)的进程。从进程特点看:(1) CPU密集型进程,会大量真实占用CPU时间分片,负载和使用率均高;(2) IO密集型进程,平均负载高(等待IO资源),而使用率不一定高举个例子:假设某个计算进程,运行期间CPU使用率100%,执行单个进程时,负载1,CPU使用率100%;同时执行2个进程时,负载2,CPU使用率仍100%(需要在不同进程间切换,仅为方便理解、实际切换也有开销)。原来平均负载和使用率没有必然联系,平均负载高可能只是等待繁忙的I/O,可以使用top、ps、pidstat等命令来排查定位。CPU使用率除了进程自身消耗(用户态、内核态),还包括对软硬中断处理、上下文切换、等待IO资源等。3 CPU使用率过高分析0629b456-d018-eb11-8da9-e4434bdf6706.gif线上CPU使用率/负载飙升,通过top、pidstat等命令一般可以快速定位到进程。那么如何进一步分析是哪段函数 或者哪些系统调用引起的呢?Linux上进程追踪和调试常见有gdb, strace, perf等等。

(1) GDB调试时经常需要中断程序执行(断点),以查看执行和上下文,对于线上作业难以接受;(2) strace和perf都支持运行时追踪。perf已经成为linux内置性能分析工具,相比strace功能更完善。

perf小试牛刀

17985# perf top –g –p 

可以追踪指定已运行进程的调用关系,最终定位到进程、函数段。

perf + FlameGraph还能生成火焰图,更直观、交互的分析程序性能

0e29b456-d018-eb11-8da9-e4434bdf6706.png

详细参考   http://www.brendangregg.com/flamegraphs.html

来左边跟我一起画个龙,在你终端画一道火焰红!想不到还能如此酷炫吧!

小胖还曾遇到过CPU使用率高却定位不到进程的情况?比如

# top
top - 12:05:48 up 99 days, 14:18, 1 user, load average: 2.48, 2.38, 2.23Tasks: 356 total, 2 running, 175 sleeping, 0 stopped, 0 zombie
Cpu(s): 83.2%us, 1.6%sy, 3.1%ni, 86.9%id, 4.4%wa, 0.0%hi, 3.9%si, 0.0%st
Mem: 65960848k total, 57092092k used, 8868756k free, 340300k buffers
Swap: 12582908k total, 3632460k used, 8950448k free, 1437352k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22248 www 20 0 191m 107m 6440 S 5.3 0.2 336:05.66 nginx
22249 www 20 0 179m 94m 6416 S 3.3 0.1 246:14.41 nginx

备注:此处top已按照进程cpu使用率排序
遇到这类奇怪问题,有一些思路可以尝试下:

(1) 首先使用其他性能分析命令如mpstat、ps等,排除命令自身问题;

(2) 仔细观察实时统计信息,比如top要打开线程统计,是否有频繁被调用、执行时间很短的外部程序占用了大量CPU资源;

(3) 仍未定位到,则检查系统日志/业务进程日志,是否存在异常。曾遇到过业务进程异常无法启动,被守护进程反复拉起崩溃导致占用大量CPU。

4 CPU优化常见方法0629b456-d018-eb11-8da9-e4434bdf6706.gif经过层层剖析,最终定位到性能问题的瓶颈后,小胖理了下思路,觉得不应该急着操作:

(1) 首先明确是硬件问题,还是软件问题,比如CPU是否开了节能模式、是否被锁频?IO慢导致iowait满载,通过更换高速硬盘、阵列缓存、程序内存缓冲区是否可以解决?而不是上来就动刀子;软件问题也需要针对应用程序排查日志、性能分析;

(2) 性能问题通常彼此关联,可能同时暴露多个性能问题,需要我们抓住核心矛盾;一个水桶无论多高,它盛水的高度取决于其中最低的那块木板;

(3) 实际优化以业务指标为导向,业务角度关注请求延迟、并发数等指标;运维角度关注CPU负载、使用率等指标!优化前后做好指标的量化和对比。回到CPU负载高本身,我们也从前辈处GET到一些切实可行的软优化手段:

(1) 优化中断:默认软中断由cpu0处理,通过启用irqbalance服务 或 配置smp_affinity,将中断分散到多个cpu核心上,比如针对网卡软中断优化;

(2) cpu绑定:将进程绑定到一个或者多个指定核上,提高cpu缓存命中率,减少上下文切换,最常见的是nginx cpu绑定

(3) nice调整:调整进程的nice值,提高核心业务进程的CPU优化级

(4) CGroup:基于内核cgroup功能来配额资源,包括CPU、内存等

(5) Numa优化:多CPU架构中,BIOS开启numa后,使用numactl来优化内存分配,让CPU尽可能只访问本地内存

看到这里,相信你和小胖一样已经对CPU负载、使用率的问题有了更深刻的认识!这些运维小彩蛋还有很多、藏得很深,如果有更好的思路经验,也可以寄信给小胖,一起学习酷炫!近期文章
  1. 图说k8s

  2. 推荐一款简单易用线上引流测试工具:GoReplay

  3. 从内心挣扎到豁然开朗,拥抱MySQL5.7!

  4. nginx的location if是如何工作的

  5. 基友的服务器又被黑了

  6. DevSecOps简述

END


全中国只有不到1% 的人关注了运维军团

你是个有眼光的人!

(由于交流群人数已超100人,需要进群的小伙伴可以添加运维小编的微信:)

1129b456-d018-eb11-8da9-e4434bdf6706.jpeg

如果你喜欢我们的文章,请转发到朋友圈

1329b456-d018-eb11-8da9-e4434bdf6706.jpeg 

1a29b456-d018-eb11-8da9-e4434bdf6706.jpeg1c29b456-d018-eb11-8da9-e4434bdf6706.jpeg 1e29b456-d018-eb11-8da9-e4434bdf6706.gif2029b456-d018-eb11-8da9-e4434bdf6706.png2329b456-d018-eb11-8da9-e4434bdf6706.png 公众号ywjtshare运维军团2529b456-d018-eb11-8da9-e4434bdf6706.png 专注运维技术与传承,分享丰富原创干货2629b456-d018-eb11-8da9-e4434bdf6706.jpeg2929b456-d018-eb11-8da9-e4434bdf6706.jpeg

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

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

相关文章

gui显示文本动态框

软件文本框,显示一些希望被阅读的文本; 包含main函数(kuang),gui作为子函数,以及必要的txt文件。 直接运行kuang函数即可。时间0.5秒内。 可以顺序显示希望输入的内容,并保存记录,如下 也可以每次只显示新…

redis5 外部不能连接_【硬见小百科】PCB连接的方法

PCB是电子产品的基本元器件,任何电子产品都需要PCB才能制成。那么,PCB在电子产品之中,必须要与其他器件相互连接在一起,这就是PCB的互连。总的来说,PCB的连接有三个方面:芯片到PCB、PCB内部、PCB与外部器件…

最小费用最大流问题

最小费用最大流问题 解决如下最小费用最大流问题。 以前的资源由于matlab版本问题等已不适用。现在做出修改,适用于matlab2014a以后的版本。 注意,数据格式按代码中的例子的格式,否则需要修改代码。 查了很多资源发现用MATLAB操作的好用的不多…

windows7无人值守应答文件.rar_数智化赋能人力共享运营,人力管理走向“无人值守”...

关键词:人力共享,HR,数智化,用友,NC Cloud,无人值守人力共享是近几年人力资源从业者持续关注的热点话题。无论是从效率提升、体验改进,还是助力人力资源角色转型,对人力共享能带来的…

iphone彻底删除照片如何恢复_手机删除的照片如何恢复?OPPO最新照片恢复

手机删除的照片如何恢复?小编给大家带来了OPPO最新照片恢复方法,可谓是专属福利啊!手机照片误删,焕发出来的照片很模糊?这有何难!手机照片管家APP竟然可以恢复高清图片, 不过现在安卓机只有OPPO…

社区发现SLPA算法

社区(community)定义:同一社区内的节点与节点之间关系紧密,而社区与社区之间的关系稀疏。 设图GG(V,E),所谓社区发现是指在图G中确定nc(>1)个社区C{C1,C2,...,Cnv},使得各社区的顶点集合构成V的一个覆盖。 若任意两个社区的顶点…

bucket sort sample sort 并行_MOOSE: 实现大规模并行多物理场仿真(二)

转载自wx公众号:CS guy来源于文章 MOOSE: Enabling massively parallel multiphysics simulation网址:https://www.sciencedirect.com/science/article/pii/S2352711019302973?via%3Dihub2.软件说明2.1 软件架构MOOSE旨在促进创建FEM工具,以…

iphone数据迁移到新iphone_Mac专业iPhone数据恢复软件----Omni Recover

Omni Recover mac是一个MacOS上的专业iPhone数据恢复软件,Omni Recover Mac版可以检索多达20多种类型的iOS数据,支持从iDevices恢复丢失的数据,轻松帮你找回数据,赶紧下载试试Omni Recove 激活版吧!软件介绍Omni Recov…

文档根元素 project 必须匹配 doctype 根 null_快评:全新MG5上市6.49万起,但买它必须准备10万?...

原标题:快评:全新MG5上市万起,但买它必须准备10万?上汽荣威新推出了一款A级轿车——MG5,售价万。上市前,我曾经在网上见过这款车的造型图,很有好感。所以当看到它的最低售价只有万时&#xff0c…

关于oracle sql语句查询时表名和字段名要加双引号的问题

oracle初学者一般会遇到这个问题。用navicat可视化创建了表,可是就是不能查到!后来发现②语句可以查询到①select * from user; 但是,我们如果给user加上双引号就可以查到了! ②select * from "user"; 难道oracle跟mysq…

模拟退火算法(代码可直接运行)

模拟退火算法(SA) 模拟退火是很经典的算法,针对大多数模型、应用,受限于SA运行时间长等特点,已不能直接应用SA,这样的算法值得去改进,我试图找一些缩短运行时间的方法,已经在测试&a…

fedora 33 topbar_最新!新增确诊病例33例,其中本土病例1例

【最新!新增确诊病例33例,其中本土病例1例】11月8日0-24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例33例,其中境外输入病例32例(上海13例,陕西6例,广东4例,四川4例&#xff0…

javaweb基础(40)_jdbc框架

一、元数据介绍 元数据指的是"数据库"、"表"、"列"的定义信息。 1.1、DataBaseMetaData元数据 Connection.getDatabaseMetaData()获得代表DatabaseMetaData元数据的DatabaseMetaData对象。  DataBaseMetaData对象的常用方法: getUR…

matlab运动目标检测

matlab运动目标检测最近做了运动目标检测的程序和GUI实现,参考了挺多博客,很多都是对数据格式要求比较高或者存在一定的bug(有些是因为版本不同),进行了一些修改。(2014以后的matlab都能运行)&a…

st-link v2怎么连接_三相交流电源的三角形和星形连接

相交流电是电能的一种输送形式,简称为三相电。三相交流电源,是由三个频率相同、振幅相等、相位依次互差120的交流电势组成的电源。我国发电厂和电力网生产、输送和分配的交流电都是三相交流电。1、三角形连接将三相电源的三个线圈,以一个线圈…

matlab程序聚类预测机器学习

matlabmatlab程序代做,数据挖掘,聚类,预测,分类,优化,建模。降重,降低重复率,24h出结果,最低1%重复。 机器学习,深度学习,神经网络代写&#xff0…

友益文书类似软件_团队成员分享 | 港中文翻译学姐:硬件不够,软件来凑;心之所愿,无所不能...

B学姐硬件不行的同学一定要努力提高自己对申请专业上的实习经验。饱腹诗书不够,也要有亲身实践后的体悟,这很加分。多对该行业背景现状进行思考,老师都喜欢有思想的学生,在后期面试也会给你带来惊喜。在读专业:港中文M…

iOS开发技巧,细节(二)

1.常量名称最好用static标识,例如下面的代码,包括其他一些只需要定义一次,之后不需要变化的变量也最好使用static static NSString *CellIdentifier "Cell"; 2.当设置视图控制器需要接受通知时,需要在dealloc取消监听 …

matlab支持向量机程序代做

matlab,支持向量机 回归,分类,都可以。另外决策树,神经网络都可以私人订制 **线性svm,二次svm,cubic svm

c++ qt5范例开发大全_使用yocto工具编译qt5.9.6总结

运行平台:OKMX6DL-C编译平台:Ubuntu 14.04.6 LTS编译工具:arm-poky-linux-gnueabi-gcc(gcc version 5.3.0 (GCC) )qt源码:qt-everywhere-opensource-src-5.9.6.tar.xz参考:嵌入式开发之Qt-5.9.6…