对于cpu,目前比较关心的是cpu的利用率还有cpu的load,或者还有cpu运行队列。

cpu利用率

cpu利用率分为sys,us。分别为操作系统和用户进程所占用的cpu利用率。sys的占用,一般是进行内核操作,比如线程的调度,网络请求等操作。cpu利用率是指一段时间内,对cpu占用的时间比。比如30% ,如果是已1m为单位统计的,就是说1m内有60*0.3s的cpu占用。

通常来说,cpu利用率是越高越好,因为这意味着cpu资源可以充分被利用,计算任务可以快速被计算完成。当然这不是绝对的,也有可能是程序有问题,在空吃cpu,所以还是需要具体分析cpu到底在执行什么任务。放在线上服务的场景下,也并不意味着我们要把cpu的利用率达到很高,因为这意味着空闲cpu资源很少,如果线上有大的请求波动的话,会造成故障。

cpu的空闲可能有三个原因造成:

1. 线程在等待外部资源,比如网络返回。

2.线程被阻塞,比如在等锁的释放等。

3.线程真的很闲

查看cpu利用率方法:top , vmstat 1, top -p pid -H (可以查看一个进程下的线程的cpu占用)

cpu Load

cpuLoad是指一段时间内,cpu正在处理和等待处理的任务的总和(我认为至少不是进程维度的)。

一般来说,cpu的load不宜过大,最大不应该操作系统的内核数(逻辑cpu数, 逻辑cpu数=物理CPU个数 * 每个物理CPU的核心数 * 超线程数量)。因为load超过这个数的话,一般会导致cpu过于繁忙,可能会引起调度比较繁忙,造成性能下降。

查看load方法:top

查看cpu核数方法:

# 查看物理CPU个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

#查看每个物理CPU中的核心数

cat /proc/cpuinfo| grep "cpu cores"| uniq

#查看逻辑CPU的个数

cat /proc/cpuinfo| grep "processor"| wc -l

cpu运行队列

是指排队等待被调度的线程队列。不太清楚这个和load的区别,可能是一个东西。有关特性,可以看cpu load部分

查看方法:vmstat 1

cpuLoad和cpu利用率的关系

一般来说,cpuload高也会导致cpu的利用率高,但也有很大的例外。

CPU负载高利用率低:说明等待执行的任务很多,但是通常任务多CPU使用率也会比较高,如果低就说明CPU根本没工作,那些很多的任务处于等待状态,比如虽然有很多任务在等待执行,但是他们获得cpu的调度,在执行的时候,并没有进行什么实际的操作,比如直接把自己挂起或者直接进行io操作等。但是一般在这种情况下,load也应该是比较低的,所以需要查看下是否是进程僵死(这个我不理解是什么意思,但是还是记录一下,看以后会不会明白。可以通过命令ps –axjf查看是否存在D状态的进程,该状态时不可中断的睡眠状态。)或者程序有什么问题,比如在不停的创建新的线程来执行任务。

CPU利用率高负载低:说明任务少,但是任务执行时间长,有可能是程序本身有问题,如果没有问题那么计算完成后则利用率会下降。

提高/降低cpu利用率

在多线程的场景下,通常我们会使用固定大小的线程池来对任务进行处理。如果出现cpu利用率低的情况,很有可能的情况是,线程在大多数的时间都被阻塞了,比如锁等待或者io等待。在这种情况下,可以增加线程的数量,来提高cpu资源的利用率,当然也要考虑网卡的使用是否有瓶颈。当然,并不是说每次遇到这种情况,都应该直接增大线程数,造成cpu空闲的原因还有锁等待等因素,这种情况下增加线程也不会有理想的效果,应该首先分析如何消除同步的影响。

所以,线程池的设定,也可以通过考量在全负荷运转时,系统的load(cpu任务队列)还有cpu利用率来对线程池的线程数进行适当的调整。

比如,如果线程执行的任务本身对cpu的消耗比较高,大多都是cpu计算型的长任务,而且我们对线程池的线程数设的比较高,操作系统的表现就会是load很高,超过了cpu核数,而且cpu的利用率很高。这在线上的服务器是比较危险的,这时,在确认我们的程序没有问题的前提下,可以根据单个线程的cpu利用率来对线程数进行降低。如果因为程序本身的问题,导致了吃cpu,需要先解决程序中的问题。

其他

