对于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. python-web微信实现

    1.url from django.conf.urls import url from django.contrib import admin from web import views urlpat ...

  2. python3对excel文件读写操作

    ===========================excelfile文件============================================ ================= ...

  3. 这可能是目前最新的 Vue 相关开源项目库汇总(转)

    访问地址:https://juejin.im/entry/58bf745fa22b9d0058895a58 原文链接:https://github.com/opendigg/awesome-githu ...

  4. Java 字符串拼接5种方式性能比较

    https://www.cnblogs.com/twzheng/p/5923642.html

  5. c/c++ 整数除预算保留小数

    两个整数相除会自动省略小数点后的小数位即使下面这种: int a,int b; int a = 4; int b = 3; double d = a/b; d= 1.0000000; -------- ...

  6. 剑指offer例题——链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 编程过程 此处采用两个指针依次后移的方法来求解,首先,用一个指针移到第k个位置,之后将第二个指针放在第一位,与第二个指针一同移动,当第二个指针移动 ...

  7. SSM商城项目(十)

    1.   学习计划 1.使用freemarker实现网页静态化 a)Freemarker的使用方法 b)Freemarker模板的语法 c)Freemarker整合springmvc 2.Active ...

  8. oracle sql developer怎么创建用户

    学习数据库的时候,用管理员账户,会有会有很多系统自创的表,很麻烦.所以要自己创建普通用户. create user 用户名 identified by 密码;--创建用户 grant connect, ...

  9. C++ 设置光标问题

    一.隐藏光标 1.引入头文件window.h 2.  定义光标信息结构体变量 CONSOLE_CURSOR_INFO  cursor info={1,0}; typedef struct _CONSO ...

  10. NodeJs学习相关网址

    node官方中文 https://nodejs.org/zh-cn/   Node.js 中文网 https://nodejs.org/zh-cn/   Node.js 教程 | 菜鸟教程 http: ...