vmstat还可以看到上下文切换的次数,中断的次数,也是非常有用的指标,如下图中的cs表示每秒的context switch 数。in表示每秒的中断数,包括clock数。

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 124668 158788 246668 3298720 0 1 7 21 0 0 3 1 96 0 0
0 0 124668 158540 246668 3298832 0 0 0 29 3065 4529 3 1 96 0 0
0 0 124668 157648 246668 3299012 0 0 0 65 3306 4868 2 1 97 0 0

系统性能--CPU的更多相关文章

  1. MySQL自动化安装(双主多从读写分离)

    shell #!/bin/bash # Create by # version 1.0 # // # # check out lockfile whether or not exist IsInput ...

  2. nGrinder对监控机器收集自定义数据及源码分析

    转载:https://blog.csdn.net/neven7/article/details/50782451 0.背景 性能测试工具nGrinder支持在无需修改源码的情况下,对目标服务器收集自定 ...

  3. 性能测试工具 nGrinder 项目剖析及二次开发

    转:https://testerhome.com/topics/4225 0.背景 组内需要一款轻量级的性能测试工具,之前考虑过LR(太笨重,单实例,当然它的地位是不容置疑的),阿里云的PTS(htt ...

  4. 使用async-profiler简单分析zeebe 工作流引擎的性能

    刚开始的时候直接使用的系统暴露的prometheus metrics,发现越高的版本反而性能越差,期间使用过了 perf 打算使用perf 生成火焰图的,但是因为符号缺失,只找到了占用较高的任务,详细 ...

  5. day002-Linux基础之常用基本命令讲解

    Linux系统一切皆命令 命令1:pwd 显示当前所在目录命令2:cd(change directory) 切换目录 cd / 回到根目录 cd .. 返回上一级命令3:ls 查看当前目录下的文件 l ...

  6. 统计和分析系统性能【IO CPU 内存】的工具集合

    统计和分析系统性能[IO CPU 内存]的工具集合 blktrace http://www.oschina.net/p/blktrace 获取磁盘写入的信息 root@demo:~/install/p ...

  7. 系统性能调优CPU与内存

    CPU相关术语 处理器:插到系统插槽或者处理器版上的物理芯片,以核或者硬件线程的方式包含了一块或者多块CPU. 核:一颗多核处理器上的一个独立CPU实例.核的使用时处理器扩展的一种方式,有称为芯片级多 ...

  8. linux系统性能监控--CPU利用率

    在对系统的方法化分析中,首要且最基本的工具之一常常是对系统的 CPU利用率进行简单测量. Linux以及大多数基于 UNIX的操作系统都提供了一条命令来显示系统的平均负荷(loadaverage) . ...

  9. python之psutil模块(获取系统性能信息(CPU,内存,磁盘,网络)

    一.psutil模块 1. psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等) ...

随机推荐

  1. bresenhan算法数学推导

    //原帖http://www.doc88.com/p-612602414790.html

  2. how find out what is causing Visual Studio to think each project is out of date

    You can find out what is causing Visual Studio to think each project is out of date, and then addres ...

  3. Java内存泄漏的几种可能

    Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周期的对象持有短生命周期对象的引用就很可能发 ...

  4. MySQL - 用户变量

    MySQL用户变量:基于会话变量实现的,可以暂存值,并传递给同一连接里的下一条sql使用的变量,当客户端连接退出时,变量会被释放. MySQL用户变量应用场景:同一连接,未关闭情况下,帮你暂存一些计算 ...

  5. 32. linux下oracle数据库定时备份

    这里以oradatabak.sh(里面的内容要根据实际修改)脚本放在/u01/11g/datapump下为例: #1.添加脚本执行权限 chmod +x /u01/11g/datapump/orada ...

  6. oracle数据链接

    using System; using System.Collections.Generic; using System.Data; using System.Data.OracleClient; u ...

  7. MANIPULATION

    MANIPULATION Generalizations Congratulations! You learned how to use the command line to view and ma ...

  8. 面向对象的css less 和sass

    Css 初始化   reset.css      或者  normalise .   Near.css兼容IE6以及现代浏览器. Oocss  也就是面向对象的css         面向对象是将cs ...

  9. 记账本,C,Github,Dao

    package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSe ...

  10. https://segmentfault.com/a/1190000014637728

    原网站地址:https://segmentfault.com/a/1190000009657295#articleHeader3 基于 vue2 + element-ui 构建的后台管理系统 vue. ...